view mayachemtools/docs/modules/html/code/Matrix.html @ 3:e420415a1799 draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 12:16:47 -0500
parents 73ae111cf86f
children
line wrap: on
line source

<html>
<head>
<title>MayaChemTools:Code:Matrix.pm</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
</head>
<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
<br/>
<center>
<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
</center>
<br/>
<pre>
<a name="package-Matrix-"></a>   1 <span class="k">package </span><span class="i">Matrix</span><span class="sc">;</span>
   2 <span class="c">#</span>
   3 <span class="c"># $RCSfile: Matrix.pm,v $</span>
   4 <span class="c"># $Date: 2015/02/28 20:47:17 $</span>
   5 <span class="c"># $Revision: 1.16 $</span>
   6 <span class="c">#</span>
   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
   8 <span class="c">#</span>
   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
  10 <span class="c">#</span>
  11 <span class="c"># This file is part of MayaChemTools.</span>
  12 <span class="c">#</span>
  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
  16 <span class="c"># later version.</span>
  17 <span class="c">#</span>
  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
  21 <span class="c"># details.</span>
  22 <span class="c">#</span>
  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
  27 <span class="c">#</span>
  28 
  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
  32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  33 <span class="k">use</span> <span class="w">Vector</span><span class="sc">;</span>
  34 
  35 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
  36 
  37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
  38 <span class="i">@EXPORT</span> = <span class="q">qw(IsMatrix IdentityMatrix NewFromRows NewFromColumns NewFromDiagonal UnitMatrix ZeroMatrix)</span><span class="sc">;</span>
  39 <span class="i">@EXPORT_OK</span> = <span class="q">qw(SetValuePrintFormat)</span><span class="sc">;</span>
  40 
  41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span>
  42                 <span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span>
  43                <span class="s">)</span><span class="sc">;</span>
  44 
  45 <span class="c"># Setup class variables...</span>
  46 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ValueFormat</span><span class="cm">,</span> <span class="i">$MatrixPrintStyle</span><span class="s">)</span><span class="sc">;</span>
  47 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
  48 
  49 <span class="c">#</span>
  50 <span class="c"># Using the following explicity overloaded operators, Perl automatically generates methods</span>
  51 <span class="c"># for operations with no explicitly defined methods. Autogenerated methods are possible for</span>
  52 <span class="c"># these operators:</span>
  53 <span class="c">#</span>
  54 <span class="c">#    o Arithmetic operators: += -= *= /= **= %= ++ -- x= .=</span>
  55 <span class="c">#    o Increment and decrement: ++ --</span>
  56 <span class="c">#</span>
  57 <span class="c"># &#39;fallback&#39; is set to &#39;false&#39; to raise exception for all other operators.</span>
  58 <span class="c">#</span>
  59 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyMatrix&#39;</span><span class="cm">,</span>
  60 
  61   <span class="q">&#39;@{}&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixToArrayOperator&#39;</span><span class="cm">,</span>
  62 
  63   <span class="q">&#39;+&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixAdditionOperator&#39;</span><span class="cm">,</span>
  64   <span class="q">&#39;-&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSubtractionOperator&#39;</span><span class="cm">,</span>
  65   <span class="q">&#39;*&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixMultiplicationOperator&#39;</span><span class="cm">,</span>
  66   <span class="q">&#39;/&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixDivisionOperator&#39;</span><span class="cm">,</span>
  67   <span class="q">&#39;**&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixExponentiationOperator&#39;</span><span class="cm">,</span>
  68   <span class="q">&#39;%&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixModulusOperator&#39;</span><span class="cm">,</span>
  69 
  70   <span class="q">&#39;bool&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixBooleanOperator&#39;</span><span class="cm">,</span>
  71   <span class="q">&#39;!&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNotBooleanOperator&#39;</span><span class="cm">,</span>
  72 
  73   <span class="q">&#39;==&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixEqualOperator&#39;</span><span class="cm">,</span>
  74   <span class="q">&#39;!=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNotEqualOperator&#39;</span><span class="cm">,</span>
  75   <span class="q">&#39;&lt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLessThanOperator&#39;</span><span class="cm">,</span>
  76   <span class="q">&#39;&lt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLessThanEqualOperator&#39;</span><span class="cm">,</span>
  77   <span class="q">&#39;&gt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixGreatarThanOperator&#39;</span><span class="cm">,</span>
  78   <span class="q">&#39;&gt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixGreatarThanEqualOperator&#39;</span><span class="cm">,</span>
  79 
  80   <span class="q">&#39;neg&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNegativeValueOperator&#39;</span><span class="cm">,</span>
  81 
  82   <span class="q">&#39;abs&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixAbsoluteValueOperator&#39;</span><span class="cm">,</span>
  83   <span class="q">&#39;exp&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixExpNaturalBaseOperator&#39;</span><span class="cm">,</span>
  84   <span class="q">&#39;log&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLogNaturalBaseOperator&#39;</span><span class="cm">,</span>
  85   <span class="q">&#39;sqrt&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSquareRootOperator&#39;</span><span class="cm">,</span>
  86   <span class="q">&#39;cos&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixCosineOperator&#39;</span><span class="cm">,</span>
  87   <span class="q">&#39;sin&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSineOperator&#39;</span><span class="cm">,</span>
  88 
  89   <span class="q">&#39;fallback&#39;</span> <span class="cm">=&gt;</span> <span class="k">undef</span><span class="sc">;</span>
  90 
  91 <span class="c"># Class constructor...</span>
<a name="new-"></a>  92 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
  93   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
  94 
  95   <span class="c"># Initialize object...</span>
  96   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
  97   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
  98   <span class="i">$This</span><span class="i">-&gt;_InitializeMatrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
  99 
 100   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 101 <span class="s">}</span>
 102 
 103 <span class="c"># Initialize object data...</span>
 104 <span class="c">#</span>
<a name="_InitializeMatrix-"></a> 105 <span class="k">sub </span><span class="m">_InitializeMatrix</span> <span class="s">{</span>
 106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 107 
 108   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 109     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_InitializeMatrix: NumOfRows and NumOfCols must be specified...&quot;</span><span class="sc">;</span>
 110   <span class="s">}</span>
 111   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="s">(</span><span class="i">$NumOfRows</span> &gt; <span class="n">0</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">$NumOfRows</span> &gt; <span class="n">0</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 112     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_InitializeMatrix: NumOfRows and NumOfCols must be a positive number...&quot;</span><span class="sc">;</span>
 113   <span class="s">}</span>
 114   <span class="c"># Initialize matrix elements to zero...</span>
 115   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 116 
 117   <span class="k">my</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@EmptyRow</span><span class="s">)</span><span class="sc">;</span>
 118 
 119   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 120   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="q">&#39;0&#39;</span><span class="s">)</span> x <span class="i">$NumOfCols</span><span class="sc">;</span>
 121 
 122   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 123     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 124     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@EmptyRow</span><span class="sc">;</span>
 125   <span class="s">}</span>
 126 <span class="s">}</span>
 127 
 128 <span class="c"># Initialize class ...</span>
<a name="_InitializeClass-"></a> 129 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
 130   <span class="c">#Class name...</span>
 131   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
 132 
 133   <span class="c"># Print style for matrix rows during StringifyMatrix operation.</span>
 134   <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine</span>
 135   <span class="c">#</span>
 136   <span class="i">$MatrixPrintStyle</span> = <span class="q">&quot;AllRowsInOneLine&quot;</span><span class="sc">;</span>
 137 
 138   <span class="c"># Print format for matrix values...</span>
 139   <span class="i">$ValueFormat</span> = <span class="q">&quot;%g&quot;</span><span class="sc">;</span>
 140 <span class="s">}</span>
 141 
 142 <span class="c"># Get matrix size...</span>
 143 <span class="c">#</span>
<a name="GetSize-"></a> 144 <span class="k">sub </span><span class="m">GetSize</span> <span class="s">{</span>
 145   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 146 
 147   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
 148 <span class="s">}</span>
 149 
 150 <span class="c"># Get matrix dimensions...</span>
 151 <span class="c">#</span>
<a name="GetDimension-"></a> 152 <span class="k">sub </span><span class="m">GetDimension</span> <span class="s">{</span>
 153   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 154 
 155   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 156 <span class="s">}</span>
 157 
 158 <span class="c"># Get number of rows in matrix</span>
 159 <span class="c">#</span>
<a name="GetNumOfRows-"></a> 160 <span class="k">sub </span><span class="m">GetNumOfRows</span> <span class="s">{</span>
 161   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 162   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
 163 
 164   <span class="c"># Size of row array...</span>
 165   <span class="i">$NumOfRows</span> = <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} + <span class="n">1</span><span class="sc">;</span>
 166 
 167   <span class="k">return</span> <span class="i">$NumOfRows</span><span class="sc">;</span>
 168 <span class="s">}</span>
 169 
 170 <span class="c"># Get number of columns in matrix</span>
 171 <span class="c">#</span>
<a name="GetNumOfColumns-"></a> 172 <span class="k">sub </span><span class="m">GetNumOfColumns</span> <span class="s">{</span>
 173   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 174   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 175 
 176   <span class="c"># Size of column array for first row assuming sizes of columns are same...</span>
 177   <span class="i">$NumOfCols</span> = <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="n">0</span>]} + <span class="n">1</span><span class="sc">;</span>
 178 
 179   <span class="k">return</span> <span class="i">$NumOfCols</span><span class="sc">;</span>
 180 <span class="s">}</span>
 181 
 182 <span class="c"># Get reference to array holding matrix values in order to directly manipulate these values...</span>
 183 <span class="c">#</span>
<a name="GetMatrixValuesReference-"></a> 184 <span class="k">sub </span><span class="m">GetMatrixValuesReference</span> <span class="s">{</span>
 185   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 186 
 187   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
 188 <span class="s">}</span>
 189 
 190 <span class="c"># Copy matrix...</span>
 191 <span class="c">#</span>
<a name="Copy-"></a> 192 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
 193   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 194   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
 195 
 196   <span class="c"># Create a new matrix...</span>
 197   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 198   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 199 
 200   <span class="c"># Set matrix values...</span>
 201   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 202     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 203       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 204     <span class="s">}</span>
 205   <span class="s">}</span>
 206   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
 207 <span class="s">}</span>
 208 
 209 <span class="c"># Create a new matrix using rows specified in one of the following formats:</span>
 210 <span class="c">#   o List of vector objects</span>
 211 <span class="c">#   o References to list of values</span>
 212 <span class="c">#   o List of strings containing row values delimited by space</span>
 213 <span class="c">#</span>
 214 <span class="c"># Each row must contain the same number of values.</span>
 215 <span class="c">#</span>
 216 <span class="c"># This functionality can be either invoked as a class function or an</span>
 217 <span class="c"># object method.</span>
 218 <span class="c">#</span>
<a name="NewFromRows-"></a> 219 <span class="k">sub </span><span class="m">NewFromRows</span> <span class="s">{</span>
 220   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 221 
 222   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 223     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromRows&#39;</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
 224   <span class="s">}</span>
 225   <span class="k">else</span> <span class="s">{</span>
 226     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromRows&#39;</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 227   <span class="s">}</span>
 228 <span class="s">}</span>
 229 
 230 <span class="c"># Create a new matrix using columns specified in one of the following formats:</span>
 231 <span class="c">#   o List of vector objects</span>
 232 <span class="c">#   o References to list of values</span>
 233 <span class="c">#   o List of strings containing columns values delimited by space</span>
 234 <span class="c">#</span>
 235 <span class="c"># Each columns must contain the same number of values.</span>
 236 <span class="c">#</span>
 237 <span class="c"># This functionality can be either invoked as a class function or an</span>
 238 <span class="c"># object method.</span>
 239 <span class="c">#</span>
<a name="NewFromColumns-"></a> 240 <span class="k">sub </span><span class="m">NewFromColumns</span> <span class="s">{</span>
 241   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 242 
 243   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 244     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromColumns&#39;</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
 245   <span class="s">}</span>
 246   <span class="k">else</span> <span class="s">{</span>
 247     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromColumns&#39;</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 248   <span class="s">}</span>
 249 <span class="s">}</span>
 250 
 251 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span>
 252 <span class="c">#   o A vector object</span>
 253 <span class="c">#   o Reference to list of values</span>
 254 <span class="c">#   o Strings containing diagonal values delimited by space</span>
 255 <span class="c">#</span>
 256 <span class="c"># This functionality can be either invoked as a class function or an</span>
 257 <span class="c"># object method.</span>
 258 <span class="c">#</span>
<a name="NewFromDiagonal-"></a> 259 <span class="k">sub </span><span class="m">NewFromDiagonal</span> <span class="s">{</span>
 260   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 261 
 262   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 263     <span class="k">return</span> <span class="i">_NewFromDiagonal</span><span class="s">(</span><span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
 264   <span class="s">}</span>
 265   <span class="k">else</span> <span class="s">{</span>
 266     <span class="k">return</span> <span class="i">_NewFromDiagonal</span><span class="s">(</span><span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
 267   <span class="s">}</span>
 268 <span class="s">}</span>
 269 
 270 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span>
 271 <span class="c">#   o A vector object</span>
 272 <span class="c">#   o Reference to list of values</span>
 273 <span class="c">#   o Strings containing diagonal values delimited by space</span>
 274 <span class="c">#</span>
<a name="_NewFromDiagonal-"></a> 275 <span class="k">sub </span><span class="m">_NewFromDiagonal</span> <span class="s">{</span>
 276   <span class="k">my</span><span class="s">(</span><span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 277   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$DiagonalValuesRef</span><span class="s">)</span><span class="sc">;</span>
 278 
 279   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromDiagonal&quot;</span><span class="sc">;</span>
 280   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span>
 281     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No diagonal values specified...&quot;</span><span class="sc">;</span>
 282   <span class="s">}</span>
 283 
 284   <span class="c"># Collect specified diagonal values...</span>
 285   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
 286   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
 287   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
 288 
 289   <span class="c"># Create a new matrix...</span>
 290   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 291 
 292   <span class="i">$NumOfRows</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span>
 293   <span class="i">$NumOfCols</span> = <span class="i">$NumOfRows</span><span class="sc">;</span>
 294 
 295   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 296 
 297   <span class="c"># Set diagonal values...</span>
 298   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 299     <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
 300   <span class="s">}</span>
 301 
 302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
 303 <span class="s">}</span>
 304 
 305 <span class="c"># Create a new matrix using rows or columns specified in one of the following formats:</span>
 306 <span class="c">#   o List of vector objects</span>
 307 <span class="c">#   o References to list of values</span>
 308 <span class="c">#   o List of strings containing row values delimited by space</span>
 309 <span class="c">#</span>
 310 <span class="c"># Each row or column must contain the same number of values.</span>
 311 <span class="c">#</span>
<a name="_NewFromRowsOrColumns-"></a> 312 <span class="k">sub </span><span class="m">_NewFromRowsOrColumns</span> <span class="s">{</span>
 313   <span class="k">my</span><span class="s">(</span><span class="i">$Mode</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 314 
 315   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(FromRows|FromColumns)$/i</span><span class="s">)</span> <span class="s">{</span>
 316     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::_NewFromRowsOrColumns: Unknown mode: $Mode...&quot;</span><span class="sc">;</span>
 317   <span class="s">}</span>
 318   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="s">)</span><span class="sc">;</span>
 319 
 320   <span class="c"># Retrieve information about specified values and make sure similar number of values</span>
 321   <span class="c"># are specified for each row or column...</span>
 322   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromRows$/i</span><span class="s">)</span> <span class="s">{</span>
 323     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromRows&quot;</span><span class="sc">;</span>
 324   <span class="s">}</span>
 325   <span class="k">else</span> <span class="s">{</span>
 326     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromColumns&quot;</span><span class="sc">;</span>
 327   <span class="s">}</span>
 328   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
 329   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
 330 
 331   <span class="c"># Create a new matrix...</span>
 332   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$RowMode</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 333 
 334   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromRows$/i</span><span class="s">)</span> <span class="s">{</span>
 335     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span>
 336     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
 337     <span class="i">$RowMode</span> = <span class="n">1</span><span class="sc">;</span>
 338   <span class="s">}</span>
 339   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromColumns$/i</span><span class="s">)</span> <span class="s">{</span>
 340     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
 341     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span>
 342     <span class="i">$RowMode</span> = <span class="n">0</span><span class="sc">;</span>
 343   <span class="s">}</span>
 344   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 345 
 346   <span class="c"># Setup matrix values...</span>
 347   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 348     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 349       <span class="i">$Value</span> = <span class="i">$RowMode</span> ? <span class="i">$ValuesRefs</span>-&gt;[<span class="i">$RowIndex</span>]-&gt;[<span class="i">$ColIndex</span>]<span class="co">:</span> <span class="i">$ValuesRefs</span>-&gt;[<span class="i">$ColIndex</span>]-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
 350       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
 351     <span class="s">}</span>
 352   <span class="s">}</span>
 353 
 354   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
 355 <span class="s">}</span>
 356 
 357 <span class="c"># Process specified matrix values in any of the following supported formats:</span>
 358 <span class="c">#</span>
 359 <span class="c">#   o List of vector objects</span>
 360 <span class="c">#   o References to list of values</span>
 361 <span class="c">#   o List of strings containing row values delimited by space</span>
 362 <span class="c">#</span>
 363 <span class="c"># And return a reference to an array containing references to arrays with specified values.</span>
 364 <span class="c">#</span>
 365 <span class="c"># Value of CombineValuesStatus determines whether all the values specified are combined</span>
 366 <span class="c"># into one array and return its reference as the only entry in the array being returned.</span>
 367 <span class="c">#</span>
<a name="_ProcessSpecifiedMatrixValues-"></a> 368 <span class="k">sub </span><span class="m">_ProcessSpecifiedMatrixValues</span> <span class="s">{</span>
 369   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizesStatus</span><span class="cm">,</span> <span class="i">$CombineValuesStatus</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 370   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">$TypeOfValue</span><span class="cm">,</span> <span class="i">@ValuesRefs</span><span class="s">)</span><span class="sc">;</span>
 371 
 372   <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 373   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedValues</span><span class="s">)</span> <span class="s">{</span>
 374     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No values specified...&quot;</span><span class="sc">;</span>
 375   <span class="s">}</span>
 376 
 377   <span class="c"># Collect values...</span>
 378   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@SpecifiedValues</span><span class="s">)</span> <span class="s">{</span>
 379     <span class="i">$TypeOfValue</span> = <span class="k">ref</span> <span class="i">$Value</span><span class="sc">;</span>
 380 
 381     <span class="k">if</span> <span class="s">(</span><span class="i">Vector::IsVector</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 382       <span class="c"># Feference to vector object...</span>
 383       <span class="k">my</span><span class="s">(</span><span class="i">$ValuesRef</span><span class="s">)</span><span class="sc">;</span>
 384       <span class="i">$ValuesRef</span> = <span class="i">$Value</span><span class="i">-&gt;GetValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 385       <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="s">)</span> <span class="s">{</span>
 386         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified vector object must contain some values...&quot;</span><span class="sc">;</span>
 387       <span class="s">}</span>
 388       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$ValuesRef</span><span class="sc">;</span>
 389     <span class="s">}</span>
 390     <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
 391       <span class="c"># Refernece to an array...</span>
 392       <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
 393         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified array reference must contain some values...&quot;</span><span class="sc">;</span>
 394       <span class="s">}</span>
 395       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
 396     <span class="s">}</span>
 397     <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfValue</span> <span class="k">eq</span> <span class="q">&#39;&#39;</span><span class="s">)</span> <span class="s">{</span>
 398       <span class="c"># String value...</span>
 399       <span class="k">my</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 400       <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 401       <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
 402         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified string must contain some values...&quot;</span><span class="sc">;</span>
 403       <span class="s">}</span>
 404       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span>
 405     <span class="s">}</span>
 406     <span class="k">else</span> <span class="s">{</span>
 407       <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Value format, $TypeOfValue, of a specified value to be added to matrix object is not supported...&quot;</span><span class="sc">;</span>
 408     <span class="s">}</span>
 409   <span class="s">}</span>
 410 
 411   <span class="c"># Combine all specified values into one array...</span>
 412   <span class="k">if</span> <span class="s">(</span><span class="i">$CombineValuesStatus</span><span class="s">)</span> <span class="s">{</span>
 413     <span class="k">my</span><span class="s">(</span><span class="i">$ValuesRef</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 414 
 415     <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 416     <span class="k">for</span> <span class="i">$ValuesRef</span> <span class="s">(</span><span class="i">@ValuesRefs</span><span class="s">)</span> <span class="s">{</span>
 417       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span>
 418     <span class="s">}</span>
 419     <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 420     <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span>
 421   <span class="s">}</span>
 422 
 423   <span class="c"># Make sure reference to all specified value arrays contain the same number of values...</span>
 424   <span class="k">if</span> <span class="s">(</span><span class="i">$CheckSizesStatus</span><span class="s">)</span> <span class="s">{</span>
 425     <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$FirstValueSize</span><span class="s">)</span><span class="sc">;</span>
 426     <span class="i">$FirstValueSize</span> = <span class="i">$#</span>{<span class="i">$ValuesRefs</span>[<span class="n">0</span>]}<span class="sc">;</span>
 427     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#ValuesRefs</span><span class="s">)</span> <span class="s">{</span>
 428       <span class="k">if</span> <span class="s">(</span><span class="i">$FirstValueSize</span> != <span class="i">$#</span>{<span class="i">$ValuesRefs</span>[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
 429         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified value type to be added to matrix object must be same...&quot;</span><span class="sc">;</span>
 430       <span class="s">}</span>
 431     <span class="s">}</span>
 432   <span class="s">}</span>
 433 
 434   <span class="k">return</span> \<span class="i">@ValuesRefs</span><span class="sc">;</span>
 435 <span class="s">}</span>
 436 
 437 <span class="c"># Create a new zero matrix of specified size or default size of 3 x 3.</span>
 438 <span class="c">#</span>
 439 <span class="c"># This functionality can be either invoked as a class function or an</span>
 440 <span class="c"># object method.</span>
 441 <span class="c">#</span>
<a name="ZeroMatrix-"></a> 442 <span class="k">sub </span><span class="m">ZeroMatrix (;$$$)</span> <span class="s">{</span>
 443   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 444   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
 445 
 446   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span>
 447   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span> &amp;&amp; <span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 448     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
 449   <span class="s">}</span>
 450   <span class="k">else</span> <span class="s">{</span>
 451     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 452   <span class="s">}</span>
 453   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="n">3</span><span class="cm">,</span> <span class="n">3</span><span class="s">)</span><span class="sc">;</span>
 454 
 455   <span class="c"># Set up a new zero matrix</span>
 456   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 457 
 458   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
 459 <span class="s">}</span>
 460 
 461 <span class="c"># Create a new unit matrix of specified size or default size of 3 x 3.</span>
 462 <span class="c">#</span>
 463 <span class="c"># This functionality can be either invoked as a class function or an</span>
 464 <span class="c"># object method.</span>
 465 <span class="c">#</span>
<a name="UnitMatrix-"></a> 466 <span class="k">sub </span><span class="m">UnitMatrix (;$$$)</span> <span class="s">{</span>
 467   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 468   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 469 
 470   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span>
 471   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span> &amp;&amp; <span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 472     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
 473   <span class="s">}</span>
 474   <span class="k">else</span> <span class="s">{</span>
 475     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
 476   <span class="s">}</span>
 477   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="n">3</span><span class="cm">,</span> <span class="n">3</span><span class="s">)</span><span class="sc">;</span>
 478 
 479   <span class="c"># Set up a new zero matrix</span>
 480   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
 481 
 482   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
 483     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}::UnitMatrix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
 484   <span class="s">}</span>
 485 
 486   <span class="c"># Initialize diagonal elements to 1...</span>
 487   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 488     <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="n">1.0</span><span class="sc">;</span>
 489   <span class="s">}</span>
 490 
 491   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
 492 <span class="s">}</span>
 493 
 494 <span class="c"># Identity matrix of specified size or size 3 x 3...</span>
 495 <span class="c">#</span>
<a name="IdentityMatrix-"></a> 496 <span class="k">sub </span><span class="m">IdentityMatrix (;$$$)</span> <span class="s">{</span>
 497   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 498 
 499   <span class="k">return</span> <span class="i">UnitMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
 500 <span class="s">}</span>
 501 
 502 <span class="c"># Set all matrix values to 0s...</span>
 503 <span class="c">#</span>
<a name="Zero-"></a> 504 <span class="k">sub </span><span class="m">Zero</span> <span class="s">{</span>
 505   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 506 
 507   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;SetAllValues</span><span class="s">(</span><span class="n">0.0</span><span class="s">)</span><span class="sc">;</span>
 508 <span class="s">}</span>
 509 
 510 <span class="c"># Set all matrix values to 1s...</span>
 511 <span class="c">#</span>
<a name="One-"></a> 512 <span class="k">sub </span><span class="m">One</span> <span class="s">{</span>
 513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 514 
 515   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;SetAllValues</span><span class="s">(</span><span class="n">1.0</span><span class="s">)</span><span class="sc">;</span>
 516 <span class="s">}</span>
 517 
 518 <span class="c"># Get a matrix value with row and column indicies starting from 0...</span>
 519 <span class="c">#</span>
<a name="GetValue-"></a> 520 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span>
 521   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$SkipIndexCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 522 
 523   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span>
 524     <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 525   <span class="s">}</span>
 526 
 527   <span class="i">$This</span><span class="i">-&gt;_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">&quot;Error: ${ClassName}::GetValue&quot;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 528 
 529   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 530 <span class="s">}</span>
 531 
 532 <span class="c"># Get a matrix value...</span>
 533 <span class="c">#</span>
<a name="_GetValue-"></a> 534 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span>
 535   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 536 
 537   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 538 <span class="s">}</span>
 539 
 540 <span class="c"># Set a matrix value with row and column indicies starting from 0...</span>
 541 <span class="c">#</span>
<a name="SetValue-"></a> 542 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span>
 543   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipIndexCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 544 
 545   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span>
 546     <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 547   <span class="s">}</span>
 548 
 549   <span class="i">$This</span><span class="i">-&gt;_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">&quot;Error: ${ClassName}::SetValue&quot;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 550 
 551   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
 552 <span class="s">}</span>
 553 
 554 <span class="c"># Set a matrix value...</span>
 555 <span class="c">#</span>
<a name="_SetValue-"></a> 556 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span>
 557   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 558 
 559   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
 560 
 561   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 562 <span class="s">}</span>
 563 
 564 <span class="c"># Set all matrix values to a specified value...</span>
 565 <span class="c">#</span>
<a name="SetAllValues-"></a> 566 <span class="k">sub </span><span class="m">SetAllValues</span> <span class="s">{</span>
 567   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 568   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 569 
 570   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 571   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 572     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 573       <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
 574     <span class="s">}</span>
 575   <span class="s">}</span>
 576   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 577 <span class="s">}</span>
 578 
 579 <span class="c"># Set values of a row in a matrix value with row index starting from 0...</span>
 580 <span class="c">#</span>
<a name="SetRowValues-"></a> 581 <span class="k">sub </span><span class="m">SetRowValues</span> <span class="s">{</span>
 582   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 583   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$RowValuesRef</span><span class="cm">,</span> <span class="i">$NumOfRowValues</span><span class="s">)</span><span class="sc">;</span>
 584 
 585   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetRowValues&quot;</span><span class="sc">;</span>
 586 
 587   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 588   <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 589 
 590   <span class="c"># Collect specified row values...</span>
 591   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
 592   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
 593   <span class="i">$RowValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
 594 
 595   <span class="c"># Check number of specified row values...</span>
 596   <span class="i">$NumOfRowValues</span> = <span class="i">@</span>{<span class="i">$RowValuesRef</span>}<span class="sc">;</span>
 597   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRowValues</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
 598     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of specified row values, $NumOfRowValues, must be equal to number of row values, $NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
 599   <span class="s">}</span>
 600 
 601   <span class="c"># Set row values...</span>
 602   <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRowValues</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 603     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$RowValuesRef</span>-&gt;[<span class="i">$ColIndex</span>]<span class="sc">;</span>
 604   <span class="s">}</span>
 605   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 606 <span class="s">}</span>
 607 
 608 <span class="c"># Add new row values to a matrix...</span>
 609 <span class="c">#</span>
<a name="AddRowValues-"></a> 610 <span class="k">sub </span><span class="m">AddRowValues</span> <span class="s">{</span>
 611   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 612   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$RowValueRef</span><span class="cm">,</span> <span class="i">$RowValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfNewRows</span><span class="cm">,</span> <span class="i">$NumOfNewCols</span><span class="s">)</span><span class="sc">;</span>
 613 
 614   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;AddRowValues&quot;</span><span class="sc">;</span>
 615 
 616   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 617 
 618   <span class="c"># Collect specified row values...</span>
 619   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
 620   <span class="i">$RowValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
 621 
 622   <span class="c"># Check number of specified row values...</span>
 623   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>}<span class="sc">;</span>
 624   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
 625 
 626   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNewCols</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
 627     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified row, $NumOfNewCols, must be equal to number of row values, $NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
 628   <span class="s">}</span>
 629 
 630   <span class="c"># Add each row to the matrix...</span>
 631   <span class="i">$RowIndex</span> = <span class="i">$NumOfRows</span> - <span class="n">1</span><span class="sc">;</span>
 632   <span class="k">for</span> <span class="i">$RowValueRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RowValuesRefs</span>}<span class="s">)</span> <span class="s">{</span>
 633     <span class="i">$RowIndex</span>++<span class="sc">;</span>
 634     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@</span>{<span class="i">$RowValueRef</span>}<span class="sc">;</span>
 635   <span class="s">}</span>
 636 
 637   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 638 <span class="s">}</span>
 639 
 640 <span class="c"># Get values of a row in matrix as an array. In scalar context, number of row</span>
 641 <span class="c"># values is returned...</span>
 642 <span class="c">#</span>
<a name="GetRowValues-"></a> 643 <span class="k">sub </span><span class="m">GetRowValues</span> <span class="s">{</span>
 644   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 645 
 646   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 647 <span class="s">}</span>
 648 
 649 <span class="c"># Get values of a row in matrix as a vector object...</span>
 650 <span class="c">#</span>
<a name="GetRowValuesAsVector-"></a> 651 <span class="k">sub </span><span class="m">GetRowValuesAsVector</span> <span class="s">{</span>
 652   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 653 
 654   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 655 <span class="s">}</span>
 656 
 657 <span class="c"># Get values of a row as row matrix object...</span>
 658 <span class="c">#</span>
<a name="GetRowValuesAsRowMatrix-"></a> 659 <span class="k">sub </span><span class="m">GetRowValuesAsRowMatrix</span> <span class="s">{</span>
 660   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 661 
 662   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 663 <span class="s">}</span>
 664 
 665 <span class="c"># Get values of a row as column matrix object...</span>
 666 <span class="c">#</span>
<a name="GetRowValuesAsColumnMatrix-"></a> 667 <span class="k">sub </span><span class="m">GetRowValuesAsColumnMatrix</span> <span class="s">{</span>
 668   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 669 
 670   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 671 <span class="s">}</span>
 672 
 673 <span class="c"># Get values of a row in matrix as a space delimited string...</span>
 674 <span class="c">#</span>
<a name="GetRowValuesAsString-"></a> 675 <span class="k">sub </span><span class="m">GetRowValuesAsString</span> <span class="s">{</span>
 676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 677 
 678   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 679 <span class="s">}</span>
 680 
 681 <span class="c"># Set values of a column in a matrix value with row index starting from 0...</span>
 682 <span class="c">#</span>
<a name="SetColumnValues-"></a> 683 <span class="k">sub </span><span class="m">SetColumnValues</span> <span class="s">{</span>
 684   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 685   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$ColValuesRef</span><span class="cm">,</span> <span class="i">$NumOfColValues</span><span class="s">)</span><span class="sc">;</span>
 686 
 687   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetColumnValues&quot;</span><span class="sc">;</span>
 688 
 689   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 690   <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 691 
 692   <span class="c"># Collect specified row values...</span>
 693   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
 694   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
 695   <span class="i">$ColValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
 696 
 697   <span class="c"># Check number of specified col values...</span>
 698   <span class="i">$NumOfColValues</span> = <span class="i">@</span>{<span class="i">$ColValuesRef</span>}<span class="sc">;</span>
 699   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfColValues</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
 700     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of specified col values, $NumOfColValues, must be equal to number of column values, $NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
 701   <span class="s">}</span>
 702 
 703   <span class="c"># Set col values...</span>
 704   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfColValues</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 705     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
 706   <span class="s">}</span>
 707   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 708 <span class="s">}</span>
 709 
 710 <span class="c"># Add new column values to a matrix...</span>
 711 <span class="c">#</span>
<a name="AddColumnValues-"></a> 712 <span class="k">sub </span><span class="m">AddColumnValues</span> <span class="s">{</span>
 713   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 714   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ColValueRef</span><span class="cm">,</span> <span class="i">$ColValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfNewRows</span><span class="cm">,</span> <span class="i">$NumOfNewCols</span><span class="s">)</span><span class="sc">;</span>
 715 
 716   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;AddColumnValues&quot;</span><span class="sc">;</span>
 717 
 718   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 719 
 720   <span class="c"># Collect specified column values...</span>
 721   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
 722   <span class="i">$ColValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
 723 
 724   <span class="c"># Check number of specified column values...</span>
 725   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>}<span class="sc">;</span>
 726   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
 727 
 728   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNewRows</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
 729     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified column, $NumOfNewRows, must be equal to number of column values, $NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
 730   <span class="s">}</span>
 731 
 732   <span class="c"># Add each column to the matrix...</span>
 733   <span class="i">$ColIndex</span> = <span class="i">$NumOfCols</span> - <span class="n">1</span><span class="sc">;</span>
 734   <span class="k">for</span> <span class="i">$ColValueRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ColValuesRefs</span>}<span class="s">)</span> <span class="s">{</span>
 735     <span class="i">$ColIndex</span>++<span class="sc">;</span>
 736     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 737       <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValueRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
 738     <span class="s">}</span>
 739   <span class="s">}</span>
 740 
 741   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 742 <span class="s">}</span>
 743 
 744 <span class="c"># Get values of a column in matrix as an array. In scalar context, number of column</span>
 745 <span class="c"># values is returned...</span>
 746 <span class="c">#</span>
<a name="GetColumnValues-"></a> 747 <span class="k">sub </span><span class="m">GetColumnValues</span> <span class="s">{</span>
 748   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 749 
 750   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 751 <span class="s">}</span>
 752 
 753 <span class="c"># Get values of a column in matrix as a vector object...</span>
 754 <span class="c">#</span>
<a name="GetColumnValuesAsVector-"></a> 755 <span class="k">sub </span><span class="m">GetColumnValuesAsVector</span> <span class="s">{</span>
 756   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 757 
 758   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 759 <span class="s">}</span>
 760 
 761 <span class="c"># Get values of a column as row matrix object...</span>
 762 <span class="c">#</span>
<a name="GetColumnValuesAsRowMatrix-"></a> 763 <span class="k">sub </span><span class="m">GetColumnValuesAsRowMatrix</span> <span class="s">{</span>
 764   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 765 
 766   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 767 <span class="s">}</span>
 768 
 769 <span class="c"># Get values of a column as column matrix object...</span>
 770 <span class="c">#</span>
<a name="GetColumnValuesAsColumnMatrix-"></a> 771 <span class="k">sub </span><span class="m">GetColumnValuesAsColumnMatrix</span> <span class="s">{</span>
 772   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 773 
 774   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 775 <span class="s">}</span>
 776 
 777 <span class="c"># Get values of a column in matrix as a space delimited string...</span>
 778 <span class="c">#</span>
<a name="GetColumnValuesAsString-"></a> 779 <span class="k">sub </span><span class="m">GetColumnValuesAsString</span> <span class="s">{</span>
 780   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 781 
 782   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 783 <span class="s">}</span>
 784 
 785 <span class="c"># Get row or column values...</span>
 786 <span class="c">#</span>
<a name="_GetRowOrColumnValues-"></a> 787 <span class="k">sub </span><span class="m">_GetRowOrColumnValues</span> <span class="s">{</span>
 788   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$ValueMode</span><span class="cm">,</span> <span class="i">$ValueModeIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 789 
 790   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(AsArray|AsVector|AsRowMatrix|AsColumnMatrix|AsString)$/i</span><span class="s">)</span> <span class="s">{</span>
 791     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetRowOrColumnValues: Unknown mode, $Mode, specified...&quot;</span><span class="sc">;</span>
 792   <span class="s">}</span>
 793   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> !~ <span class="q">/^(FromRow|FromColumn)$/i</span><span class="s">)</span> <span class="s">{</span>
 794     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetRowOrColumnValues: Unknown value mode, $ValueMode, specified...&quot;</span><span class="sc">;</span>
 795   <span class="s">}</span>
 796 
 797   <span class="c"># Setup error message prefix...</span>
 798   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="s">)</span><span class="sc">;</span>
 799 
 800   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;${ClassName}-&gt;_GetRowOrColumnValues&quot;</span><span class="sc">;</span>
 801   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromRow$/i</span><span class="s">)</span> <span class="s">{</span>
 802     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;GetRowValues${Mode}&quot;</span><span class="sc">;</span>
 803   <span class="s">}</span>
 804   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromColumn$/i</span><span class="s">)</span> <span class="s">{</span>
 805     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;GetColumnValues${Mode}&quot;</span><span class="sc">;</span>
 806   <span class="s">}</span>
 807 
 808   <span class="c"># Validate specified index and collect values...</span>
 809   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 810 
 811   <span class="i">@Values</span>  = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 812   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 813 
 814   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromRow$/i</span><span class="s">)</span> <span class="s">{</span>
 815     <span class="i">$RowIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span>
 816     <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
 817 
 818     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 819       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 820     <span class="s">}</span>
 821   <span class="s">}</span>
 822   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromColumn$/i</span><span class="s">)</span> <span class="s">{</span>
 823     <span class="i">$ColIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span>
 824     <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
 825 
 826     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 827       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
 828     <span class="s">}</span>
 829   <span class="s">}</span>
 830 
 831   <span class="c"># Return values...</span>
 832   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsRowMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
 833     <span class="k">return</span> <span class="i">NewFromRows</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 834   <span class="s">}</span>
 835   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsColumnMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
 836     <span class="k">return</span> <span class="i">NewFromColumns</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 837   <span class="s">}</span>
 838   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsVector$/i</span><span class="s">)</span> <span class="s">{</span>
 839     <span class="k">return</span> <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 840   <span class="s">}</span>
 841   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsString$/i</span><span class="s">)</span> <span class="s">{</span>
 842     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 843   <span class="s">}</span>
 844   <span class="k">else</span> <span class="s">{</span>
 845     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Values</span><span class="sc">;</span>
 846   <span class="s">}</span>
 847 <span class="s">}</span>
 848 
 849 <span class="c"># Set values of the diagonal in a square matrix...</span>
 850 <span class="c">#</span>
<a name="SetDiagonalValues-"></a> 851 <span class="k">sub </span><span class="m">SetDiagonalValues</span> <span class="s">{</span>
 852   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 853   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfDiagonalValues</span><span class="cm">,</span> <span class="i">$DiagonalValuesRef</span><span class="s">)</span><span class="sc">;</span>
 854 
 855   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetDiagonalValues&quot;</span><span class="sc">;</span>
 856   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span>
 857     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No diagonal values specified...&quot;</span><span class="sc">;</span>
 858   <span class="s">}</span>
 859 
 860   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 861   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
 862     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
 863   <span class="s">}</span>
 864 
 865   <span class="c"># Collect specified diagonal values...</span>
 866   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
 867   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
 868   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
 869   <span class="i">$NumOfDiagonalValues</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span>
 870 
 871   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfDiagonalValues</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
 872     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Number of specified diagonal values, $NumOfDiagonalValues, must be equal to number of rows, $NumOfRows, in square matrix...&quot;</span><span class="sc">;</span>
 873   <span class="s">}</span>
 874 
 875   <span class="c"># Set diagonal values...</span>
 876   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 877     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
 878   <span class="s">}</span>
 879 
 880   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
 881 <span class="s">}</span>
 882 
 883 <span class="c"># Get values of the diagonal in a square matrix as an array. In scalar context, number of</span>
 884 <span class="c"># diagonal values is returned...</span>
 885 <span class="c">#</span>
<a name="GetDiagonalValues-"></a> 886 <span class="k">sub </span><span class="m">GetDiagonalValues</span> <span class="s">{</span>
 887   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 888 
 889   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="s">)</span><span class="sc">;</span>
 890 <span class="s">}</span>
 891 
 892 <span class="c"># Get values of the diagonal in a square matrix as vector object...</span>
 893 <span class="c">#</span>
<a name="GetDiagonalValuesAsVector-"></a> 894 <span class="k">sub </span><span class="m">GetDiagonalValuesAsVector</span> <span class="s">{</span>
 895   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 896 
 897   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="s">)</span><span class="sc">;</span>
 898 <span class="s">}</span>
 899 
 900 <span class="c"># Get values of the diagonal in a square matrix as row matrix object</span>
 901 <span class="c">#</span>
<a name="GetDiagonalValuesAsRowMatrix-"></a> 902 <span class="k">sub </span><span class="m">GetDiagonalValuesAsRowMatrix</span> <span class="s">{</span>
 903   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 904 
 905   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="s">)</span><span class="sc">;</span>
 906 <span class="s">}</span>
 907 
 908 <span class="c"># Get values of the diagonal in a square matrix as column matrix object</span>
 909 <span class="c">#</span>
<a name="GetDiagonalValuesAsColumnMatrix-"></a> 910 <span class="k">sub </span><span class="m">GetDiagonalValuesAsColumnMatrix</span> <span class="s">{</span>
 911   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 912 
 913   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="s">)</span><span class="sc">;</span>
 914 <span class="s">}</span>
 915 
 916 <span class="c"># Get values of the diagonal in a square matrix as a space delimited string...</span>
 917 <span class="c">#</span>
<a name="GetDiagonalValuesAsString-"></a> 918 <span class="k">sub </span><span class="m">GetDiagonalValuesAsString</span> <span class="s">{</span>
 919   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 920 
 921   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="s">)</span><span class="sc">;</span>
 922 <span class="s">}</span>
 923 
 924 <span class="c"># Get diagonal values...</span>
<a name="_GetDiagonalValues-"></a> 925 <span class="k">sub </span><span class="m">_GetDiagonalValues</span> <span class="s">{</span>
 926   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 927 
 928   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(AsArray|AsVector|AsRowMatrix|AsColumnMatrix|AsString)$/i</span><span class="s">)</span> <span class="s">{</span>
 929     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetDiagonalValues: Unknown mode, $Mode, specified...&quot;</span><span class="sc">;</span>
 930   <span class="s">}</span>
 931 
 932   <span class="c"># Make sure it&#39;s a square matrix...</span>
 933   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="s">)</span><span class="sc">;</span>
 934 
 935   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;${ClassName}-&gt;_GetDiagonalValues${Mode}&quot;</span><span class="sc">;</span>
 936   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 937   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
 938     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
 939   <span class="s">}</span>
 940 
 941   <span class="c"># Collect values...</span>
 942   <span class="k">my</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 943   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 944 
 945   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 946     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span>
 947   <span class="s">}</span>
 948 
 949   <span class="c"># Return values...</span>
 950   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsRowMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
 951     <span class="k">return</span> <span class="i">NewFromRows</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 952   <span class="s">}</span>
 953   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsColumnMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
 954     <span class="k">return</span> <span class="i">NewFromColumns</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 955   <span class="s">}</span>
 956   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsVector$/i</span><span class="s">)</span> <span class="s">{</span>
 957     <span class="k">return</span> <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 958   <span class="s">}</span>
 959   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsString$/i</span><span class="s">)</span> <span class="s">{</span>
 960     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
 961   <span class="s">}</span>
 962   <span class="k">else</span> <span class="s">{</span>
 963     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Values</span><span class="sc">;</span>
 964   <span class="s">}</span>
 965 <span class="s">}</span>
 966 
 967 <span class="c"># Is it a square matrix?</span>
 968 <span class="c">#</span>
<a name="IsSquare-"></a> 969 <span class="k">sub </span><span class="m">IsSquare</span> <span class="s">{</span>
 970   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 971   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 972 
 973   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$NumOfCols</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
 974 <span class="s">}</span>
 975 
 976 <span class="c"># Is it a unit matrix?</span>
 977 <span class="c">#</span>
 978 <span class="c"># A matrix is a unit matrix:</span>
 979 <span class="c">#   o It&#39;s a square matrix</span>
 980 <span class="c">#   o All its diagonal elements are ones and its off-diagonal elements are zeros</span>
 981 <span class="c">#</span>
<a name="IsUnit-"></a> 982 <span class="k">sub </span><span class="m">IsUnit</span> <span class="s">{</span>
 983   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
 984 
 985   <span class="c"># Is is a square matrix?</span>
 986   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 987     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 988   <span class="s">}</span>
 989 
 990   <span class="c"># Check matrix values...</span>
 991   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ExpectedValue</span><span class="s">)</span><span class="sc">;</span>
 992   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
 993 
 994   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 995     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
 996       <span class="i">$ExpectedValue</span> = <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> ? <span class="n">1.0</span> <span class="co">:</span> <span class="n">0.0</span><span class="sc">;</span>
 997       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$ExpectedValue</span><span class="s">)</span> <span class="s">{</span>
 998         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
 999       <span class="s">}</span>
1000     <span class="s">}</span>
1001   <span class="s">}</span>
1002   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1003 <span class="s">}</span>
1004 
1005 <span class="c"># Is it an identity matrix?</span>
1006 <span class="c">#</span>
<a name="IsIdentity-"></a>1007 <span class="k">sub </span><span class="m">IsIdentity</span> <span class="s">{</span>
1008   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1009 
1010   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnit</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1011 <span class="s">}</span>
1012 
1013 <span class="c"># Is it a diagonal matrix?</span>
1014 <span class="c">#</span>
1015 <span class="c"># A matrix is a diagonal matrix:</span>
1016 <span class="c">#   o It&#39;s a square matrix</span>
1017 <span class="c">#   o All its off-diagonal elements are zeros and its diagonal elements may or may not</span>
1018 <span class="c">#     be zeros</span>
1019 <span class="c">#</span>
1020 <span class="c">#</span>
<a name="IsDiagonal-"></a>1021 <span class="k">sub </span><span class="m">IsDiagonal</span> <span class="s">{</span>
1022   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1023 
1024   <span class="c"># Is is a square matrix?</span>
1025   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1026     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1027   <span class="s">}</span>
1028 
1029   <span class="c"># Check off-diagonal matrix values...</span>
1030   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1031   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1032 
1033   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1034     <span class="j">COLINDEX:</span> <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1035       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1036         <span class="k">next</span> <span class="j">COLINDEX</span><span class="sc">;</span>
1037       <span class="s">}</span>
1038       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1039         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1040       <span class="s">}</span>
1041     <span class="s">}</span>
1042   <span class="s">}</span>
1043   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1044 <span class="s">}</span>
1045 
1046 <span class="c"># Is it a lower bidiagonal matrix?</span>
1047 <span class="c">#</span>
1048 <span class="c"># A matrix is a lower bidiagonal matrix:</span>
1049 <span class="c">#   o It&#39;s a square matrix</span>
1050 <span class="c">#   o All its main diagonal and lower diagonal elements are non-zeros and all its</span>
1051 <span class="c">#     other elements are zeros</span>
1052 <span class="c">#</span>
<a name="IsLowerBiDiagonal-"></a>1053 <span class="k">sub </span><span class="m">IsLowerBiDiagonal</span> <span class="s">{</span>
1054   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1055 
1056   <span class="c"># Is is a square matrix?</span>
1057   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1058     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1059   <span class="s">}</span>
1060 
1061   <span class="c"># Check matrix values...</span>
1062   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
1063   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1064 
1065   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1066     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1067       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1068       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1069         <span class="c"># Main diagonal...</span>
1070         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1071           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1072         <span class="s">}</span>
1073       <span class="s">}</span>
1074       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> + <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1075         <span class="c"># Lower diagonal...</span>
1076         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1077           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1078         <span class="s">}</span>
1079       <span class="s">}</span>
1080       <span class="k">else</span> <span class="s">{</span>
1081         <span class="c"># Other elements...</span>
1082         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1083           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1084         <span class="s">}</span>
1085       <span class="s">}</span>
1086     <span class="s">}</span>
1087   <span class="s">}</span>
1088   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1089 <span class="s">}</span>
1090 
1091 <span class="c"># Is it an upper bidiagonal matrix?</span>
1092 <span class="c">#</span>
1093 <span class="c"># A matrix is an upper bidiagonal matrix:</span>
1094 <span class="c">#   o It&#39;s a square matrix</span>
1095 <span class="c">#   o All its main diagonal and upper diagonal elements are non-zeros and all its</span>
1096 <span class="c">#     other elements are zeros</span>
1097 <span class="c">#</span>
<a name="IsUpperBiDiagonal-"></a>1098 <span class="k">sub </span><span class="m">IsUpperBiDiagonal</span> <span class="s">{</span>
1099   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1100 
1101   <span class="c"># Is is a square matrix?</span>
1102   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1103     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1104   <span class="s">}</span>
1105   <span class="c"># Check matrix values...</span>
1106   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
1107   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1108 
1109   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1110     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1111       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1112       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1113         <span class="c"># Main diagonal...</span>
1114         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1115           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1116         <span class="s">}</span>
1117       <span class="s">}</span>
1118       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1119         <span class="c"># Upper diagonal...</span>
1120         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1121           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1122         <span class="s">}</span>
1123       <span class="s">}</span>
1124       <span class="k">else</span> <span class="s">{</span>
1125         <span class="c"># Other elements...</span>
1126         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1127           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1128         <span class="s">}</span>
1129       <span class="s">}</span>
1130     <span class="s">}</span>
1131   <span class="s">}</span>
1132   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1133 <span class="s">}</span>
1134 
1135 <span class="c"># Is it a bidiagonal matrix?</span>
1136 <span class="c">#</span>
1137 <span class="c"># A matrix is a bidiagonal matrix:</span>
1138 <span class="c">#</span>
<a name="IsBiDiagonal-"></a>1139 <span class="k">sub </span><span class="m">IsBiDiagonal</span> <span class="s">{</span>
1140   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1141 
1142   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;IsUpperBiDiagonal</span><span class="s">(</span><span class="s">)</span> || <span class="i">$This</span><span class="i">-&gt;IsLowerBiDiagonal</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1143 <span class="s">}</span>
1144 
1145 <span class="c"># Is it a tridiagonal matrix?</span>
1146 <span class="c">#</span>
1147 <span class="c"># A matrix is a  tribidiagonal matrix:</span>
1148 <span class="c">#   o It&#39;s a square matrix</span>
1149 <span class="c">#   o All its main diagonal, upper diagonal, and lower diagonal elements are non-zeros and all its</span>
1150 <span class="c">#     other elements are zeros</span>
1151 <span class="c">#</span>
1152 <span class="c">#</span>
<a name="IsTriDiagonal-"></a>1153 <span class="k">sub </span><span class="m">IsTriDiagonal</span> <span class="s">{</span>
1154   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1155 
1156   <span class="c"># Is is a square matrix?</span>
1157   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1158     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1159   <span class="s">}</span>
1160 
1161   <span class="c"># Check matrix values...</span>
1162   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
1163   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1164 
1165   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1166     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1167       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1168       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1169         <span class="c"># Main diagonal...</span>
1170         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1171           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1172         <span class="s">}</span>
1173       <span class="s">}</span>
1174       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1175         <span class="c"># Upper diagonal...</span>
1176         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1177           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1178         <span class="s">}</span>
1179       <span class="s">}</span>
1180       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> + <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1181         <span class="c"># Lower diagonal...</span>
1182         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1183           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1184         <span class="s">}</span>
1185       <span class="s">}</span>
1186       <span class="k">else</span> <span class="s">{</span>
1187         <span class="c"># Other elements...</span>
1188         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1189           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1190         <span class="s">}</span>
1191       <span class="s">}</span>
1192     <span class="s">}</span>
1193   <span class="s">}</span>
1194   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1195 <span class="s">}</span>
1196 
1197 <span class="c"># Is it a lower triangular matrix?</span>
1198 <span class="c">#</span>
1199 <span class="c"># A matrix is a lower triangular matrix:</span>
1200 <span class="c">#   o It&#39;s a square matrix</span>
1201 <span class="c">#   o All its entries above the main diagonal are zero</span>
1202 <span class="c">#</span>
<a name="IsLowerTriangular-"></a>1203 <span class="k">sub </span><span class="m">IsLowerTriangular</span> <span class="s">{</span>
1204   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1205 
1206   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1207 <span class="s">}</span>
1208 
1209 <span class="c"># Is it a left triangular matrix?</span>
1210 <span class="c">#</span>
1211 <span class="c"># A matrix is a left triangular matrix:</span>
1212 <span class="c">#   o It&#39;s a square matrix</span>
1213 <span class="c">#   o All its entries above the main diagonal are zero</span>
1214 <span class="c">#</span>
<a name="IsLeftTriangular-"></a>1215 <span class="k">sub </span><span class="m">IsLeftTriangular</span> <span class="s">{</span>
1216   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1217 
1218   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1219 <span class="s">}</span>
1220 
1221 <span class="c"># Is it a strictly lower triangular matrix?</span>
1222 <span class="c">#</span>
1223 <span class="c"># A matrix is a strictly lower triangular matrix:</span>
1224 <span class="c">#   o It&#39;s a square matrix</span>
1225 <span class="c">#   o All its entries on and above the main diagonal are zero</span>
1226 <span class="c">#</span>
<a name="IsStrictlyLowerTriangular-"></a>1227 <span class="k">sub </span><span class="m">IsStrictlyLowerTriangular</span> <span class="s">{</span>
1228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1229   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1230 
1231   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span>
1232 
1233   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1234 <span class="s">}</span>
1235 
1236 <span class="c"># Is it an unit lower triangular matrix?</span>
1237 <span class="c">#</span>
1238 <span class="c"># A matrix is an unit lower triangular matrix:</span>
1239 <span class="c">#   o It&#39;s a square matrix</span>
1240 <span class="c">#   o All its entries main diagonal are one</span>
1241 <span class="c">#   o All its entries above the main diagonal are zero</span>
1242 <span class="c">#</span>
<a name="IsUnitLowerTriangular-"></a>1243 <span class="k">sub </span><span class="m">IsUnitLowerTriangular</span> <span class="s">{</span>
1244   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1245   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1246 
1247   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span>
1248 
1249   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1250 <span class="s">}</span>
1251 
1252 <span class="c"># Is it a lower unitriangular matrix?</span>
1253 <span class="c">#</span>
<a name="IsLowerUniTriangular-"></a>1254 <span class="k">sub </span><span class="m">IsLowerUniTriangular</span> <span class="s">{</span>
1255   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1256 
1257   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnitLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1258 <span class="s">}</span>
1259 
1260 <span class="c"># Is it a lower triangular, strictly lower triangular, or unit lower triangular matrix?</span>
1261 <span class="c">#</span>
<a name="_IsLowerTriangularMatrix-"></a>1262 <span class="k">sub </span><span class="m">_IsLowerTriangularMatrix</span> <span class="s">{</span>
1263   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$DiagonalValue</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1264 
1265   <span class="c"># Is is a square matrix?</span>
1266   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1267     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1268   <span class="s">}</span>
1269   <span class="c"># Check matrix values...</span>
1270   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$CheckDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
1271 
1272   <span class="i">$CheckDiagonalValues</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1273   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1274 
1275   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1276     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1277       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> &amp;&amp; <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1278         <span class="c"># Main diagonal...</span>
1279         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$DiagonalValue</span><span class="s">)</span> <span class="s">{</span>
1280           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1281         <span class="s">}</span>
1282       <span class="s">}</span>
1283       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> &lt; <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1284         <span class="c"># Elemens above the main diagonal...</span>
1285         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1286           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1287         <span class="s">}</span>
1288       <span class="s">}</span>
1289     <span class="s">}</span>
1290   <span class="s">}</span>
1291   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1292 <span class="s">}</span>
1293 
1294 <span class="c"># Is it an upper triangular matrix?</span>
1295 <span class="c">#</span>
1296 <span class="c"># A matrix is an upper triangular matrix:</span>
1297 <span class="c">#   o It&#39;s a square matrix</span>
1298 <span class="c">#   o All its entries below the main diagonal are zero</span>
1299 <span class="c">#</span>
<a name="IsUpperTriangular-"></a>1300 <span class="k">sub </span><span class="m">IsUpperTriangular</span> <span class="s">{</span>
1301   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1302 
1303   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1304 <span class="s">}</span>
1305 
1306 <span class="c"># Is it a right triangular matrix?</span>
1307 <span class="c">#</span>
1308 <span class="c"># A matrix is a right triangular matrix:</span>
1309 <span class="c">#   o It&#39;s a square matrix</span>
1310 <span class="c">#   o All its entries below the main diagonal are zero</span>
1311 <span class="c">#</span>
<a name="IsRightTriangular-"></a>1312 <span class="k">sub </span><span class="m">IsRightTriangular</span> <span class="s">{</span>
1313   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1314 
1315   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1316 <span class="s">}</span>
1317 
1318 <span class="c"># Is it a strictly upper triangular matrix?</span>
1319 <span class="c">#</span>
1320 <span class="c"># A matrix is a strictly upper triangular matrix:</span>
1321 <span class="c">#   o It&#39;s a square matrix</span>
1322 <span class="c">#   o All its entries on and below the main diagonal are zero</span>
1323 <span class="c">#</span>
<a name="IsStrictlyUpperTriangular-"></a>1324 <span class="k">sub </span><span class="m">IsStrictlyUpperTriangular</span> <span class="s">{</span>
1325   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1326   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1327 
1328   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span>
1329 
1330   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1331 <span class="s">}</span>
1332 
1333 <span class="c"># Is it a unit upper triangular matrix?</span>
1334 <span class="c">#</span>
1335 <span class="c"># A matrix is an unit upper triangular matrix:</span>
1336 <span class="c">#   o It&#39;s a square matrix</span>
1337 <span class="c">#   o All its entries main diagonal are one</span>
1338 <span class="c">#   o All its entries below the main diagonal are zero</span>
1339 <span class="c">#</span>
<a name="IsUnitUpperTriangular-"></a>1340 <span class="k">sub </span><span class="m">IsUnitUpperTriangular</span> <span class="s">{</span>
1341   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1342   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1343 
1344   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span>
1345 
1346   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
1347 <span class="s">}</span>
1348 
1349 <span class="c"># Is it a upper unitriangular matrix?</span>
1350 <span class="c">#</span>
<a name="IsUpperUniTriangular-"></a>1351 <span class="k">sub </span><span class="m">IsUpperUniTriangular</span> <span class="s">{</span>
1352   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1353 
1354   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnitUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1355 <span class="s">}</span>
1356 
1357 <span class="c"># Is it an upper triangular, strictly upper triangular, or unit upper triangular matrix?</span>
1358 <span class="c">#</span>
<a name="_IsUpperTriangularMatrix-"></a>1359 <span class="k">sub </span><span class="m">_IsUpperTriangularMatrix</span> <span class="s">{</span>
1360   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$DiagonalValue</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1361 
1362   <span class="c"># Is is a square matrix?</span>
1363   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1364     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1365   <span class="s">}</span>
1366   <span class="c"># Check matrix values...</span>
1367   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$CheckDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
1368 
1369   <span class="i">$CheckDiagonalValues</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1370   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1371 
1372   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1373     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1374       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> &amp;&amp; <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1375         <span class="c"># Main diagonal...</span>
1376         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$DiagonalValue</span><span class="s">)</span> <span class="s">{</span>
1377           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1378         <span class="s">}</span>
1379       <span class="s">}</span>
1380       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> &gt; <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1381         <span class="c"># Elemens below the main diagonal...</span>
1382         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1383           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1384         <span class="s">}</span>
1385       <span class="s">}</span>
1386     <span class="s">}</span>
1387   <span class="s">}</span>
1388   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1389 <span class="s">}</span>
1390 
1391 <span class="c"># Is it a symmetrix matrix?</span>
1392 <span class="c">#</span>
1393 <span class="c"># A matrix is a symmetric matrix:</span>
1394 <span class="c">#   o It&#39;s a square matrix</span>
1395 <span class="c">#   o Its elements are symmetric with respect to main diagonal. In other words,</span>
1396 <span class="c">#     elements below the main diagonal are equal to the elements above the main</span>
1397 <span class="c">#     diagonal.</span>
1398 <span class="c">#</span>
1399 <span class="c"># Transpose of a symmetric matrix equals the matrix itself.</span>
1400 <span class="c">#</span>
<a name="IsSymmetric-"></a>1401 <span class="k">sub </span><span class="m">IsSymmetric</span> <span class="s">{</span>
1402   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1403 
1404   <span class="c"># Is is a square matrix?</span>
1405   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1406     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1407   <span class="s">}</span>
1408 
1409   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1410   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1411 
1412   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1413     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$RowIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1414       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span>
1415         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1416       <span class="s">}</span>
1417     <span class="s">}</span>
1418   <span class="s">}</span>
1419   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1420 <span class="s">}</span>
1421 
1422 <span class="c"># Is it a anti symmetrix matrix?</span>
1423 <span class="c">#</span>
1424 <span class="c"># A matrix is an anti symmetric matrix:</span>
1425 <span class="c">#   o It&#39;s a square matrix</span>
1426 <span class="c">#   o Its elements are asymmetric with respect to main diagonal. In other words,</span>
1427 <span class="c">#     elements below the main diagonal are equal to the negative of elements above</span>
1428 <span class="c">#     the main diagonal.</span>
1429 <span class="c">#</span>
1430 <span class="c"># Transpose of a anti symmetric matrix equals the negative of the matrix.</span>
1431 <span class="c">#</span>
<a name="IsAntiSymmetric-"></a>1432 <span class="k">sub </span><span class="m">IsAntiSymmetric</span> <span class="s">{</span>
1433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1434 
1435   <span class="c"># Is is a square matrix?</span>
1436   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1437     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1438   <span class="s">}</span>
1439 
1440   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1441   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1442 
1443   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1444     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$RowIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1445       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != -<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span>
1446         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1447       <span class="s">}</span>
1448     <span class="s">}</span>
1449   <span class="s">}</span>
1450   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1451 <span class="s">}</span>
1452 
1453 <span class="c"># Is it a skew symmetrix matrix?</span>
1454 <span class="c">#</span>
1455 <span class="c"># It&#39;s another name for AnitSymmetricMatrix.</span>
1456 <span class="c">#</span>
<a name="IsSkewSymmetric-"></a>1457 <span class="k">sub </span><span class="m">IsSkewSymmetric</span> <span class="s">{</span>
1458   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1459 
1460   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsAntiSymmetric</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1461 <span class="s">}</span>
1462 
1463 <span class="c"># Is it a positive matrix with all its values &gt;= zero?</span>
1464 <span class="c">#</span>
<a name="IsPositive-"></a>1465 <span class="k">sub </span><span class="m">IsPositive</span> <span class="s">{</span>
1466   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1467 
1468   <span class="c"># Check matrix values...</span>
1469   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1470   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1471 
1472   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1473     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1474       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1475         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1476       <span class="s">}</span>
1477     <span class="s">}</span>
1478   <span class="s">}</span>
1479   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1480 <span class="s">}</span>
1481 
1482 <span class="c"># Is it a positive matrix with all its values &lt;= zero?</span>
1483 <span class="c">#</span>
<a name="IsNegative-"></a>1484 <span class="k">sub </span><span class="m">IsNegative</span> <span class="s">{</span>
1485   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1486 
1487   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsPositive</span><span class="s">(</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
1488 <span class="s">}</span>
1489 
1490 <span class="c"># Transpose the matrix by swaping rows with columns...</span>
1491 <span class="c">#</span>
<a name="Transpose-"></a>1492 <span class="k">sub </span><span class="m">Transpose</span> <span class="s">{</span>
1493   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1494   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1495 
1496   <span class="c"># Create the transpose matrix of size $NumOfCols x $NumOfRows</span>
1497   <span class="c">#</span>
1498   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1499   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
1500 
1501   <span class="c"># Swap rows and columns...</span>
1502   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1503     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1504       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span>
1505     <span class="s">}</span>
1506   <span class="s">}</span>
1507   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1508 <span class="s">}</span>
1509 
1510 <span class="c"># Is it a matrix object?</span>
<a name="IsMatrix-"></a>1511 <span class="k">sub </span><span class="m">IsMatrix ($)</span> <span class="s">{</span>
1512   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1513 
1514   <span class="k">return</span> <span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
1515 <span class="s">}</span>
1516 
1517 <span class="c"># Set value print format for an individual object or the whole class during StringifyMatrix operation...</span>
<a name="SetValuePrintFormat-"></a>1518 <span class="k">sub </span><span class="m">SetValuePrintFormat ($;$)</span> <span class="s">{</span>
1519   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1520 
1521   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1522     <span class="c"># Set value print format for the specific object...</span>
1523     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
1524 
1525     <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
1526   <span class="s">}</span>
1527   <span class="k">else</span> <span class="s">{</span>
1528     <span class="c"># Set value print format for the class...</span>
1529     <span class="k">my</span><span class="s">(</span><span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span>
1530 
1531     <span class="i">$ValueFormat</span> = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
1532   <span class="s">}</span>
1533 <span class="s">}</span>
1534 
1535 <span class="c"># Set print style for matrix rows for an individual object or the whole class during StringifyMatrix</span>
1536 <span class="c"># operation.</span>
1537 <span class="c">#</span>
1538 <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine. Default: AllRowsInOneLine</span>
1539 <span class="c">#</span>
<a name="SetMatrixPrintStyle-"></a>1540 <span class="k">sub </span><span class="m">SetMatrixPrintStyle ($;$)</span> <span class="s">{</span>
1541   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1542 
1543   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1544     <span class="c"># Set value print format for the specific object...</span>
1545     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$MatrixPrintStyleValue</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
1546 
1547     <span class="k">if</span> <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> !~ <span class="q">/^(AllRowsInOneLine|OneRowPerLine)$/i</span><span class="s">)</span> <span class="s">{</span>
1548       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine...&quot;</span><span class="sc">;</span>
1549     <span class="s">}</span>
1550 
1551     <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>} = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span>
1552   <span class="s">}</span>
1553   <span class="k">else</span> <span class="s">{</span>
1554     <span class="c"># Set value print format for the class...</span>
1555     <span class="k">my</span><span class="s">(</span><span class="i">$MatrixPrintStyleValue</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span>
1556 
1557     <span class="k">if</span> <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> !~ <span class="q">/^(AllRowsInOneLine|OneRowPerLine)$/i</span><span class="s">)</span> <span class="s">{</span>
1558       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine...&quot;</span><span class="sc">;</span>
1559     <span class="s">}</span>
1560 
1561     <span class="i">$MatrixPrintStyle</span> = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span>
1562   <span class="s">}</span>
1563 <span class="s">}</span>
1564 
1565 <span class="c"># Is it a matrix object?</span>
1566 <span class="c">#</span>
<a name="_IsMatrix-"></a>1567 <span class="k">sub </span><span class="m">_IsMatrix</span> <span class="s">{</span>
1568   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1569 
1570   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
1571 <span class="s">}</span>
1572 
1573 <span class="c"># Make sure it&#39;s a matrix reference...</span>
1574 <span class="c">#</span>
<a name="_ValidateMatrix-"></a>1575 <span class="k">sub </span><span class="m">_ValidateMatrix</span> <span class="s">{</span>
1576   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1577 
1578   <span class="k">if</span> <span class="s">(</span>!<span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$Matrix</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1579     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Object must be a matrix...&quot;</span><span class="sc">;</span>
1580   <span class="s">}</span>
1581 <span class="s">}</span>
1582 
1583 <span class="c"># Make sure both row and column indicies are valid...</span>
1584 <span class="c">#</span>
<a name="_ValidateRowAndColumnIndicies-"></a>1585 <span class="k">sub </span><span class="m">_ValidateRowAndColumnIndicies</span> <span class="s">{</span>
1586   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColumnIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1587 
1588   <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
1589   <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColumnIndex</span><span class="s">)</span><span class="sc">;</span>
1590 
1591   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
1592 <span class="s">}</span>
1593 
1594 <span class="c"># Make sure it&#39;s a valid row index...</span>
1595 <span class="c">#</span>
<a name="_ValidateRowIndex-"></a>1596 <span class="k">sub </span><span class="m">_ValidateRowIndex</span> <span class="s">{</span>
1597   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1598   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
1599 
1600   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$RowIndex</span><span class="s">)</span> <span class="s">{</span>
1601     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: RowIndex must be defined...&quot;</span><span class="sc">;</span>
1602   <span class="s">}</span>
1603   <span class="i">$NumOfRows</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1604   <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> &lt; <span class="n">0</span> || <span class="i">$RowIndex</span> &gt;= <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
1605     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: RowIndex value $RowIndex must be &gt;= 0 and &lt; $NumOfRows, NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
1606   <span class="s">}</span>
1607   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
1608 <span class="s">}</span>
1609 
1610 <span class="c"># Make sure it&#39;s a valid column index...</span>
1611 <span class="c">#</span>
<a name="_ValidateColumnIndex-"></a>1612 <span class="k">sub </span><span class="m">_ValidateColumnIndex</span> <span class="s">{</span>
1613   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
1614   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1615 
1616   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
1617     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: ColIndex must be defined...&quot;</span><span class="sc">;</span>
1618   <span class="s">}</span>
1619   <span class="i">$NumOfCols</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1620   <span class="k">if</span> <span class="s">(</span><span class="i">$ColIndex</span> &lt; <span class="n">0</span> || <span class="i">$ColIndex</span> &gt;= <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
1621     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: ColIndex value $ColIndex must be &gt;= 0 and &lt; $NumOfCols, NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
1622   <span class="s">}</span>
1623   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
1624 <span class="s">}</span>
1625 
1626 <span class="c">#</span>
1627 <span class="c"># Matrix addition operator supports two addition modes:</span>
1628 <span class="c">#   . Addition of two matrices by adding corresponding matrix values</span>
1629 <span class="c">#   . Addition of a scalar value to matrix values ($Matrix + 1)</span>
1630 <span class="c">#</span>
1631 <span class="c"># Caveats:</span>
1632 <span class="c">#   . Addition of a matrix to scalar is not allowed (1 + $Matrix)</span>
1633 <span class="c">#</span>
<a name="_MatrixAdditionOperator-"></a>1634 <span class="k">sub </span><span class="m">_MatrixAdditionOperator</span> <span class="s">{</span>
1635   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1636 
1637   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixAdditionOperator: Matrix addition failed&quot;</span><span class="sc">;</span>
1638   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1639 
1640   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1641 
1642   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1643   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1644 
1645   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1646     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1647     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1648       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1649         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1650       <span class="s">}</span>
1651     <span class="s">}</span>
1652   <span class="s">}</span>
1653   <span class="k">else</span> <span class="s">{</span>
1654     <span class="c"># Scalar addition...</span>
1655     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1656       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1657     <span class="s">}</span>
1658     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1659       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1660         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span><span class="sc">;</span>
1661       <span class="s">}</span>
1662     <span class="s">}</span>
1663   <span class="s">}</span>
1664   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1665 <span class="s">}</span>
1666 
1667 <span class="c">#</span>
1668 <span class="c"># Matrix subtraction operator supports two subtraction modes:</span>
1669 <span class="c">#   . Subtraction of two matrices by subtracting corresponding matrix values</span>
1670 <span class="c">#   . Subtraction of a scalar value from matrix values ($Matrix - 1)</span>
1671 <span class="c">#</span>
1672 <span class="c"># Caveats:</span>
1673 <span class="c">#   . Subtraction of a matrix from scalar is not allowed (1 - $Matrix)</span>
1674 <span class="c">#</span>
<a name="_MatrixSubtractionOperator-"></a>1675 <span class="k">sub </span><span class="m">_MatrixSubtractionOperator</span> <span class="s">{</span>
1676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1677 
1678   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSubtractionOperator: Matrix subtraction failed&quot;</span><span class="sc">;</span>
1679   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1680 
1681   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1682 
1683   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1684   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1685 
1686   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1687     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1688     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1689       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1690         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1691       <span class="s">}</span>
1692     <span class="s">}</span>
1693   <span class="s">}</span>
1694   <span class="k">else</span> <span class="s">{</span>
1695     <span class="c"># Scalar subtraction...</span>
1696     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1697       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1698     <span class="s">}</span>
1699     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1700       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1701         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span><span class="sc">;</span>
1702       <span class="s">}</span>
1703     <span class="s">}</span>
1704   <span class="s">}</span>
1705   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1706 <span class="s">}</span>
1707 
1708 <span class="c">#</span>
1709 <span class="c"># Matrix multiplication operator supports two multiplication modes:</span>
1710 <span class="c">#   . Multiplication of two matrices</span>
1711 <span class="c">#   . Multiplication of matrix values by a scalar ($Matrix * 1)</span>
1712 <span class="c">#</span>
1713 <span class="c"># Caveats:</span>
1714 <span class="c">#   . Multiplication of a scalar by a is not allowed (1 * $Matrix)</span>
1715 <span class="c">#</span>
<a name="_MatrixMultiplicationOperator-"></a>1716 <span class="k">sub </span><span class="m">_MatrixMultiplicationOperator</span> <span class="s">{</span>
1717   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="s">)</span><span class="sc">;</span>
1718 
1719   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixMultiplicationOperator: Matrix multiplication failed&quot;</span><span class="sc">;</span>
1720   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span>
1721   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="s">)</span><span class="sc">;</span>
1722 
1723   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
1724 
1725   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1726     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1727     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="cm">,</span> <span class="i">$RowIndex1</span><span class="cm">,</span> <span class="i">$ColIndex1</span><span class="cm">,</span> <span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="cm">,</span> <span class="i">$ColIndex2</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$RowColIndex</span><span class="s">)</span><span class="sc">;</span>
1728 
1729     <span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1730     <span class="s">(</span><span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1731 
1732     <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfCols1</span> != <span class="i">$NumOfRows2</span><span class="s">)</span> <span class="s">{</span>
1733       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: NumOfCols in first matrix of size $NumOfRows1 x $NumOfCols1 must be equal to NumOfRows in second matrix of size $NumOfRows2 x $NumOfCols2...&quot;</span><span class="sc">;</span>
1734     <span class="s">}</span>
1735 
1736     <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span><span class="sc">;</span>
1737 
1738     <span class="k">for</span> <span class="i">$RowIndex1</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows1</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1739       <span class="k">for</span> <span class="i">$ColIndex2</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols2</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1740         <span class="i">$Value</span> = <span class="n">0</span><span class="sc">;</span>
1741         <span class="k">for</span> <span class="i">$RowColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols1</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1742           <span class="i">$Value</span> += <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$RowColIndex</span>] * <span class="i">$Other</span>-&gt;[<span class="i">$RowColIndex</span>][<span class="i">$ColIndex2</span>]<span class="sc">;</span>
1743         <span class="s">}</span>
1744         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$ColIndex2</span>] = <span class="i">$Value</span><span class="sc">;</span>
1745       <span class="s">}</span>
1746     <span class="s">}</span>
1747   <span class="s">}</span>
1748   <span class="k">else</span> <span class="s">{</span>
1749     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1750 
1751     <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1752     <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1753     <span class="c"># Scalar subtraction...</span>
1754     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1755       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1756     <span class="s">}</span>
1757     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1758       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1759         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] * <span class="i">$Other</span><span class="sc">;</span>
1760       <span class="s">}</span>
1761     <span class="s">}</span>
1762   <span class="s">}</span>
1763   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1764 <span class="s">}</span>
1765 
1766 <span class="c">#</span>
1767 <span class="c"># Matrix division operator supports two division modes:</span>
1768 <span class="c">#   . Division of two matrices by dividing corresponding matrix values</span>
1769 <span class="c">#   . Division matrix values  by a scalar($Matrix/2)</span>
1770 <span class="c">#</span>
1771 <span class="c"># Caveats:</span>
1772 <span class="c">#   . Division of scalar value by a matrix is not allowed (2/$Matrix)</span>
1773 <span class="c">#</span>
<a name="_MatrixDivisionOperator-"></a>1774 <span class="k">sub </span><span class="m">_MatrixDivisionOperator</span> <span class="s">{</span>
1775   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1776 
1777   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixDivisionOperator: Matrix division failed&quot;</span><span class="sc">;</span>
1778   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1779 
1780   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1781 
1782   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1783   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1784 
1785   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1786     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1787     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1788       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1789         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1790       <span class="s">}</span>
1791     <span class="s">}</span>
1792   <span class="s">}</span>
1793   <span class="k">else</span> <span class="s">{</span>
1794     <span class="c"># Scalar subtraction...</span>
1795     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1796       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1797     <span class="s">}</span>
1798     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1799       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1800         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span><span class="sc">;</span>
1801       <span class="s">}</span>
1802     <span class="s">}</span>
1803   <span class="s">}</span>
1804   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1805 <span class="s">}</span>
1806 
1807 <span class="c">#</span>
1808 <span class="c"># Matrix exponentiation operator supports two division modes:</span>
1809 <span class="c">#   . Exponent of two matrices by exponentiation of corresponding matrix values</span>
1810 <span class="c">#   . Exponentiation matrix values  by a scalar ($Matrix ** 2)</span>
1811 <span class="c">#</span>
1812 <span class="c"># Caveats:</span>
1813 <span class="c">#   . Exponentiation of scalar value by a matrix is not allowed (2 ** $Matrix)</span>
1814 <span class="c">#</span>
<a name="_MatrixExponentiationOperator-"></a>1815 <span class="k">sub </span><span class="m">_MatrixExponentiationOperator</span> <span class="s">{</span>
1816   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1817 
1818   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixExponentiationOperator: Matrix exponentiation failed&quot;</span><span class="sc">;</span>
1819   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1820 
1821   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1822 
1823   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1824   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1825 
1826   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1827     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1828     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1829       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1830         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1831       <span class="s">}</span>
1832     <span class="s">}</span>
1833   <span class="s">}</span>
1834   <span class="k">else</span> <span class="s">{</span>
1835     <span class="c"># Scalar subtraction...</span>
1836     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1837       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1838     <span class="s">}</span>
1839     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1840       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1841         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span><span class="sc">;</span>
1842       <span class="s">}</span>
1843     <span class="s">}</span>
1844   <span class="s">}</span>
1845   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1846 <span class="s">}</span>
1847 
1848 <span class="c">#</span>
1849 <span class="c"># Matrix modulus operator supports two division modes:</span>
1850 <span class="c">#   . Modulus of two matrices by taking modulus between corresponding matrix values</span>
1851 <span class="c">#   . Modulus of matrix values  by a scalar ($Matrix % 2)</span>
1852 <span class="c">#</span>
1853 <span class="c"># Caveats:</span>
1854 <span class="c">#   . Modulus of scalar value by a matrix is not allowed (2 % $Matrix)</span>
1855 <span class="c">#</span>
<a name="_MatrixModulusOperator-"></a>1856 <span class="k">sub </span><span class="m">_MatrixModulusOperator</span> <span class="s">{</span>
1857   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1858 
1859   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixModulusOperator: Matrix modulus failed&quot;</span><span class="sc">;</span>
1860   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1861 
1862   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1863 
1864   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1865   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
1866 
1867   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1868     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1869     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1870       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1871         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
1872       <span class="s">}</span>
1873     <span class="s">}</span>
1874   <span class="s">}</span>
1875   <span class="k">else</span> <span class="s">{</span>
1876     <span class="c"># Scalar subtraction...</span>
1877     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1878       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1879     <span class="s">}</span>
1880     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1881       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1882         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span><span class="sc">;</span>
1883       <span class="s">}</span>
1884     <span class="s">}</span>
1885   <span class="s">}</span>
1886   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
1887 <span class="s">}</span>
1888 
1889 <span class="c">#</span>
1890 <span class="c"># Matrix booelan operator checks whether a matrix contains at least one non-zero</span>
1891 <span class="c"># value...</span>
1892 <span class="c">#</span>
<a name="_MatrixBooleanOperator-"></a>1893 <span class="k">sub </span><span class="m">_MatrixBooleanOperator</span> <span class="s">{</span>
1894   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1895 
1896   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixBooleanOperator: Matrix boolean operation failed&quot;</span><span class="sc">;</span>
1897   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1898 
1899   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1900 
1901   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1902   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1903     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1904       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1905         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1906       <span class="s">}</span>
1907     <span class="s">}</span>
1908   <span class="s">}</span>
1909   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1910 <span class="s">}</span>
1911 
1912 <span class="c">#</span>
1913 <span class="c"># Matrix not booelan operator checks whether a matrix contains only zero values...</span>
1914 <span class="c"># value...</span>
1915 <span class="c">#</span>
<a name="_MatrixNotBooleanOperator-"></a>1916 <span class="k">sub </span><span class="m">_MatrixNotBooleanOperator</span> <span class="s">{</span>
1917   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1918 
1919   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNotBooleanOperator: Matrix not boolean operation failed&quot;</span><span class="sc">;</span>
1920   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
1921 
1922   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1923 
1924   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1925   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1926     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1927       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
1928         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1929       <span class="s">}</span>
1930     <span class="s">}</span>
1931   <span class="s">}</span>
1932   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1933 <span class="s">}</span>
1934 
1935 <span class="c">#</span>
1936 <span class="c"># Matrix equal operator supports two modes:</span>
1937 <span class="c">#   . Comparison of corresponding values in two matrices</span>
1938 <span class="c">#   . Comparing matrix values to a scalar ($Matrix == 2)</span>
1939 <span class="c">#</span>
1940 <span class="c"># Caveats:</span>
1941 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 == $Matrix)</span>
1942 <span class="c">#</span>
<a name="_MatrixEqualOperator-"></a>1943 <span class="k">sub </span><span class="m">_MatrixEqualOperator</span> <span class="s">{</span>
1944   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1945 
1946   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixEqualOperator: Matrix equal failed&quot;</span><span class="sc">;</span>
1947   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
1948   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
1949 
1950   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
1951 
1952   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1953 
1954   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
1955     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
1956     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
1957 
1958     <span class="c"># Check sizes...</span>
1959     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
1960     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1961       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1962     <span class="s">}</span>
1963 
1964     <span class="c"># Check values...</span>
1965     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1966       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1967         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
1968           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1969         <span class="s">}</span>
1970       <span class="s">}</span>
1971     <span class="s">}</span>
1972   <span class="s">}</span>
1973   <span class="k">else</span> <span class="s">{</span>
1974     <span class="c"># Scalar comparison...</span>
1975     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
1976       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
1977     <span class="s">}</span>
1978     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1979       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
1980         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
1981           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
1982         <span class="s">}</span>
1983       <span class="s">}</span>
1984     <span class="s">}</span>
1985   <span class="s">}</span>
1986   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
1987 <span class="s">}</span>
1988 
1989 <span class="c">#</span>
1990 <span class="c"># Matrix not equal operator supports two modes:</span>
1991 <span class="c">#   . Comparison of corresponding values in two matrices</span>
1992 <span class="c">#   . Comparing matrix values to a scalar ($Matrix != 2)</span>
1993 <span class="c">#</span>
1994 <span class="c"># Caveats:</span>
1995 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 != $Matrix)</span>
1996 <span class="c">#</span>
<a name="_MatrixNotEqualOperator-"></a>1997 <span class="k">sub </span><span class="m">_MatrixNotEqualOperator</span> <span class="s">{</span>
1998   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
1999 
2000   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNotEqualOperator: Matrix not equal failed&quot;</span><span class="sc">;</span>
2001   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
2002   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2003 
2004   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2005 
2006   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2007 
2008   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
2009     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
2010     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
2011 
2012     <span class="c"># Check sizes...</span>
2013     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2014     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2015       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2016     <span class="s">}</span>
2017 
2018     <span class="c"># Check values...</span>
2019     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2020       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2021         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] == <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
2022           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2023         <span class="s">}</span>
2024       <span class="s">}</span>
2025     <span class="s">}</span>
2026   <span class="s">}</span>
2027   <span class="k">else</span> <span class="s">{</span>
2028     <span class="c"># Scalar comparison...</span>
2029     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
2030       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
2031     <span class="s">}</span>
2032     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2033       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2034         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] == <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
2035           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2036         <span class="s">}</span>
2037       <span class="s">}</span>
2038     <span class="s">}</span>
2039   <span class="s">}</span>
2040   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2041 <span class="s">}</span>
2042 
2043 <span class="c">#</span>
2044 <span class="c"># Matrix less than operator supports two modes:</span>
2045 <span class="c">#   . Comparison of corresponding values in two matrices</span>
2046 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &lt; 2)</span>
2047 <span class="c">#</span>
2048 <span class="c"># Caveats:</span>
2049 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &lt; $Matrix)</span>
2050 <span class="c">#</span>
<a name="_MatrixLessThanOperator-"></a>2051 <span class="k">sub </span><span class="m">_MatrixLessThanOperator</span> <span class="s">{</span>
2052   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2053 
2054   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLessThanOperator: Matrix less than failed&quot;</span><span class="sc">;</span>
2055   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
2056   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2057 
2058   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2059 
2060   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2061 
2062   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
2063     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
2064     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
2065 
2066     <span class="c"># Check sizes...</span>
2067     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2068     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2069       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2070     <span class="s">}</span>
2071 
2072     <span class="c"># Check values...</span>
2073     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2074       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2075         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
2076           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2077         <span class="s">}</span>
2078       <span class="s">}</span>
2079     <span class="s">}</span>
2080   <span class="s">}</span>
2081   <span class="k">else</span> <span class="s">{</span>
2082     <span class="c"># Scalar comparison...</span>
2083     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
2084       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
2085     <span class="s">}</span>
2086     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2087       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2088         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
2089           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2090         <span class="s">}</span>
2091       <span class="s">}</span>
2092     <span class="s">}</span>
2093   <span class="s">}</span>
2094   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2095 <span class="s">}</span>
2096 
2097 <span class="c">#</span>
2098 <span class="c"># Matrix less than equal operator supports two modes:</span>
2099 <span class="c">#   . Comparion of corresponding values in two matrices</span>
2100 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &lt;= 2)</span>
2101 <span class="c">#</span>
2102 <span class="c"># Caveats:</span>
2103 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &lt;= $Matrix)</span>
2104 <span class="c">#</span>
<a name="_MatrixLessThanEqualOperator-"></a>2105 <span class="k">sub </span><span class="m">_MatrixLessThanEqualOperator</span> <span class="s">{</span>
2106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2107 
2108   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLessThanEqualOperator: Matrix less than equal failed&quot;</span><span class="sc">;</span>
2109   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
2110   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2111 
2112   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2113 
2114   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2115 
2116   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
2117     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
2118     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
2119 
2120     <span class="c"># Check sizes...</span>
2121     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2122     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2123       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2124     <span class="s">}</span>
2125 
2126     <span class="c"># Check values...</span>
2127     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2128       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2129         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
2130           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2131         <span class="s">}</span>
2132       <span class="s">}</span>
2133     <span class="s">}</span>
2134   <span class="s">}</span>
2135   <span class="k">else</span> <span class="s">{</span>
2136     <span class="c"># Scalar comparison...</span>
2137     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
2138       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
2139     <span class="s">}</span>
2140     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2141       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2142         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
2143           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2144         <span class="s">}</span>
2145       <span class="s">}</span>
2146     <span class="s">}</span>
2147   <span class="s">}</span>
2148   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2149 <span class="s">}</span>
2150 
2151 <span class="c">#</span>
2152 <span class="c"># Matrix greatar than operator supports two modes:</span>
2153 <span class="c">#   . Comparison of corresponding values in two matrices</span>
2154 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &gt; 2)</span>
2155 <span class="c">#</span>
2156 <span class="c"># Caveats:</span>
2157 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &gt; $Matrix)</span>
2158 <span class="c">#</span>
<a name="_MatrixGreatarThanOperator-"></a>2159 <span class="k">sub </span><span class="m">_MatrixGreatarThanOperator</span> <span class="s">{</span>
2160   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2161 
2162   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixGreatarThanOperator: Matrix greatar than failed&quot;</span><span class="sc">;</span>
2163   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
2164   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2165 
2166   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2167 
2168   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2169 
2170   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
2171     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
2172     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
2173 
2174     <span class="c"># Check sizes...</span>
2175     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2176     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2177       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2178     <span class="s">}</span>
2179 
2180     <span class="c"># Check values...</span>
2181     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2182       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2183         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
2184           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2185         <span class="s">}</span>
2186       <span class="s">}</span>
2187     <span class="s">}</span>
2188   <span class="s">}</span>
2189   <span class="k">else</span> <span class="s">{</span>
2190     <span class="c"># Scalar comparison...</span>
2191     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
2192       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
2193     <span class="s">}</span>
2194     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2195       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2196         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
2197           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2198         <span class="s">}</span>
2199       <span class="s">}</span>
2200     <span class="s">}</span>
2201   <span class="s">}</span>
2202   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2203 <span class="s">}</span>
2204 
2205 <span class="c">#</span>
2206 <span class="c"># Matrix greatar than equal operator supports two modes:</span>
2207 <span class="c">#   . Comparison of corresponding values in two matrices</span>
2208 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &gt;= 2)</span>
2209 <span class="c">#</span>
2210 <span class="c"># Caveats:</span>
2211 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &gt;= $Matrix)</span>
2212 <span class="c">#</span>
<a name="_MatrixGreatarThanEqualOperator-"></a>2213 <span class="k">sub </span><span class="m">_MatrixGreatarThanEqualOperator</span> <span class="s">{</span>
2214   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2215 
2216   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixGreatarThanEqualOperator: Matrix greatar than equal failed&quot;</span><span class="sc">;</span>
2217   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
2218   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2219 
2220   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2221 
2222   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2223 
2224   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
2225     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
2226     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
2227 
2228     <span class="c"># Check sizes...</span>
2229     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2230     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2231       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2232     <span class="s">}</span>
2233 
2234     <span class="c"># Check values...</span>
2235     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2236       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2237         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
2238           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2239         <span class="s">}</span>
2240       <span class="s">}</span>
2241     <span class="s">}</span>
2242   <span class="s">}</span>
2243   <span class="k">else</span> <span class="s">{</span>
2244     <span class="c"># Scalar comparison...</span>
2245     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
2246       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
2247     <span class="s">}</span>
2248     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2249       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2250         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
2251           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
2252         <span class="s">}</span>
2253       <span class="s">}</span>
2254     <span class="s">}</span>
2255   <span class="s">}</span>
2256   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2257 <span class="s">}</span>
2258 
2259 <span class="c">#</span>
2260 <span class="c"># Matrix negative value operator returns a matrix with values corresponding to</span>
2261 <span class="c"># negative values of a matrix</span>
2262 <span class="c">#</span>
<a name="_MatrixNegativeValueOperator-"></a>2263 <span class="k">sub </span><span class="m">_MatrixNegativeValueOperator</span> <span class="s">{</span>
2264   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2265 
2266   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNegativeValueOperator: Matrix negative value operation failed&quot;</span><span class="sc">;</span>
2267   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2268 
2269   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2270 
2271   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2272   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2273 
2274   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2275     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2276       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = - <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2277     <span class="s">}</span>
2278   <span class="s">}</span>
2279   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2280 <span class="s">}</span>
2281 
2282 <span class="c">#</span>
2283 <span class="c"># Matrix absolute value operator returns a matrix with values corresponding to</span>
2284 <span class="c"># absolute values of a matrix</span>
2285 <span class="c">#</span>
<a name="_MatrixAbsoluteValueOperator-"></a>2286 <span class="k">sub </span><span class="m">_MatrixAbsoluteValueOperator</span> <span class="s">{</span>
2287   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2288 
2289   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixAbsoluteValueOperator: Matrix absolute value operation failed&quot;</span><span class="sc">;</span>
2290   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2291 
2292   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2293 
2294   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2295   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2296 
2297   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2298     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2299       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">abs</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2300     <span class="s">}</span>
2301   <span class="s">}</span>
2302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2303 <span class="s">}</span>
2304 
2305 <span class="c">#</span>
2306 <span class="c"># Matrix exp natural base operator returns a matrix with values corresponding to</span>
2307 <span class="c"># e raised to the power of values in a matrix</span>
2308 <span class="c">#</span>
<a name="_MatrixExpNaturalBaseOperator-"></a>2309 <span class="k">sub </span><span class="m">_MatrixExpNaturalBaseOperator</span> <span class="s">{</span>
2310   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2311 
2312   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixExpNaturalBaseOperator: Matrix exp operation failed&quot;</span><span class="sc">;</span>
2313   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2314 
2315   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2316 
2317   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2318   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2319 
2320   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2321     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2322       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">exp</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2323     <span class="s">}</span>
2324   <span class="s">}</span>
2325   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2326 <span class="s">}</span>
2327 
2328 <span class="c">#</span>
2329 <span class="c"># Matrix log natural base operator returns a matrix with values corresponding to</span>
2330 <span class="c"># log of values in a matrix</span>
2331 <span class="c">#</span>
<a name="_MatrixLogNaturalBaseOperator-"></a>2332 <span class="k">sub </span><span class="m">_MatrixLogNaturalBaseOperator</span> <span class="s">{</span>
2333   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2334 
2335   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLogNaturalBaseOperator: Matrix log operation failed&quot;</span><span class="sc">;</span>
2336   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2337 
2338   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2339 
2340   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2341   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2342 
2343   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2344     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2345       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">log</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2346     <span class="s">}</span>
2347   <span class="s">}</span>
2348   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2349 <span class="s">}</span>
2350 
2351 <span class="c">#</span>
2352 <span class="c"># Matrix square root operator returns a matrix with values corresponding to</span>
2353 <span class="c"># sqrt of values in a matrix</span>
2354 <span class="c">#</span>
<a name="_MatrixSquareRootOperator-"></a>2355 <span class="k">sub </span><span class="m">_MatrixSquareRootOperator</span> <span class="s">{</span>
2356   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2357 
2358   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSquareRootOperator: Matrix sqrt operation failed&quot;</span><span class="sc">;</span>
2359   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2360 
2361   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2362 
2363   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2364   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2365 
2366   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2367     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2368       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">sqrt</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2369     <span class="s">}</span>
2370   <span class="s">}</span>
2371   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2372 <span class="s">}</span>
2373 
2374 <span class="c">#</span>
2375 <span class="c"># Matrix sine root operator returns a matrix with values corresponding to</span>
2376 <span class="c"># sin of values in a matrix</span>
2377 <span class="c">#</span>
<a name="_MatrixSineOperator-"></a>2378 <span class="k">sub </span><span class="m">_MatrixSineOperator</span> <span class="s">{</span>
2379   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2380 
2381   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSineOperator: Matrix sin operation failed&quot;</span><span class="sc">;</span>
2382   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2383 
2384   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2385 
2386   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2387   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2388 
2389   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2390     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2391       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">sin</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2392     <span class="s">}</span>
2393   <span class="s">}</span>
2394   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2395 <span class="s">}</span>
2396 
2397 <span class="c">#</span>
2398 <span class="c"># Matrix cosine root operator returns a matrix with values corresponding to</span>
2399 <span class="c"># cos of values in a matrix</span>
2400 <span class="c">#</span>
<a name="_MatrixCosineOperator-"></a>2401 <span class="k">sub </span><span class="m">_MatrixCosineOperator</span> <span class="s">{</span>
2402   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
2403 
2404   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixCosineOperator: Matrix cos operation failed&quot;</span><span class="sc">;</span>
2405   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
2406 
2407   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
2408 
2409   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2410   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
2411 
2412   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2413     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2414       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">cos</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
2415     <span class="s">}</span>
2416   <span class="s">}</span>
2417   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
2418 <span class="s">}</span>
2419 
2420 <span class="c"># Turn matrix into array for @{$Matrix} operation...</span>
2421 <span class="c">#</span>
<a name="_MatrixToArrayOperator-"></a>2422 <span class="k">sub </span><span class="m">_MatrixToArrayOperator</span> <span class="s">{</span>
2423   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
2424 
2425   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
2426 <span class="s">}</span>
2427 
2428 <span class="c"># Always return true in boolean context...</span>
2429 <span class="c">#</span>
<a name="_BoolifyMatrix-"></a>2430 <span class="k">sub </span><span class="m">_BoolifyMatrix</span> <span class="s">{</span>
2431   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
2432 
2433   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
2434 <span class="s">}</span>
2435 
2436 <span class="c"># Process parameters passed to overloaded operators...</span>
2437 <span class="c">#</span>
2438 <span class="c"># For uninary operators, $SecondParameter is not defined.</span>
<a name="_ProcessOverloadedOperatorParameters-"></a>2439 <span class="k">sub </span><span class="m">_ProcessOverloadedOperatorParameters</span> <span class="s">{</span>
2440   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ParametersOrderStatus</span><span class="cm">,</span> <span class="i">$CheckMatrixSizesStatus</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
2441   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
2442 
2443   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> =  <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
2444   <span class="i">$OrderFlipped</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ParametersOrderStatus</span><span class="s">)</span> &amp;&amp; <span class="i">$ParametersOrderStatus</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
2445   <span class="i">$CheckMatrixSizes</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$CheckMatrixSizesStatus</span><span class="s">)</span> ? <span class="i">$CheckMatrixSizesStatus</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
2446 
2447   <span class="i">_ValidateMatrix</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
2448 
2449   <span class="i">$OtherIsMatrix</span> = <span class="n">0</span><span class="sc">;</span>
2450   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="k">ref</span> <span class="i">$Other</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2451     <span class="c"># Make sure $Other is a matrix...</span>
2452     <span class="i">_ValidateMatrix</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
2453     <span class="k">if</span> <span class="s">(</span><span class="i">$CheckMatrixSizes</span><span class="s">)</span> <span class="s">{</span>
2454       <span class="i">_ValidateMatrixSizesAreEqual</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
2455     <span class="s">}</span>
2456     <span class="i">$OtherIsMatrix</span> = <span class="n">1</span><span class="sc">;</span>
2457   <span class="s">}</span>
2458   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span><span class="sc">;</span>
2459 <span class="s">}</span>
2460 
2461 <span class="c"># Make sure size of the two matrices contain the same number of values...</span>
<a name="_ValidateMatrixSizesAreEqual-"></a>2462 <span class="k">sub </span><span class="m">_ValidateMatrixSizesAreEqual</span> <span class="s">{</span>
2463   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Matrix1</span><span class="cm">,</span> <span class="i">$Matrix2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
2464   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="cm">,</span> <span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span><span class="sc">;</span>
2465 
2466   <span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="s">)</span> = <span class="i">$Matrix1</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2467   <span class="s">(</span><span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span> = <span class="i">$Matrix2</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2468 
2469   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows1</span> == <span class="i">$NumOfRows2</span> &amp;&amp; <span class="i">$NumOfCols1</span> == <span class="i">$NumOfCols2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2470     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Size of the matrices must be same...&quot;</span><span class="sc">;</span>
2471   <span class="s">}</span>
2472 <span class="s">}</span>
2473 
2474 <span class="c"># Return a string containing matrix values...</span>
2475 <span class="c">#</span>
<a name="StringifyMatrix-"></a>2476 <span class="k">sub </span><span class="m">StringifyMatrix</span> <span class="s">{</span>
2477   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
2478   <span class="k">my</span><span class="s">(</span><span class="i">$MatrixString</span><span class="cm">,</span> <span class="i">$MatrixPrintStyleValue</span><span class="cm">,</span> <span class="i">$PrintFormat</span><span class="cm">,</span> <span class="i">$AllRowsInOneLine</span><span class="cm">,</span> <span class="i">$FormatString</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$RowNum</span><span class="cm">,</span> <span class="i">$RowString</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="s">)</span><span class="sc">;</span>
2479 
2480   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
2481 
2482   <span class="i">$MatrixPrintStyleValue</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>} <span class="co">:</span> <span class="i">$MatrixPrintStyle</span><span class="sc">;</span>
2483   <span class="i">$AllRowsInOneLine</span> = <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> =~ <span class="q">/^AllRowsInOneLine$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
2484 
2485   <span class="i">$PrintFormat</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} <span class="co">:</span> <span class="i">$ValueFormat</span><span class="sc">;</span>
2486 
2487   <span class="i">@ValuesFormat</span> = <span class="s">(</span><span class="i">$PrintFormat</span><span class="s">)</span> x <span class="i">$NumOfCols</span><span class="sc">;</span>
2488   <span class="i">$FormatString</span> = <span class="k">join</span> <span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="sc">;</span>
2489 
2490   <span class="i">$MatrixString</span> = <span class="k">sprintf</span> <span class="q">&quot;&lt;Size: $NumOfRows x $NumOfCols;&quot;</span><span class="sc">;</span>
2491   <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span>
2492     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">&quot; Values:&quot;</span><span class="sc">;</span>
2493   <span class="s">}</span>
2494   <span class="k">else</span> <span class="s">{</span>
2495     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">&quot; Values:\n&quot;</span><span class="sc">;</span>
2496   <span class="s">}</span>
2497 
2498   <span class="i">$RowNum</span> = <span class="n">0</span><span class="sc">;</span>
2499   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
2500     <span class="i">$RowNum</span>++<span class="sc">;</span>
2501     <span class="i">$RowString</span> = <span class="k">sprintf</span> <span class="q">&quot;Row${RowNum}:[$FormatString]&quot;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]}<span class="sc">;</span>
2502     <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span>
2503       <span class="i">$MatrixString</span> .= <span class="q">&quot; $RowString&quot;</span><span class="sc">;</span>
2504     <span class="s">}</span>
2505     <span class="k">else</span> <span class="s">{</span>
2506       <span class="i">$MatrixString</span> .= <span class="q">&quot;$RowString\n&quot;</span><span class="sc">;</span>
2507     <span class="s">}</span>
2508   <span class="s">}</span>
2509   <span class="i">$MatrixString</span> .= <span class="q">&quot;&gt;&quot;</span><span class="sc">;</span>
2510   <span class="k">return</span> <span class="i">$MatrixString</span><span class="sc">;</span>
2511 <span class="s">}</span>
2512 
<a name="EOF-"></a></pre>
<p>&nbsp;</p>
<br />
<center>
<img src="../../../images/h2o2.png">
</center>
</body>
</html>