| 0 | 1 <html> | 
|  | 2 <head> | 
|  | 3 <title>MayaChemTools:Code:Matrix.pm</title> | 
|  | 4 <meta http-equiv="content-type" content="text/html;charset=utf-8"> | 
|  | 5 <link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css"> | 
|  | 6 </head> | 
|  | 7 <body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10"> | 
|  | 8 <br/> | 
|  | 9 <center> | 
|  | 10 <a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a> | 
|  | 11 </center> | 
|  | 12 <br/> | 
|  | 13 <pre> | 
|  | 14 <a name="package-Matrix-"></a>   1 <span class="k">package </span><span class="i">Matrix</span><span class="sc">;</span> | 
|  | 15    2 <span class="c">#</span> | 
|  | 16    3 <span class="c"># $RCSfile: Matrix.pm,v $</span> | 
|  | 17    4 <span class="c"># $Date: 2015/02/28 20:47:17 $</span> | 
|  | 18    5 <span class="c"># $Revision: 1.16 $</span> | 
|  | 19    6 <span class="c">#</span> | 
|  | 20    7 <span class="c"># Author: Manish Sud <msud@san.rr.com></span> | 
|  | 21    8 <span class="c">#</span> | 
|  | 22    9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span> | 
|  | 23   10 <span class="c">#</span> | 
|  | 24   11 <span class="c"># This file is part of MayaChemTools.</span> | 
|  | 25   12 <span class="c">#</span> | 
|  | 26   13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span> | 
|  | 27   14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span> | 
|  | 28   15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span> | 
|  | 29   16 <span class="c"># later version.</span> | 
|  | 30   17 <span class="c">#</span> | 
|  | 31   18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span> | 
|  | 32   19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span> | 
|  | 33   20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span> | 
|  | 34   21 <span class="c"># details.</span> | 
|  | 35   22 <span class="c">#</span> | 
|  | 36   23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span> | 
|  | 37   24 <span class="c"># along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or</span> | 
|  | 38   25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span> | 
|  | 39   26 <span class="c"># Boston, MA, 02111-1307, USA.</span> | 
|  | 40   27 <span class="c">#</span> | 
|  | 41   28 | 
|  | 42   29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span> | 
|  | 43   30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span> | 
|  | 44   31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span> | 
|  | 45   32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 46   33 <span class="k">use</span> <span class="w">Vector</span><span class="sc">;</span> | 
|  | 47   34 | 
|  | 48   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> | 
|  | 49   36 | 
|  | 50   37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span> | 
|  | 51   38 <span class="i">@EXPORT</span> = <span class="q">qw(IsMatrix IdentityMatrix NewFromRows NewFromColumns NewFromDiagonal UnitMatrix ZeroMatrix)</span><span class="sc">;</span> | 
|  | 52   39 <span class="i">@EXPORT_OK</span> = <span class="q">qw(SetValuePrintFormat)</span><span class="sc">;</span> | 
|  | 53   40 | 
|  | 54   41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span> | 
|  | 55   42                 <span class="w">all</span>  <span class="cm">=></span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span> | 
|  | 56   43                <span class="s">)</span><span class="sc">;</span> | 
|  | 57   44 | 
|  | 58   45 <span class="c"># Setup class variables...</span> | 
|  | 59   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> | 
|  | 60   47 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 61   48 | 
|  | 62   49 <span class="c">#</span> | 
|  | 63   50 <span class="c"># Using the following explicity overloaded operators, Perl automatically generates methods</span> | 
|  | 64   51 <span class="c"># for operations with no explicitly defined methods. Autogenerated methods are possible for</span> | 
|  | 65   52 <span class="c"># these operators:</span> | 
|  | 66   53 <span class="c">#</span> | 
|  | 67   54 <span class="c">#    o Arithmetic operators: += -= *= /= **= %= ++ -- x= .=</span> | 
|  | 68   55 <span class="c">#    o Increment and decrement: ++ --</span> | 
|  | 69   56 <span class="c">#</span> | 
|  | 70   57 <span class="c"># 'fallback' is set to 'false' to raise exception for all other operators.</span> | 
|  | 71   58 <span class="c">#</span> | 
|  | 72   59 <span class="k">use</span> <span class="w">overload</span> <span class="q">'""'</span> <span class="cm">=></span> <span class="q">'StringifyMatrix'</span><span class="cm">,</span> | 
|  | 73   60 | 
|  | 74   61   <span class="q">'@{}'</span> <span class="cm">=></span> <span class="q">'_MatrixToArrayOperator'</span><span class="cm">,</span> | 
|  | 75   62 | 
|  | 76   63   <span class="q">'+'</span> <span class="cm">=></span> <span class="q">'_MatrixAdditionOperator'</span><span class="cm">,</span> | 
|  | 77   64   <span class="q">'-'</span> <span class="cm">=></span> <span class="q">'_MatrixSubtractionOperator'</span><span class="cm">,</span> | 
|  | 78   65   <span class="q">'*'</span> <span class="cm">=></span> <span class="q">'_MatrixMultiplicationOperator'</span><span class="cm">,</span> | 
|  | 79   66   <span class="q">'/'</span> <span class="cm">=></span> <span class="q">'_MatrixDivisionOperator'</span><span class="cm">,</span> | 
|  | 80   67   <span class="q">'**'</span> <span class="cm">=></span> <span class="q">'_MatrixExponentiationOperator'</span><span class="cm">,</span> | 
|  | 81   68   <span class="q">'%'</span> <span class="cm">=></span> <span class="q">'_MatrixModulusOperator'</span><span class="cm">,</span> | 
|  | 82   69 | 
|  | 83   70   <span class="q">'bool'</span> <span class="cm">=></span> <span class="q">'_MatrixBooleanOperator'</span><span class="cm">,</span> | 
|  | 84   71   <span class="q">'!'</span> <span class="cm">=></span> <span class="q">'_MatrixNotBooleanOperator'</span><span class="cm">,</span> | 
|  | 85   72 | 
|  | 86   73   <span class="q">'=='</span> <span class="cm">=></span> <span class="q">'_MatrixEqualOperator'</span><span class="cm">,</span> | 
|  | 87   74   <span class="q">'!='</span> <span class="cm">=></span> <span class="q">'_MatrixNotEqualOperator'</span><span class="cm">,</span> | 
|  | 88   75   <span class="q">'<'</span> <span class="cm">=></span> <span class="q">'_MatrixLessThanOperator'</span><span class="cm">,</span> | 
|  | 89   76   <span class="q">'<='</span> <span class="cm">=></span> <span class="q">'_MatrixLessThanEqualOperator'</span><span class="cm">,</span> | 
|  | 90   77   <span class="q">'>'</span> <span class="cm">=></span> <span class="q">'_MatrixGreatarThanOperator'</span><span class="cm">,</span> | 
|  | 91   78   <span class="q">'>='</span> <span class="cm">=></span> <span class="q">'_MatrixGreatarThanEqualOperator'</span><span class="cm">,</span> | 
|  | 92   79 | 
|  | 93   80   <span class="q">'neg'</span> <span class="cm">=></span> <span class="q">'_MatrixNegativeValueOperator'</span><span class="cm">,</span> | 
|  | 94   81 | 
|  | 95   82   <span class="q">'abs'</span> <span class="cm">=></span> <span class="q">'_MatrixAbsoluteValueOperator'</span><span class="cm">,</span> | 
|  | 96   83   <span class="q">'exp'</span> <span class="cm">=></span> <span class="q">'_MatrixExpNaturalBaseOperator'</span><span class="cm">,</span> | 
|  | 97   84   <span class="q">'log'</span> <span class="cm">=></span> <span class="q">'_MatrixLogNaturalBaseOperator'</span><span class="cm">,</span> | 
|  | 98   85   <span class="q">'sqrt'</span> <span class="cm">=></span> <span class="q">'_MatrixSquareRootOperator'</span><span class="cm">,</span> | 
|  | 99   86   <span class="q">'cos'</span> <span class="cm">=></span> <span class="q">'_MatrixCosineOperator'</span><span class="cm">,</span> | 
|  | 100   87   <span class="q">'sin'</span> <span class="cm">=></span> <span class="q">'_MatrixSineOperator'</span><span class="cm">,</span> | 
|  | 101   88 | 
|  | 102   89   <span class="q">'fallback'</span> <span class="cm">=></span> <span class="k">undef</span><span class="sc">;</span> | 
|  | 103   90 | 
|  | 104   91 <span class="c"># Class constructor...</span> | 
|  | 105 <a name="new-"></a>  92 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span> | 
|  | 106   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> | 
|  | 107   94 | 
|  | 108   95   <span class="c"># Initialize object...</span> | 
|  | 109   96   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span> | 
|  | 110   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> | 
|  | 111   98   <span class="i">$This</span><span class="i">->_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> | 
|  | 112   99 | 
|  | 113  100   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 114  101 <span class="s">}</span> | 
|  | 115  102 | 
|  | 116  103 <span class="c"># Initialize object data...</span> | 
|  | 117  104 <span class="c">#</span> | 
|  | 118 <a name="_InitializeMatrix-"></a> 105 <span class="k">sub </span><span class="m">_InitializeMatrix</span> <span class="s">{</span> | 
|  | 119  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> | 
|  | 120  107 | 
|  | 121  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> && <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> | 
|  | 122  109     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_InitializeMatrix: NumOfRows and NumOfCols must be specified..."</span><span class="sc">;</span> | 
|  | 123  110   <span class="s">}</span> | 
|  | 124  111   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="s">(</span><span class="i">$NumOfRows</span> > <span class="n">0</span><span class="s">)</span> && <span class="s">(</span><span class="i">$NumOfRows</span> > <span class="n">0</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 125  112     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_InitializeMatrix: NumOfRows and NumOfCols must be a positive number..."</span><span class="sc">;</span> | 
|  | 126  113   <span class="s">}</span> | 
|  | 127  114   <span class="c"># Initialize matrix elements to zero...</span> | 
|  | 128  115   <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 129  116 | 
|  | 130  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> | 
|  | 131  118 | 
|  | 132  119   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 133  120   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="q">'0'</span><span class="s">)</span> x <span class="i">$NumOfCols</span><span class="sc">;</span> | 
|  | 134  121 | 
|  | 135  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> | 
|  | 136  123     <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 137  124     <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@EmptyRow</span><span class="sc">;</span> | 
|  | 138  125   <span class="s">}</span> | 
|  | 139  126 <span class="s">}</span> | 
|  | 140  127 | 
|  | 141  128 <span class="c"># Initialize class ...</span> | 
|  | 142 <a name="_InitializeClass-"></a> 129 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span> | 
|  | 143  130   <span class="c">#Class name...</span> | 
|  | 144  131   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span> | 
|  | 145  132 | 
|  | 146  133   <span class="c"># Print style for matrix rows during StringifyMatrix operation.</span> | 
|  | 147  134   <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine</span> | 
|  | 148  135   <span class="c">#</span> | 
|  | 149  136   <span class="i">$MatrixPrintStyle</span> = <span class="q">"AllRowsInOneLine"</span><span class="sc">;</span> | 
|  | 150  137 | 
|  | 151  138   <span class="c"># Print format for matrix values...</span> | 
|  | 152  139   <span class="i">$ValueFormat</span> = <span class="q">"%g"</span><span class="sc">;</span> | 
|  | 153  140 <span class="s">}</span> | 
|  | 154  141 | 
|  | 155  142 <span class="c"># Get matrix size...</span> | 
|  | 156  143 <span class="c">#</span> | 
|  | 157 <a name="GetSize-"></a> 144 <span class="k">sub </span><span class="m">GetSize</span> <span class="s">{</span> | 
|  | 158  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> | 
|  | 159  146 | 
|  | 160  147   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$This</span><span class="i">->GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span> | 
|  | 161  148 <span class="s">}</span> | 
|  | 162  149 | 
|  | 163  150 <span class="c"># Get matrix dimensions...</span> | 
|  | 164  151 <span class="c">#</span> | 
|  | 165 <a name="GetDimension-"></a> 152 <span class="k">sub </span><span class="m">GetDimension</span> <span class="s">{</span> | 
|  | 166  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> | 
|  | 167  154 | 
|  | 168  155   <span class="k">return</span> <span class="i">$This</span><span class="i">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 169  156 <span class="s">}</span> | 
|  | 170  157 | 
|  | 171  158 <span class="c"># Get number of rows in matrix</span> | 
|  | 172  159 <span class="c">#</span> | 
|  | 173 <a name="GetNumOfRows-"></a> 160 <span class="k">sub </span><span class="m">GetNumOfRows</span> <span class="s">{</span> | 
|  | 174  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> | 
|  | 175  162   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span> | 
|  | 176  163 | 
|  | 177  164   <span class="c"># Size of row array...</span> | 
|  | 178  165   <span class="i">$NumOfRows</span> = <span class="i">$#</span>{<span class="i">$This</span>->{<span class="w">Values</span>}} + <span class="n">1</span><span class="sc">;</span> | 
|  | 179  166 | 
|  | 180  167   <span class="k">return</span> <span class="i">$NumOfRows</span><span class="sc">;</span> | 
|  | 181  168 <span class="s">}</span> | 
|  | 182  169 | 
|  | 183  170 <span class="c"># Get number of columns in matrix</span> | 
|  | 184  171 <span class="c">#</span> | 
|  | 185 <a name="GetNumOfColumns-"></a> 172 <span class="k">sub </span><span class="m">GetNumOfColumns</span> <span class="s">{</span> | 
|  | 186  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> | 
|  | 187  174   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span> | 
|  | 188  175 | 
|  | 189  176   <span class="c"># Size of column array for first row assuming sizes of columns are same...</span> | 
|  | 190  177   <span class="i">$NumOfCols</span> = <span class="i">$#</span>{<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="n">0</span>]} + <span class="n">1</span><span class="sc">;</span> | 
|  | 191  178 | 
|  | 192  179   <span class="k">return</span> <span class="i">$NumOfCols</span><span class="sc">;</span> | 
|  | 193  180 <span class="s">}</span> | 
|  | 194  181 | 
|  | 195  182 <span class="c"># Get reference to array holding matrix values in order to directly manipulate these values...</span> | 
|  | 196  183 <span class="c">#</span> | 
|  | 197 <a name="GetMatrixValuesReference-"></a> 184 <span class="k">sub </span><span class="m">GetMatrixValuesReference</span> <span class="s">{</span> | 
|  | 198  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> | 
|  | 199  186 | 
|  | 200  187   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 201  188 <span class="s">}</span> | 
|  | 202  189 | 
|  | 203  190 <span class="c"># Copy matrix...</span> | 
|  | 204  191 <span class="c">#</span> | 
|  | 205 <a name="Copy-"></a> 192 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span> | 
|  | 206  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> | 
|  | 207  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> | 
|  | 208  195 | 
|  | 209  196   <span class="c"># Create a new matrix...</span> | 
|  | 210  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 211  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> | 
|  | 212  199 | 
|  | 213  200   <span class="c"># Set matrix values...</span> | 
|  | 214  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> | 
|  | 215  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> | 
|  | 216  203       <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 217  204     <span class="s">}</span> | 
|  | 218  205   <span class="s">}</span> | 
|  | 219  206   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 220  207 <span class="s">}</span> | 
|  | 221  208 | 
|  | 222  209 <span class="c"># Create a new matrix using rows specified in one of the following formats:</span> | 
|  | 223  210 <span class="c">#   o List of vector objects</span> | 
|  | 224  211 <span class="c">#   o References to list of values</span> | 
|  | 225  212 <span class="c">#   o List of strings containing row values delimited by space</span> | 
|  | 226  213 <span class="c">#</span> | 
|  | 227  214 <span class="c"># Each row must contain the same number of values.</span> | 
|  | 228  215 <span class="c">#</span> | 
|  | 229  216 <span class="c"># This functionality can be either invoked as a class function or an</span> | 
|  | 230  217 <span class="c"># object method.</span> | 
|  | 231  218 <span class="c">#</span> | 
|  | 232 <a name="NewFromRows-"></a> 219 <span class="k">sub </span><span class="m">NewFromRows</span> <span class="s">{</span> | 
|  | 233  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> | 
|  | 234  221 | 
|  | 235  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> | 
|  | 236  223     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">'FromRows'</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span> | 
|  | 237  224   <span class="s">}</span> | 
|  | 238  225   <span class="k">else</span> <span class="s">{</span> | 
|  | 239  226     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">'FromRows'</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 240  227   <span class="s">}</span> | 
|  | 241  228 <span class="s">}</span> | 
|  | 242  229 | 
|  | 243  230 <span class="c"># Create a new matrix using columns specified in one of the following formats:</span> | 
|  | 244  231 <span class="c">#   o List of vector objects</span> | 
|  | 245  232 <span class="c">#   o References to list of values</span> | 
|  | 246  233 <span class="c">#   o List of strings containing columns values delimited by space</span> | 
|  | 247  234 <span class="c">#</span> | 
|  | 248  235 <span class="c"># Each columns must contain the same number of values.</span> | 
|  | 249  236 <span class="c">#</span> | 
|  | 250  237 <span class="c"># This functionality can be either invoked as a class function or an</span> | 
|  | 251  238 <span class="c"># object method.</span> | 
|  | 252  239 <span class="c">#</span> | 
|  | 253 <a name="NewFromColumns-"></a> 240 <span class="k">sub </span><span class="m">NewFromColumns</span> <span class="s">{</span> | 
|  | 254  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> | 
|  | 255  242 | 
|  | 256  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> | 
|  | 257  244     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">'FromColumns'</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span> | 
|  | 258  245   <span class="s">}</span> | 
|  | 259  246   <span class="k">else</span> <span class="s">{</span> | 
|  | 260  247     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">'FromColumns'</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span> | 
|  | 261  248   <span class="s">}</span> | 
|  | 262  249 <span class="s">}</span> | 
|  | 263  250 | 
|  | 264  251 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span> | 
|  | 265  252 <span class="c">#   o A vector object</span> | 
|  | 266  253 <span class="c">#   o Reference to list of values</span> | 
|  | 267  254 <span class="c">#   o Strings containing diagonal values delimited by space</span> | 
|  | 268  255 <span class="c">#</span> | 
|  | 269  256 <span class="c"># This functionality can be either invoked as a class function or an</span> | 
|  | 270  257 <span class="c"># object method.</span> | 
|  | 271  258 <span class="c">#</span> | 
|  | 272 <a name="NewFromDiagonal-"></a> 259 <span class="k">sub </span><span class="m">NewFromDiagonal</span> <span class="s">{</span> | 
|  | 273  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> | 
|  | 274  261 | 
|  | 275  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> | 
|  | 276  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> | 
|  | 277  264   <span class="s">}</span> | 
|  | 278  265   <span class="k">else</span> <span class="s">{</span> | 
|  | 279  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> | 
|  | 280  267   <span class="s">}</span> | 
|  | 281  268 <span class="s">}</span> | 
|  | 282  269 | 
|  | 283  270 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span> | 
|  | 284  271 <span class="c">#   o A vector object</span> | 
|  | 285  272 <span class="c">#   o Reference to list of values</span> | 
|  | 286  273 <span class="c">#   o Strings containing diagonal values delimited by space</span> | 
|  | 287  274 <span class="c">#</span> | 
|  | 288 <a name="_NewFromDiagonal-"></a> 275 <span class="k">sub </span><span class="m">_NewFromDiagonal</span> <span class="s">{</span> | 
|  | 289  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> | 
|  | 290  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> | 
|  | 291  278 | 
|  | 292  279   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}::_NewFromDiagonal"</span><span class="sc">;</span> | 
|  | 293  280   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 294  281     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: No diagonal values specified..."</span><span class="sc">;</span> | 
|  | 295  282   <span class="s">}</span> | 
|  | 296  283 | 
|  | 297  284   <span class="c"># Collect specified diagonal values...</span> | 
|  | 298  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> | 
|  | 299  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> | 
|  | 300  287   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>->[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 301  288 | 
|  | 302  289   <span class="c"># Create a new matrix...</span> | 
|  | 303  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> | 
|  | 304  291 | 
|  | 305  292   <span class="i">$NumOfRows</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span> | 
|  | 306  293   <span class="i">$NumOfCols</span> = <span class="i">$NumOfRows</span><span class="sc">;</span> | 
|  | 307  294 | 
|  | 308  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> | 
|  | 309  296 | 
|  | 310  297   <span class="c"># Set diagonal values...</span> | 
|  | 311  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> | 
|  | 312  299     <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>->[<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 313  300   <span class="s">}</span> | 
|  | 314  301 | 
|  | 315  302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 316  303 <span class="s">}</span> | 
|  | 317  304 | 
|  | 318  305 <span class="c"># Create a new matrix using rows or columns specified in one of the following formats:</span> | 
|  | 319  306 <span class="c">#   o List of vector objects</span> | 
|  | 320  307 <span class="c">#   o References to list of values</span> | 
|  | 321  308 <span class="c">#   o List of strings containing row values delimited by space</span> | 
|  | 322  309 <span class="c">#</span> | 
|  | 323  310 <span class="c"># Each row or column must contain the same number of values.</span> | 
|  | 324  311 <span class="c">#</span> | 
|  | 325 <a name="_NewFromRowsOrColumns-"></a> 312 <span class="k">sub </span><span class="m">_NewFromRowsOrColumns</span> <span class="s">{</span> | 
|  | 326  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> | 
|  | 327  314 | 
|  | 328  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> | 
|  | 329  316     <span class="w">croak</span> <span class="q">"Error: ${ClassName}::_NewFromRowsOrColumns: Unknown mode: $Mode..."</span><span class="sc">;</span> | 
|  | 330  317   <span class="s">}</span> | 
|  | 331  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> | 
|  | 332  319 | 
|  | 333  320   <span class="c"># Retrieve information about specified values and make sure similar number of values</span> | 
|  | 334  321   <span class="c"># are specified for each row or column...</span> | 
|  | 335  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> | 
|  | 336  323     <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}::_NewFromRows"</span><span class="sc">;</span> | 
|  | 337  324   <span class="s">}</span> | 
|  | 338  325   <span class="k">else</span> <span class="s">{</span> | 
|  | 339  326     <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}::_NewFromColumns"</span><span class="sc">;</span> | 
|  | 340  327   <span class="s">}</span> | 
|  | 341  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> | 
|  | 342  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> | 
|  | 343  330 | 
|  | 344  331   <span class="c"># Create a new matrix...</span> | 
|  | 345  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> | 
|  | 346  333 | 
|  | 347  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> | 
|  | 348  335     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span> | 
|  | 349  336     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>->[<span class="n">0</span>]}<span class="sc">;</span> | 
|  | 350  337     <span class="i">$RowMode</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 351  338   <span class="s">}</span> | 
|  | 352  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> | 
|  | 353  340     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>->[<span class="n">0</span>]}<span class="sc">;</span> | 
|  | 354  341     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span> | 
|  | 355  342     <span class="i">$RowMode</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 356  343   <span class="s">}</span> | 
|  | 357  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> | 
|  | 358  345 | 
|  | 359  346   <span class="c"># Setup matrix values...</span> | 
|  | 360  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> | 
|  | 361  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> | 
|  | 362  349       <span class="i">$Value</span> = <span class="i">$RowMode</span> ? <span class="i">$ValuesRefs</span>->[<span class="i">$RowIndex</span>]->[<span class="i">$ColIndex</span>]<span class="co">:</span> <span class="i">$ValuesRefs</span>->[<span class="i">$ColIndex</span>]->[<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 363  350       <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 364  351     <span class="s">}</span> | 
|  | 365  352   <span class="s">}</span> | 
|  | 366  353 | 
|  | 367  354   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 368  355 <span class="s">}</span> | 
|  | 369  356 | 
|  | 370  357 <span class="c"># Process specified matrix values in any of the following supported formats:</span> | 
|  | 371  358 <span class="c">#</span> | 
|  | 372  359 <span class="c">#   o List of vector objects</span> | 
|  | 373  360 <span class="c">#   o References to list of values</span> | 
|  | 374  361 <span class="c">#   o List of strings containing row values delimited by space</span> | 
|  | 375  362 <span class="c">#</span> | 
|  | 376  363 <span class="c"># And return a reference to an array containing references to arrays with specified values.</span> | 
|  | 377  364 <span class="c">#</span> | 
|  | 378  365 <span class="c"># Value of CombineValuesStatus determines whether all the values specified are combined</span> | 
|  | 379  366 <span class="c"># into one array and return its reference as the only entry in the array being returned.</span> | 
|  | 380  367 <span class="c">#</span> | 
|  | 381 <a name="_ProcessSpecifiedMatrixValues-"></a> 368 <span class="k">sub </span><span class="m">_ProcessSpecifiedMatrixValues</span> <span class="s">{</span> | 
|  | 382  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> | 
|  | 383  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> | 
|  | 384  371 | 
|  | 385  372   <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 386  373   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 387  374     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: No values specified..."</span><span class="sc">;</span> | 
|  | 388  375   <span class="s">}</span> | 
|  | 389  376 | 
|  | 390  377   <span class="c"># Collect values...</span> | 
|  | 391  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> | 
|  | 392  379     <span class="i">$TypeOfValue</span> = <span class="k">ref</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 393  380 | 
|  | 394  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> | 
|  | 395  382       <span class="c"># Feference to vector object...</span> | 
|  | 396  383       <span class="k">my</span><span class="s">(</span><span class="i">$ValuesRef</span><span class="s">)</span><span class="sc">;</span> | 
|  | 397  384       <span class="i">$ValuesRef</span> = <span class="i">$Value</span><span class="i">->GetValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 398  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> | 
|  | 399  386         <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Specified vector object must contain some values..."</span><span class="sc">;</span> | 
|  | 400  387       <span class="s">}</span> | 
|  | 401  388       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$ValuesRef</span><span class="sc">;</span> | 
|  | 402  389     <span class="s">}</span> | 
|  | 403  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> | 
|  | 404  391       <span class="c"># Refernece to an array...</span> | 
|  | 405  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> | 
|  | 406  393         <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Specified array reference must contain some values..."</span><span class="sc">;</span> | 
|  | 407  394       <span class="s">}</span> | 
|  | 408  395       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span> | 
|  | 409  396     <span class="s">}</span> | 
|  | 410  397     <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfValue</span> <span class="k">eq</span> <span class="q">''</span><span class="s">)</span> <span class="s">{</span> | 
|  | 411  398       <span class="c"># String value...</span> | 
|  | 412  399       <span class="k">my</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 413  400       <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">' '</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span> | 
|  | 414  401       <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span> | 
|  | 415  402         <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Specified string must contain some values..."</span><span class="sc">;</span> | 
|  | 416  403       <span class="s">}</span> | 
|  | 417  404       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span> | 
|  | 418  405     <span class="s">}</span> | 
|  | 419  406     <span class="k">else</span> <span class="s">{</span> | 
|  | 420  407       <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Value format, $TypeOfValue, of a specified value to be added to matrix object is not supported..."</span><span class="sc">;</span> | 
|  | 421  408     <span class="s">}</span> | 
|  | 422  409   <span class="s">}</span> | 
|  | 423  410 | 
|  | 424  411   <span class="c"># Combine all specified values into one array...</span> | 
|  | 425  412   <span class="k">if</span> <span class="s">(</span><span class="i">$CombineValuesStatus</span><span class="s">)</span> <span class="s">{</span> | 
|  | 426  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> | 
|  | 427  414 | 
|  | 428  415     <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 429  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> | 
|  | 430  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> | 
|  | 431  418     <span class="s">}</span> | 
|  | 432  419     <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 433  420     <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span> | 
|  | 434  421   <span class="s">}</span> | 
|  | 435  422 | 
|  | 436  423   <span class="c"># Make sure reference to all specified value arrays contain the same number of values...</span> | 
|  | 437  424   <span class="k">if</span> <span class="s">(</span><span class="i">$CheckSizesStatus</span><span class="s">)</span> <span class="s">{</span> | 
|  | 438  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> | 
|  | 439  426     <span class="i">$FirstValueSize</span> = <span class="i">$#</span>{<span class="i">$ValuesRefs</span>[<span class="n">0</span>]}<span class="sc">;</span> | 
|  | 440  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> | 
|  | 441  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> | 
|  | 442  429         <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Number of values in each specified value type to be added to matrix object must be same..."</span><span class="sc">;</span> | 
|  | 443  430       <span class="s">}</span> | 
|  | 444  431     <span class="s">}</span> | 
|  | 445  432   <span class="s">}</span> | 
|  | 446  433 | 
|  | 447  434   <span class="k">return</span> \<span class="i">@ValuesRefs</span><span class="sc">;</span> | 
|  | 448  435 <span class="s">}</span> | 
|  | 449  436 | 
|  | 450  437 <span class="c"># Create a new zero matrix of specified size or default size of 3 x 3.</span> | 
|  | 451  438 <span class="c">#</span> | 
|  | 452  439 <span class="c"># This functionality can be either invoked as a class function or an</span> | 
|  | 453  440 <span class="c"># object method.</span> | 
|  | 454  441 <span class="c">#</span> | 
|  | 455 <a name="ZeroMatrix-"></a> 442 <span class="k">sub </span><span class="m">ZeroMatrix (;$$$)</span> <span class="s">{</span> | 
|  | 456  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> | 
|  | 457  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> | 
|  | 458  445 | 
|  | 459  446   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 460  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> && <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> | 
|  | 461  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> | 
|  | 462  449   <span class="s">}</span> | 
|  | 463  450   <span class="k">else</span> <span class="s">{</span> | 
|  | 464  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> | 
|  | 465  452   <span class="s">}</span> | 
|  | 466  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> && <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> | 
|  | 467  454 | 
|  | 468  455   <span class="c"># Set up a new zero matrix</span> | 
|  | 469  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> | 
|  | 470  457 | 
|  | 471  458   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 472  459 <span class="s">}</span> | 
|  | 473  460 | 
|  | 474  461 <span class="c"># Create a new unit matrix of specified size or default size of 3 x 3.</span> | 
|  | 475  462 <span class="c">#</span> | 
|  | 476  463 <span class="c"># This functionality can be either invoked as a class function or an</span> | 
|  | 477  464 <span class="c"># object method.</span> | 
|  | 478  465 <span class="c">#</span> | 
|  | 479 <a name="UnitMatrix-"></a> 466 <span class="k">sub </span><span class="m">UnitMatrix (;$$$)</span> <span class="s">{</span> | 
|  | 480  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> | 
|  | 481  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> | 
|  | 482  469 | 
|  | 483  470   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span> | 
|  | 484  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> && <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> | 
|  | 485  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> | 
|  | 486  473   <span class="s">}</span> | 
|  | 487  474   <span class="k">else</span> <span class="s">{</span> | 
|  | 488  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> | 
|  | 489  476   <span class="s">}</span> | 
|  | 490  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> && <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> | 
|  | 491  478 | 
|  | 492  479   <span class="c"># Set up a new zero matrix</span> | 
|  | 493  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> | 
|  | 494  481 | 
|  | 495  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> | 
|  | 496  483     <span class="w">carp</span> <span class="q">"Warning: ${ClassName}::UnitMatrix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix..."</span><span class="sc">;</span> | 
|  | 497  484   <span class="s">}</span> | 
|  | 498  485 | 
|  | 499  486   <span class="c"># Initialize diagonal elements to 1...</span> | 
|  | 500  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> | 
|  | 501  488     <span class="i">$Matrix</span>->{<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> | 
|  | 502  489   <span class="s">}</span> | 
|  | 503  490 | 
|  | 504  491   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 505  492 <span class="s">}</span> | 
|  | 506  493 | 
|  | 507  494 <span class="c"># Identity matrix of specified size or size 3 x 3...</span> | 
|  | 508  495 <span class="c">#</span> | 
|  | 509 <a name="IdentityMatrix-"></a> 496 <span class="k">sub </span><span class="m">IdentityMatrix (;$$$)</span> <span class="s">{</span> | 
|  | 510  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> | 
|  | 511  498 | 
|  | 512  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> | 
|  | 513  500 <span class="s">}</span> | 
|  | 514  501 | 
|  | 515  502 <span class="c"># Set all matrix values to 0s...</span> | 
|  | 516  503 <span class="c">#</span> | 
|  | 517 <a name="Zero-"></a> 504 <span class="k">sub </span><span class="m">Zero</span> <span class="s">{</span> | 
|  | 518  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> | 
|  | 519  506 | 
|  | 520  507   <span class="k">return</span> <span class="i">$This</span><span class="i">->SetAllValues</span><span class="s">(</span><span class="n">0.0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 521  508 <span class="s">}</span> | 
|  | 522  509 | 
|  | 523  510 <span class="c"># Set all matrix values to 1s...</span> | 
|  | 524  511 <span class="c">#</span> | 
|  | 525 <a name="One-"></a> 512 <span class="k">sub </span><span class="m">One</span> <span class="s">{</span> | 
|  | 526  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> | 
|  | 527  514 | 
|  | 528  515   <span class="k">return</span> <span class="i">$This</span><span class="i">->SetAllValues</span><span class="s">(</span><span class="n">1.0</span><span class="s">)</span><span class="sc">;</span> | 
|  | 529  516 <span class="s">}</span> | 
|  | 530  517 | 
|  | 531  518 <span class="c"># Get a matrix value with row and column indicies starting from 0...</span> | 
|  | 532  519 <span class="c">#</span> | 
|  | 533 <a name="GetValue-"></a> 520 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span> | 
|  | 534  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> | 
|  | 535  522 | 
|  | 536  523   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span> | 
|  | 537  524     <span class="i">$This</span><span class="i">->_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> | 
|  | 538  525   <span class="s">}</span> | 
|  | 539  526 | 
|  | 540  527   <span class="i">$This</span><span class="i">->_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">"Error: ${ClassName}::GetValue"</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> | 
|  | 541  528 | 
|  | 542  529   <span class="k">return</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 543  530 <span class="s">}</span> | 
|  | 544  531 | 
|  | 545  532 <span class="c"># Get a matrix value...</span> | 
|  | 546  533 <span class="c">#</span> | 
|  | 547 <a name="_GetValue-"></a> 534 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span> | 
|  | 548  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> | 
|  | 549  536 | 
|  | 550  537   <span class="k">return</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 551  538 <span class="s">}</span> | 
|  | 552  539 | 
|  | 553  540 <span class="c"># Set a matrix value with row and column indicies starting from 0...</span> | 
|  | 554  541 <span class="c">#</span> | 
|  | 555 <a name="SetValue-"></a> 542 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span> | 
|  | 556  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> | 
|  | 557  544 | 
|  | 558  545   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span> | 
|  | 559  546     <span class="i">$This</span><span class="i">->_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> | 
|  | 560  547   <span class="s">}</span> | 
|  | 561  548 | 
|  | 562  549   <span class="i">$This</span><span class="i">->_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">"Error: ${ClassName}::SetValue"</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> | 
|  | 563  550 | 
|  | 564  551   <span class="k">return</span> <span class="i">$This</span><span class="i">->_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> | 
|  | 565  552 <span class="s">}</span> | 
|  | 566  553 | 
|  | 567  554 <span class="c"># Set a matrix value...</span> | 
|  | 568  555 <span class="c">#</span> | 
|  | 569 <a name="_SetValue-"></a> 556 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span> | 
|  | 570  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> | 
|  | 571  558 | 
|  | 572  559   <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 573  560 | 
|  | 574  561   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 575  562 <span class="s">}</span> | 
|  | 576  563 | 
|  | 577  564 <span class="c"># Set all matrix values to a specified value...</span> | 
|  | 578  565 <span class="c">#</span> | 
|  | 579 <a name="SetAllValues-"></a> 566 <span class="k">sub </span><span class="m">SetAllValues</span> <span class="s">{</span> | 
|  | 580  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> | 
|  | 581  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> | 
|  | 582  569 | 
|  | 583  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 584  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> | 
|  | 585  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> | 
|  | 586  573       <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 587  574     <span class="s">}</span> | 
|  | 588  575   <span class="s">}</span> | 
|  | 589  576   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 590  577 <span class="s">}</span> | 
|  | 591  578 | 
|  | 592  579 <span class="c"># Set values of a row in a matrix value with row index starting from 0...</span> | 
|  | 593  580 <span class="c">#</span> | 
|  | 594 <a name="SetRowValues-"></a> 581 <span class="k">sub </span><span class="m">SetRowValues</span> <span class="s">{</span> | 
|  | 595  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> | 
|  | 596  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> | 
|  | 597  584 | 
|  | 598  585   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->SetRowValues"</span><span class="sc">;</span> | 
|  | 599  586 | 
|  | 600  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 601  588   <span class="i">$This</span><span class="i">->_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> | 
|  | 602  589 | 
|  | 603  590   <span class="c"># Collect specified row values...</span> | 
|  | 604  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> | 
|  | 605  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> | 
|  | 606  593   <span class="i">$RowValuesRef</span> = <span class="i">$ValuesRefs</span>->[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 607  594 | 
|  | 608  595   <span class="c"># Check number of specified row values...</span> | 
|  | 609  596   <span class="i">$NumOfRowValues</span> = <span class="i">@</span>{<span class="i">$RowValuesRef</span>}<span class="sc">;</span> | 
|  | 610  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> | 
|  | 611  598     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Number of specified row values, $NumOfRowValues, must be equal to number of row values, $NumOfCols, in matrix..."</span><span class="sc">;</span> | 
|  | 612  599   <span class="s">}</span> | 
|  | 613  600 | 
|  | 614  601   <span class="c"># Set row values...</span> | 
|  | 615  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> | 
|  | 616  603     <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$RowValuesRef</span>->[<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 617  604   <span class="s">}</span> | 
|  | 618  605   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 619  606 <span class="s">}</span> | 
|  | 620  607 | 
|  | 621  608 <span class="c"># Add new row values to a matrix...</span> | 
|  | 622  609 <span class="c">#</span> | 
|  | 623 <a name="AddRowValues-"></a> 610 <span class="k">sub </span><span class="m">AddRowValues</span> <span class="s">{</span> | 
|  | 624  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> | 
|  | 625  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> | 
|  | 626  613 | 
|  | 627  614   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->AddRowValues"</span><span class="sc">;</span> | 
|  | 628  615 | 
|  | 629  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 630  617 | 
|  | 631  618   <span class="c"># Collect specified row values...</span> | 
|  | 632  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> | 
|  | 633  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> | 
|  | 634  621 | 
|  | 635  622   <span class="c"># Check number of specified row values...</span> | 
|  | 636  623   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>}<span class="sc">;</span> | 
|  | 637  624   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>->[<span class="n">0</span>]}<span class="sc">;</span> | 
|  | 638  625 | 
|  | 639  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> | 
|  | 640  627     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Number of values in each specified row, $NumOfNewCols, must be equal to number of row values, $NumOfCols, in matrix..."</span><span class="sc">;</span> | 
|  | 641  628   <span class="s">}</span> | 
|  | 642  629 | 
|  | 643  630   <span class="c"># Add each row to the matrix...</span> | 
|  | 644  631   <span class="i">$RowIndex</span> = <span class="i">$NumOfRows</span> - <span class="n">1</span><span class="sc">;</span> | 
|  | 645  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> | 
|  | 646  633     <span class="i">$RowIndex</span>++<span class="sc">;</span> | 
|  | 647  634     <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@</span>{<span class="i">$RowValueRef</span>}<span class="sc">;</span> | 
|  | 648  635   <span class="s">}</span> | 
|  | 649  636 | 
|  | 650  637   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 651  638 <span class="s">}</span> | 
|  | 652  639 | 
|  | 653  640 <span class="c"># Get values of a row in matrix as an array. In scalar context, number of row</span> | 
|  | 654  641 <span class="c"># values is returned...</span> | 
|  | 655  642 <span class="c">#</span> | 
|  | 656 <a name="GetRowValues-"></a> 643 <span class="k">sub </span><span class="m">GetRowValues</span> <span class="s">{</span> | 
|  | 657  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> | 
|  | 658  645 | 
|  | 659  646   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsArray'</span><span class="cm">,</span> <span class="q">'FromRow'</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 660  647 <span class="s">}</span> | 
|  | 661  648 | 
|  | 662  649 <span class="c"># Get values of a row in matrix as a vector object...</span> | 
|  | 663  650 <span class="c">#</span> | 
|  | 664 <a name="GetRowValuesAsVector-"></a> 651 <span class="k">sub </span><span class="m">GetRowValuesAsVector</span> <span class="s">{</span> | 
|  | 665  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> | 
|  | 666  653 | 
|  | 667  654   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsVector'</span><span class="cm">,</span> <span class="q">'FromRow'</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 668  655 <span class="s">}</span> | 
|  | 669  656 | 
|  | 670  657 <span class="c"># Get values of a row as row matrix object...</span> | 
|  | 671  658 <span class="c">#</span> | 
|  | 672 <a name="GetRowValuesAsRowMatrix-"></a> 659 <span class="k">sub </span><span class="m">GetRowValuesAsRowMatrix</span> <span class="s">{</span> | 
|  | 673  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> | 
|  | 674  661 | 
|  | 675  662   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsRowMatrix'</span><span class="cm">,</span> <span class="q">'FromRow'</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 676  663 <span class="s">}</span> | 
|  | 677  664 | 
|  | 678  665 <span class="c"># Get values of a row as column matrix object...</span> | 
|  | 679  666 <span class="c">#</span> | 
|  | 680 <a name="GetRowValuesAsColumnMatrix-"></a> 667 <span class="k">sub </span><span class="m">GetRowValuesAsColumnMatrix</span> <span class="s">{</span> | 
|  | 681  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> | 
|  | 682  669 | 
|  | 683  670   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsColumnMatrix'</span><span class="cm">,</span> <span class="q">'FromRow'</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 684  671 <span class="s">}</span> | 
|  | 685  672 | 
|  | 686  673 <span class="c"># Get values of a row in matrix as a space delimited string...</span> | 
|  | 687  674 <span class="c">#</span> | 
|  | 688 <a name="GetRowValuesAsString-"></a> 675 <span class="k">sub </span><span class="m">GetRowValuesAsString</span> <span class="s">{</span> | 
|  | 689  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> | 
|  | 690  677 | 
|  | 691  678   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsString'</span><span class="cm">,</span> <span class="q">'FromRow'</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 692  679 <span class="s">}</span> | 
|  | 693  680 | 
|  | 694  681 <span class="c"># Set values of a column in a matrix value with row index starting from 0...</span> | 
|  | 695  682 <span class="c">#</span> | 
|  | 696 <a name="SetColumnValues-"></a> 683 <span class="k">sub </span><span class="m">SetColumnValues</span> <span class="s">{</span> | 
|  | 697  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> | 
|  | 698  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> | 
|  | 699  686 | 
|  | 700  687   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->SetColumnValues"</span><span class="sc">;</span> | 
|  | 701  688 | 
|  | 702  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 703  690   <span class="i">$This</span><span class="i">->_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> | 
|  | 704  691 | 
|  | 705  692   <span class="c"># Collect specified row values...</span> | 
|  | 706  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> | 
|  | 707  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> | 
|  | 708  695   <span class="i">$ColValuesRef</span> = <span class="i">$ValuesRefs</span>->[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 709  696 | 
|  | 710  697   <span class="c"># Check number of specified col values...</span> | 
|  | 711  698   <span class="i">$NumOfColValues</span> = <span class="i">@</span>{<span class="i">$ColValuesRef</span>}<span class="sc">;</span> | 
|  | 712  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> | 
|  | 713  700     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Number of specified col values, $NumOfColValues, must be equal to number of column values, $NumOfRows, in matrix..."</span><span class="sc">;</span> | 
|  | 714  701   <span class="s">}</span> | 
|  | 715  702 | 
|  | 716  703   <span class="c"># Set col values...</span> | 
|  | 717  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> | 
|  | 718  705     <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValuesRef</span>->[<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 719  706   <span class="s">}</span> | 
|  | 720  707   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 721  708 <span class="s">}</span> | 
|  | 722  709 | 
|  | 723  710 <span class="c"># Add new column values to a matrix...</span> | 
|  | 724  711 <span class="c">#</span> | 
|  | 725 <a name="AddColumnValues-"></a> 712 <span class="k">sub </span><span class="m">AddColumnValues</span> <span class="s">{</span> | 
|  | 726  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> | 
|  | 727  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> | 
|  | 728  715 | 
|  | 729  716   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->AddColumnValues"</span><span class="sc">;</span> | 
|  | 730  717 | 
|  | 731  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 732  719 | 
|  | 733  720   <span class="c"># Collect specified column values...</span> | 
|  | 734  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> | 
|  | 735  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> | 
|  | 736  723 | 
|  | 737  724   <span class="c"># Check number of specified column values...</span> | 
|  | 738  725   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>}<span class="sc">;</span> | 
|  | 739  726   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>->[<span class="n">0</span>]}<span class="sc">;</span> | 
|  | 740  727 | 
|  | 741  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> | 
|  | 742  729     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: Number of values in each specified column, $NumOfNewRows, must be equal to number of column values, $NumOfRows, in matrix..."</span><span class="sc">;</span> | 
|  | 743  730   <span class="s">}</span> | 
|  | 744  731 | 
|  | 745  732   <span class="c"># Add each column to the matrix...</span> | 
|  | 746  733   <span class="i">$ColIndex</span> = <span class="i">$NumOfCols</span> - <span class="n">1</span><span class="sc">;</span> | 
|  | 747  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> | 
|  | 748  735     <span class="i">$ColIndex</span>++<span class="sc">;</span> | 
|  | 749  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> | 
|  | 750  737       <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValueRef</span>->[<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 751  738     <span class="s">}</span> | 
|  | 752  739   <span class="s">}</span> | 
|  | 753  740 | 
|  | 754  741   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 755  742 <span class="s">}</span> | 
|  | 756  743 | 
|  | 757  744 <span class="c"># Get values of a column in matrix as an array. In scalar context, number of column</span> | 
|  | 758  745 <span class="c"># values is returned...</span> | 
|  | 759  746 <span class="c">#</span> | 
|  | 760 <a name="GetColumnValues-"></a> 747 <span class="k">sub </span><span class="m">GetColumnValues</span> <span class="s">{</span> | 
|  | 761  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> | 
|  | 762  749 | 
|  | 763  750   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsArray'</span><span class="cm">,</span> <span class="q">'FromColumn'</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 764  751 <span class="s">}</span> | 
|  | 765  752 | 
|  | 766  753 <span class="c"># Get values of a column in matrix as a vector object...</span> | 
|  | 767  754 <span class="c">#</span> | 
|  | 768 <a name="GetColumnValuesAsVector-"></a> 755 <span class="k">sub </span><span class="m">GetColumnValuesAsVector</span> <span class="s">{</span> | 
|  | 769  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> | 
|  | 770  757 | 
|  | 771  758   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsVector'</span><span class="cm">,</span> <span class="q">'FromColumn'</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 772  759 <span class="s">}</span> | 
|  | 773  760 | 
|  | 774  761 <span class="c"># Get values of a column as row matrix object...</span> | 
|  | 775  762 <span class="c">#</span> | 
|  | 776 <a name="GetColumnValuesAsRowMatrix-"></a> 763 <span class="k">sub </span><span class="m">GetColumnValuesAsRowMatrix</span> <span class="s">{</span> | 
|  | 777  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> | 
|  | 778  765 | 
|  | 779  766   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsRowMatrix'</span><span class="cm">,</span> <span class="q">'FromColumn'</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 780  767 <span class="s">}</span> | 
|  | 781  768 | 
|  | 782  769 <span class="c"># Get values of a column as column matrix object...</span> | 
|  | 783  770 <span class="c">#</span> | 
|  | 784 <a name="GetColumnValuesAsColumnMatrix-"></a> 771 <span class="k">sub </span><span class="m">GetColumnValuesAsColumnMatrix</span> <span class="s">{</span> | 
|  | 785  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> | 
|  | 786  773 | 
|  | 787  774   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsColumnMatrix'</span><span class="cm">,</span> <span class="q">'FromColumn'</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 788  775 <span class="s">}</span> | 
|  | 789  776 | 
|  | 790  777 <span class="c"># Get values of a column in matrix as a space delimited string...</span> | 
|  | 791  778 <span class="c">#</span> | 
|  | 792 <a name="GetColumnValuesAsString-"></a> 779 <span class="k">sub </span><span class="m">GetColumnValuesAsString</span> <span class="s">{</span> | 
|  | 793  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> | 
|  | 794  781 | 
|  | 795  782   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetRowOrColumnValues</span><span class="s">(</span><span class="q">'AsString'</span><span class="cm">,</span> <span class="q">'FromColumn'</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span> | 
|  | 796  783 <span class="s">}</span> | 
|  | 797  784 | 
|  | 798  785 <span class="c"># Get row or column values...</span> | 
|  | 799  786 <span class="c">#</span> | 
|  | 800 <a name="_GetRowOrColumnValues-"></a> 787 <span class="k">sub </span><span class="m">_GetRowOrColumnValues</span> <span class="s">{</span> | 
|  | 801  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> | 
|  | 802  789 | 
|  | 803  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> | 
|  | 804  791     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_GetRowOrColumnValues: Unknown mode, $Mode, specified..."</span><span class="sc">;</span> | 
|  | 805  792   <span class="s">}</span> | 
|  | 806  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> | 
|  | 807  794     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_GetRowOrColumnValues: Unknown value mode, $ValueMode, specified..."</span><span class="sc">;</span> | 
|  | 808  795   <span class="s">}</span> | 
|  | 809  796 | 
|  | 810  797   <span class="c"># Setup error message prefix...</span> | 
|  | 811  798   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 812  799 | 
|  | 813  800   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"${ClassName}->_GetRowOrColumnValues"</span><span class="sc">;</span> | 
|  | 814  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> | 
|  | 815  802     <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->GetRowValues${Mode}"</span><span class="sc">;</span> | 
|  | 816  803   <span class="s">}</span> | 
|  | 817  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> | 
|  | 818  805     <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->GetColumnValues${Mode}"</span><span class="sc">;</span> | 
|  | 819  806   <span class="s">}</span> | 
|  | 820  807 | 
|  | 821  808   <span class="c"># Validate specified index and collect values...</span> | 
|  | 822  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> | 
|  | 823  810 | 
|  | 824  811   <span class="i">@Values</span>  = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 825  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 826  813 | 
|  | 827  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> | 
|  | 828  815     <span class="i">$RowIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span> | 
|  | 829  816     <span class="i">$This</span><span class="i">->_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> | 
|  | 830  817 | 
|  | 831  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> | 
|  | 832  819       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 833  820     <span class="s">}</span> | 
|  | 834  821   <span class="s">}</span> | 
|  | 835  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> | 
|  | 836  823     <span class="i">$ColIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span> | 
|  | 837  824     <span class="i">$This</span><span class="i">->_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> | 
|  | 838  825 | 
|  | 839  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> | 
|  | 840  827       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 841  828     <span class="s">}</span> | 
|  | 842  829   <span class="s">}</span> | 
|  | 843  830 | 
|  | 844  831   <span class="c"># Return values...</span> | 
|  | 845  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> | 
|  | 846  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> | 
|  | 847  834   <span class="s">}</span> | 
|  | 848  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> | 
|  | 849  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> | 
|  | 850  837   <span class="s">}</span> | 
|  | 851  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> | 
|  | 852  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> | 
|  | 853  840   <span class="s">}</span> | 
|  | 854  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> | 
|  | 855  842     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">' '</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 856  843   <span class="s">}</span> | 
|  | 857  844   <span class="k">else</span> <span class="s">{</span> | 
|  | 858  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> | 
|  | 859  846   <span class="s">}</span> | 
|  | 860  847 <span class="s">}</span> | 
|  | 861  848 | 
|  | 862  849 <span class="c"># Set values of the diagonal in a square matrix...</span> | 
|  | 863  850 <span class="c">#</span> | 
|  | 864 <a name="SetDiagonalValues-"></a> 851 <span class="k">sub </span><span class="m">SetDiagonalValues</span> <span class="s">{</span> | 
|  | 865  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> | 
|  | 866  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> | 
|  | 867  854 | 
|  | 868  855   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"Error: ${ClassName}->SetDiagonalValues"</span><span class="sc">;</span> | 
|  | 869  856   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span> | 
|  | 870  857     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: No diagonal values specified..."</span><span class="sc">;</span> | 
|  | 871  858   <span class="s">}</span> | 
|  | 872  859 | 
|  | 873  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 874  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> | 
|  | 875  862     <span class="w">croak</span> <span class="q">"Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix..."</span><span class="sc">;</span> | 
|  | 876  863   <span class="s">}</span> | 
|  | 877  864 | 
|  | 878  865   <span class="c"># Collect specified diagonal values...</span> | 
|  | 879  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> | 
|  | 880  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> | 
|  | 881  868   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>->[<span class="n">0</span>]<span class="sc">;</span> | 
|  | 882  869   <span class="i">$NumOfDiagonalValues</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span> | 
|  | 883  870 | 
|  | 884  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> | 
|  | 885  872     <span class="w">croak</span> <span class="q">"Error: $ErrorMsgPrefix: Number of specified diagonal values, $NumOfDiagonalValues, must be equal to number of rows, $NumOfRows, in square matrix..."</span><span class="sc">;</span> | 
|  | 886  873   <span class="s">}</span> | 
|  | 887  874 | 
|  | 888  875   <span class="c"># Set diagonal values...</span> | 
|  | 889  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> | 
|  | 890  877     <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>->[<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 891  878   <span class="s">}</span> | 
|  | 892  879 | 
|  | 893  880   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 894  881 <span class="s">}</span> | 
|  | 895  882 | 
|  | 896  883 <span class="c"># Get values of the diagonal in a square matrix as an array. In scalar context, number of</span> | 
|  | 897  884 <span class="c"># diagonal values is returned...</span> | 
|  | 898  885 <span class="c">#</span> | 
|  | 899 <a name="GetDiagonalValues-"></a> 886 <span class="k">sub </span><span class="m">GetDiagonalValues</span> <span class="s">{</span> | 
|  | 900  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> | 
|  | 901  888 | 
|  | 902  889   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetDiagonalValues</span><span class="s">(</span><span class="q">'AsArray'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 903  890 <span class="s">}</span> | 
|  | 904  891 | 
|  | 905  892 <span class="c"># Get values of the diagonal in a square matrix as vector object...</span> | 
|  | 906  893 <span class="c">#</span> | 
|  | 907 <a name="GetDiagonalValuesAsVector-"></a> 894 <span class="k">sub </span><span class="m">GetDiagonalValuesAsVector</span> <span class="s">{</span> | 
|  | 908  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> | 
|  | 909  896 | 
|  | 910  897   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetDiagonalValues</span><span class="s">(</span><span class="q">'AsVector'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 911  898 <span class="s">}</span> | 
|  | 912  899 | 
|  | 913  900 <span class="c"># Get values of the diagonal in a square matrix as row matrix object</span> | 
|  | 914  901 <span class="c">#</span> | 
|  | 915 <a name="GetDiagonalValuesAsRowMatrix-"></a> 902 <span class="k">sub </span><span class="m">GetDiagonalValuesAsRowMatrix</span> <span class="s">{</span> | 
|  | 916  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> | 
|  | 917  904 | 
|  | 918  905   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetDiagonalValues</span><span class="s">(</span><span class="q">'AsRowMatrix'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 919  906 <span class="s">}</span> | 
|  | 920  907 | 
|  | 921  908 <span class="c"># Get values of the diagonal in a square matrix as column matrix object</span> | 
|  | 922  909 <span class="c">#</span> | 
|  | 923 <a name="GetDiagonalValuesAsColumnMatrix-"></a> 910 <span class="k">sub </span><span class="m">GetDiagonalValuesAsColumnMatrix</span> <span class="s">{</span> | 
|  | 924  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> | 
|  | 925  912 | 
|  | 926  913   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetDiagonalValues</span><span class="s">(</span><span class="q">'AsColumnMatrix'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 927  914 <span class="s">}</span> | 
|  | 928  915 | 
|  | 929  916 <span class="c"># Get values of the diagonal in a square matrix as a space delimited string...</span> | 
|  | 930  917 <span class="c">#</span> | 
|  | 931 <a name="GetDiagonalValuesAsString-"></a> 918 <span class="k">sub </span><span class="m">GetDiagonalValuesAsString</span> <span class="s">{</span> | 
|  | 932  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> | 
|  | 933  920 | 
|  | 934  921   <span class="k">return</span> <span class="i">$This</span><span class="i">->_GetDiagonalValues</span><span class="s">(</span><span class="q">'AsString'</span><span class="s">)</span><span class="sc">;</span> | 
|  | 935  922 <span class="s">}</span> | 
|  | 936  923 | 
|  | 937  924 <span class="c"># Get diagonal values...</span> | 
|  | 938 <a name="_GetDiagonalValues-"></a> 925 <span class="k">sub </span><span class="m">_GetDiagonalValues</span> <span class="s">{</span> | 
|  | 939  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> | 
|  | 940  927 | 
|  | 941  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> | 
|  | 942  929     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->_GetDiagonalValues: Unknown mode, $Mode, specified..."</span><span class="sc">;</span> | 
|  | 943  930   <span class="s">}</span> | 
|  | 944  931 | 
|  | 945  932   <span class="c"># Make sure it's a square matrix...</span> | 
|  | 946  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> | 
|  | 947  934 | 
|  | 948  935   <span class="i">$ErrorMsgPrefix</span> = <span class="q">"${ClassName}->_GetDiagonalValues${Mode}"</span><span class="sc">;</span> | 
|  | 949  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 950  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> | 
|  | 951  938     <span class="w">croak</span> <span class="q">"Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix..."</span><span class="sc">;</span> | 
|  | 952  939   <span class="s">}</span> | 
|  | 953  940 | 
|  | 954  941   <span class="c"># Collect values...</span> | 
|  | 955  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> | 
|  | 956  943   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 957  944 | 
|  | 958  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> | 
|  | 959  946     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 960  947   <span class="s">}</span> | 
|  | 961  948 | 
|  | 962  949   <span class="c"># Return values...</span> | 
|  | 963  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> | 
|  | 964  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> | 
|  | 965  952   <span class="s">}</span> | 
|  | 966  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> | 
|  | 967  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> | 
|  | 968  955   <span class="s">}</span> | 
|  | 969  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> | 
|  | 970  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> | 
|  | 971  958   <span class="s">}</span> | 
|  | 972  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> | 
|  | 973  960     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">' '</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span> | 
|  | 974  961   <span class="s">}</span> | 
|  | 975  962   <span class="k">else</span> <span class="s">{</span> | 
|  | 976  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> | 
|  | 977  964   <span class="s">}</span> | 
|  | 978  965 <span class="s">}</span> | 
|  | 979  966 | 
|  | 980  967 <span class="c"># Is it a square matrix?</span> | 
|  | 981  968 <span class="c">#</span> | 
|  | 982 <a name="IsSquare-"></a> 969 <span class="k">sub </span><span class="m">IsSquare</span> <span class="s">{</span> | 
|  | 983  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> | 
|  | 984  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 985  972 | 
|  | 986  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> | 
|  | 987  974 <span class="s">}</span> | 
|  | 988  975 | 
|  | 989  976 <span class="c"># Is it a unit matrix?</span> | 
|  | 990  977 <span class="c">#</span> | 
|  | 991  978 <span class="c"># A matrix is a unit matrix:</span> | 
|  | 992  979 <span class="c">#   o It's a square matrix</span> | 
|  | 993  980 <span class="c">#   o All its diagonal elements are ones and its off-diagonal elements are zeros</span> | 
|  | 994  981 <span class="c">#</span> | 
|  | 995 <a name="IsUnit-"></a> 982 <span class="k">sub </span><span class="m">IsUnit</span> <span class="s">{</span> | 
|  | 996  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> | 
|  | 997  984 | 
|  | 998  985   <span class="c"># Is is a square matrix?</span> | 
|  | 999  986   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1000  987     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1001  988   <span class="s">}</span> | 
|  | 1002  989 | 
|  | 1003  990   <span class="c"># Check matrix values...</span> | 
|  | 1004  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> | 
|  | 1005  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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1006  993 | 
|  | 1007  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> | 
|  | 1008  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> | 
|  | 1009  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> | 
|  | 1010  997       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1011  998         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1012  999       <span class="s">}</span> | 
|  | 1013 1000     <span class="s">}</span> | 
|  | 1014 1001   <span class="s">}</span> | 
|  | 1015 1002   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1016 1003 <span class="s">}</span> | 
|  | 1017 1004 | 
|  | 1018 1005 <span class="c"># Is it an identity matrix?</span> | 
|  | 1019 1006 <span class="c">#</span> | 
|  | 1020 <a name="IsIdentity-"></a>1007 <span class="k">sub </span><span class="m">IsIdentity</span> <span class="s">{</span> | 
|  | 1021 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> | 
|  | 1022 1009 | 
|  | 1023 1010   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnit</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1024 1011 <span class="s">}</span> | 
|  | 1025 1012 | 
|  | 1026 1013 <span class="c"># Is it a diagonal matrix?</span> | 
|  | 1027 1014 <span class="c">#</span> | 
|  | 1028 1015 <span class="c"># A matrix is a diagonal matrix:</span> | 
|  | 1029 1016 <span class="c">#   o It's a square matrix</span> | 
|  | 1030 1017 <span class="c">#   o All its off-diagonal elements are zeros and its diagonal elements may or may not</span> | 
|  | 1031 1018 <span class="c">#     be zeros</span> | 
|  | 1032 1019 <span class="c">#</span> | 
|  | 1033 1020 <span class="c">#</span> | 
|  | 1034 <a name="IsDiagonal-"></a>1021 <span class="k">sub </span><span class="m">IsDiagonal</span> <span class="s">{</span> | 
|  | 1035 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> | 
|  | 1036 1023 | 
|  | 1037 1024   <span class="c"># Is is a square matrix?</span> | 
|  | 1038 1025   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1039 1026     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1040 1027   <span class="s">}</span> | 
|  | 1041 1028 | 
|  | 1042 1029   <span class="c"># Check off-diagonal matrix values...</span> | 
|  | 1043 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> | 
|  | 1044 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1045 1032 | 
|  | 1046 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> | 
|  | 1047 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> | 
|  | 1048 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> | 
|  | 1049 1036         <span class="k">next</span> <span class="j">COLINDEX</span><span class="sc">;</span> | 
|  | 1050 1037       <span class="s">}</span> | 
|  | 1051 1038       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1052 1039         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1053 1040       <span class="s">}</span> | 
|  | 1054 1041     <span class="s">}</span> | 
|  | 1055 1042   <span class="s">}</span> | 
|  | 1056 1043   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1057 1044 <span class="s">}</span> | 
|  | 1058 1045 | 
|  | 1059 1046 <span class="c"># Is it a lower bidiagonal matrix?</span> | 
|  | 1060 1047 <span class="c">#</span> | 
|  | 1061 1048 <span class="c"># A matrix is a lower bidiagonal matrix:</span> | 
|  | 1062 1049 <span class="c">#   o It's a square matrix</span> | 
|  | 1063 1050 <span class="c">#   o All its main diagonal and lower diagonal elements are non-zeros and all its</span> | 
|  | 1064 1051 <span class="c">#     other elements are zeros</span> | 
|  | 1065 1052 <span class="c">#</span> | 
|  | 1066 <a name="IsLowerBiDiagonal-"></a>1053 <span class="k">sub </span><span class="m">IsLowerBiDiagonal</span> <span class="s">{</span> | 
|  | 1067 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> | 
|  | 1068 1055 | 
|  | 1069 1056   <span class="c"># Is is a square matrix?</span> | 
|  | 1070 1057   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1071 1058     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1072 1059   <span class="s">}</span> | 
|  | 1073 1060 | 
|  | 1074 1061   <span class="c"># Check matrix values...</span> | 
|  | 1075 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> | 
|  | 1076 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1077 1064 | 
|  | 1078 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> | 
|  | 1079 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> | 
|  | 1080 1067       <span class="i">$Value</span> = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1081 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> | 
|  | 1082 1069         <span class="c"># Main diagonal...</span> | 
|  | 1083 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> | 
|  | 1084 1071           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1085 1072         <span class="s">}</span> | 
|  | 1086 1073       <span class="s">}</span> | 
|  | 1087 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> | 
|  | 1088 1075         <span class="c"># Lower diagonal...</span> | 
|  | 1089 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> | 
|  | 1090 1077           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1091 1078         <span class="s">}</span> | 
|  | 1092 1079       <span class="s">}</span> | 
|  | 1093 1080       <span class="k">else</span> <span class="s">{</span> | 
|  | 1094 1081         <span class="c"># Other elements...</span> | 
|  | 1095 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> | 
|  | 1096 1083           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1097 1084         <span class="s">}</span> | 
|  | 1098 1085       <span class="s">}</span> | 
|  | 1099 1086     <span class="s">}</span> | 
|  | 1100 1087   <span class="s">}</span> | 
|  | 1101 1088   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1102 1089 <span class="s">}</span> | 
|  | 1103 1090 | 
|  | 1104 1091 <span class="c"># Is it an upper bidiagonal matrix?</span> | 
|  | 1105 1092 <span class="c">#</span> | 
|  | 1106 1093 <span class="c"># A matrix is an upper bidiagonal matrix:</span> | 
|  | 1107 1094 <span class="c">#   o It's a square matrix</span> | 
|  | 1108 1095 <span class="c">#   o All its main diagonal and upper diagonal elements are non-zeros and all its</span> | 
|  | 1109 1096 <span class="c">#     other elements are zeros</span> | 
|  | 1110 1097 <span class="c">#</span> | 
|  | 1111 <a name="IsUpperBiDiagonal-"></a>1098 <span class="k">sub </span><span class="m">IsUpperBiDiagonal</span> <span class="s">{</span> | 
|  | 1112 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> | 
|  | 1113 1100 | 
|  | 1114 1101   <span class="c"># Is is a square matrix?</span> | 
|  | 1115 1102   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1116 1103     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1117 1104   <span class="s">}</span> | 
|  | 1118 1105   <span class="c"># Check matrix values...</span> | 
|  | 1119 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> | 
|  | 1120 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1121 1108 | 
|  | 1122 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> | 
|  | 1123 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> | 
|  | 1124 1111       <span class="i">$Value</span> = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1125 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> | 
|  | 1126 1113         <span class="c"># Main diagonal...</span> | 
|  | 1127 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> | 
|  | 1128 1115           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1129 1116         <span class="s">}</span> | 
|  | 1130 1117       <span class="s">}</span> | 
|  | 1131 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> | 
|  | 1132 1119         <span class="c"># Upper diagonal...</span> | 
|  | 1133 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> | 
|  | 1134 1121           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1135 1122         <span class="s">}</span> | 
|  | 1136 1123       <span class="s">}</span> | 
|  | 1137 1124       <span class="k">else</span> <span class="s">{</span> | 
|  | 1138 1125         <span class="c"># Other elements...</span> | 
|  | 1139 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> | 
|  | 1140 1127           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1141 1128         <span class="s">}</span> | 
|  | 1142 1129       <span class="s">}</span> | 
|  | 1143 1130     <span class="s">}</span> | 
|  | 1144 1131   <span class="s">}</span> | 
|  | 1145 1132   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1146 1133 <span class="s">}</span> | 
|  | 1147 1134 | 
|  | 1148 1135 <span class="c"># Is it a bidiagonal matrix?</span> | 
|  | 1149 1136 <span class="c">#</span> | 
|  | 1150 1137 <span class="c"># A matrix is a bidiagonal matrix:</span> | 
|  | 1151 1138 <span class="c">#</span> | 
|  | 1152 <a name="IsBiDiagonal-"></a>1139 <span class="k">sub </span><span class="m">IsBiDiagonal</span> <span class="s">{</span> | 
|  | 1153 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> | 
|  | 1154 1141 | 
|  | 1155 1142   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">->IsUpperBiDiagonal</span><span class="s">(</span><span class="s">)</span> || <span class="i">$This</span><span class="i">->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> | 
|  | 1156 1143 <span class="s">}</span> | 
|  | 1157 1144 | 
|  | 1158 1145 <span class="c"># Is it a tridiagonal matrix?</span> | 
|  | 1159 1146 <span class="c">#</span> | 
|  | 1160 1147 <span class="c"># A matrix is a  tribidiagonal matrix:</span> | 
|  | 1161 1148 <span class="c">#   o It's a square matrix</span> | 
|  | 1162 1149 <span class="c">#   o All its main diagonal, upper diagonal, and lower diagonal elements are non-zeros and all its</span> | 
|  | 1163 1150 <span class="c">#     other elements are zeros</span> | 
|  | 1164 1151 <span class="c">#</span> | 
|  | 1165 1152 <span class="c">#</span> | 
|  | 1166 <a name="IsTriDiagonal-"></a>1153 <span class="k">sub </span><span class="m">IsTriDiagonal</span> <span class="s">{</span> | 
|  | 1167 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> | 
|  | 1168 1155 | 
|  | 1169 1156   <span class="c"># Is is a square matrix?</span> | 
|  | 1170 1157   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1171 1158     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1172 1159   <span class="s">}</span> | 
|  | 1173 1160 | 
|  | 1174 1161   <span class="c"># Check matrix values...</span> | 
|  | 1175 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> | 
|  | 1176 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1177 1164 | 
|  | 1178 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> | 
|  | 1179 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> | 
|  | 1180 1167       <span class="i">$Value</span> = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1181 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> | 
|  | 1182 1169         <span class="c"># Main diagonal...</span> | 
|  | 1183 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> | 
|  | 1184 1171           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1185 1172         <span class="s">}</span> | 
|  | 1186 1173       <span class="s">}</span> | 
|  | 1187 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> | 
|  | 1188 1175         <span class="c"># Upper diagonal...</span> | 
|  | 1189 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> | 
|  | 1190 1177           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1191 1178         <span class="s">}</span> | 
|  | 1192 1179       <span class="s">}</span> | 
|  | 1193 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> | 
|  | 1194 1181         <span class="c"># Lower diagonal...</span> | 
|  | 1195 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> | 
|  | 1196 1183           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1197 1184         <span class="s">}</span> | 
|  | 1198 1185       <span class="s">}</span> | 
|  | 1199 1186       <span class="k">else</span> <span class="s">{</span> | 
|  | 1200 1187         <span class="c"># Other elements...</span> | 
|  | 1201 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> | 
|  | 1202 1189           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1203 1190         <span class="s">}</span> | 
|  | 1204 1191       <span class="s">}</span> | 
|  | 1205 1192     <span class="s">}</span> | 
|  | 1206 1193   <span class="s">}</span> | 
|  | 1207 1194   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1208 1195 <span class="s">}</span> | 
|  | 1209 1196 | 
|  | 1210 1197 <span class="c"># Is it a lower triangular matrix?</span> | 
|  | 1211 1198 <span class="c">#</span> | 
|  | 1212 1199 <span class="c"># A matrix is a lower triangular matrix:</span> | 
|  | 1213 1200 <span class="c">#   o It's a square matrix</span> | 
|  | 1214 1201 <span class="c">#   o All its entries above the main diagonal are zero</span> | 
|  | 1215 1202 <span class="c">#</span> | 
|  | 1216 <a name="IsLowerTriangular-"></a>1203 <span class="k">sub </span><span class="m">IsLowerTriangular</span> <span class="s">{</span> | 
|  | 1217 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> | 
|  | 1218 1205 | 
|  | 1219 1206   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsLowerTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1220 1207 <span class="s">}</span> | 
|  | 1221 1208 | 
|  | 1222 1209 <span class="c"># Is it a left triangular matrix?</span> | 
|  | 1223 1210 <span class="c">#</span> | 
|  | 1224 1211 <span class="c"># A matrix is a left triangular matrix:</span> | 
|  | 1225 1212 <span class="c">#   o It's a square matrix</span> | 
|  | 1226 1213 <span class="c">#   o All its entries above the main diagonal are zero</span> | 
|  | 1227 1214 <span class="c">#</span> | 
|  | 1228 <a name="IsLeftTriangular-"></a>1215 <span class="k">sub </span><span class="m">IsLeftTriangular</span> <span class="s">{</span> | 
|  | 1229 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> | 
|  | 1230 1217 | 
|  | 1231 1218   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1232 1219 <span class="s">}</span> | 
|  | 1233 1220 | 
|  | 1234 1221 <span class="c"># Is it a strictly lower triangular matrix?</span> | 
|  | 1235 1222 <span class="c">#</span> | 
|  | 1236 1223 <span class="c"># A matrix is a strictly lower triangular matrix:</span> | 
|  | 1237 1224 <span class="c">#   o It's a square matrix</span> | 
|  | 1238 1225 <span class="c">#   o All its entries on and above the main diagonal are zero</span> | 
|  | 1239 1226 <span class="c">#</span> | 
|  | 1240 <a name="IsStrictlyLowerTriangular-"></a>1227 <span class="k">sub </span><span class="m">IsStrictlyLowerTriangular</span> <span class="s">{</span> | 
|  | 1241 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> | 
|  | 1242 1229   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1243 1230 | 
|  | 1244 1231   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1245 1232 | 
|  | 1246 1233   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1247 1234 <span class="s">}</span> | 
|  | 1248 1235 | 
|  | 1249 1236 <span class="c"># Is it an unit lower triangular matrix?</span> | 
|  | 1250 1237 <span class="c">#</span> | 
|  | 1251 1238 <span class="c"># A matrix is an unit lower triangular matrix:</span> | 
|  | 1252 1239 <span class="c">#   o It's a square matrix</span> | 
|  | 1253 1240 <span class="c">#   o All its entries main diagonal are one</span> | 
|  | 1254 1241 <span class="c">#   o All its entries above the main diagonal are zero</span> | 
|  | 1255 1242 <span class="c">#</span> | 
|  | 1256 <a name="IsUnitLowerTriangular-"></a>1243 <span class="k">sub </span><span class="m">IsUnitLowerTriangular</span> <span class="s">{</span> | 
|  | 1257 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> | 
|  | 1258 1245   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1259 1246 | 
|  | 1260 1247   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1261 1248 | 
|  | 1262 1249   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1263 1250 <span class="s">}</span> | 
|  | 1264 1251 | 
|  | 1265 1252 <span class="c"># Is it a lower unitriangular matrix?</span> | 
|  | 1266 1253 <span class="c">#</span> | 
|  | 1267 <a name="IsLowerUniTriangular-"></a>1254 <span class="k">sub </span><span class="m">IsLowerUniTriangular</span> <span class="s">{</span> | 
|  | 1268 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> | 
|  | 1269 1256 | 
|  | 1270 1257   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnitLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1271 1258 <span class="s">}</span> | 
|  | 1272 1259 | 
|  | 1273 1260 <span class="c"># Is it a lower triangular, strictly lower triangular, or unit lower triangular matrix?</span> | 
|  | 1274 1261 <span class="c">#</span> | 
|  | 1275 <a name="_IsLowerTriangularMatrix-"></a>1262 <span class="k">sub </span><span class="m">_IsLowerTriangularMatrix</span> <span class="s">{</span> | 
|  | 1276 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> | 
|  | 1277 1264 | 
|  | 1278 1265   <span class="c"># Is is a square matrix?</span> | 
|  | 1279 1266   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1280 1267     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1281 1268   <span class="s">}</span> | 
|  | 1282 1269   <span class="c"># Check matrix values...</span> | 
|  | 1283 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> | 
|  | 1284 1271 | 
|  | 1285 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> | 
|  | 1286 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1287 1274 | 
|  | 1288 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> | 
|  | 1289 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> | 
|  | 1290 1277       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> && <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1291 1278         <span class="c"># Main diagonal...</span> | 
|  | 1292 1279         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1293 1280           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1294 1281         <span class="s">}</span> | 
|  | 1295 1282       <span class="s">}</span> | 
|  | 1296 1283       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> < <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1297 1284         <span class="c"># Elemens above the main diagonal...</span> | 
|  | 1298 1285         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1299 1286           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1300 1287         <span class="s">}</span> | 
|  | 1301 1288       <span class="s">}</span> | 
|  | 1302 1289     <span class="s">}</span> | 
|  | 1303 1290   <span class="s">}</span> | 
|  | 1304 1291   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1305 1292 <span class="s">}</span> | 
|  | 1306 1293 | 
|  | 1307 1294 <span class="c"># Is it an upper triangular matrix?</span> | 
|  | 1308 1295 <span class="c">#</span> | 
|  | 1309 1296 <span class="c"># A matrix is an upper triangular matrix:</span> | 
|  | 1310 1297 <span class="c">#   o It's a square matrix</span> | 
|  | 1311 1298 <span class="c">#   o All its entries below the main diagonal are zero</span> | 
|  | 1312 1299 <span class="c">#</span> | 
|  | 1313 <a name="IsUpperTriangular-"></a>1300 <span class="k">sub </span><span class="m">IsUpperTriangular</span> <span class="s">{</span> | 
|  | 1314 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> | 
|  | 1315 1302 | 
|  | 1316 1303   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsUpperTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1317 1304 <span class="s">}</span> | 
|  | 1318 1305 | 
|  | 1319 1306 <span class="c"># Is it a right triangular matrix?</span> | 
|  | 1320 1307 <span class="c">#</span> | 
|  | 1321 1308 <span class="c"># A matrix is a right triangular matrix:</span> | 
|  | 1322 1309 <span class="c">#   o It's a square matrix</span> | 
|  | 1323 1310 <span class="c">#   o All its entries below the main diagonal are zero</span> | 
|  | 1324 1311 <span class="c">#</span> | 
|  | 1325 <a name="IsRightTriangular-"></a>1312 <span class="k">sub </span><span class="m">IsRightTriangular</span> <span class="s">{</span> | 
|  | 1326 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> | 
|  | 1327 1314 | 
|  | 1328 1315   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1329 1316 <span class="s">}</span> | 
|  | 1330 1317 | 
|  | 1331 1318 <span class="c"># Is it a strictly upper triangular matrix?</span> | 
|  | 1332 1319 <span class="c">#</span> | 
|  | 1333 1320 <span class="c"># A matrix is a strictly upper triangular matrix:</span> | 
|  | 1334 1321 <span class="c">#   o It's a square matrix</span> | 
|  | 1335 1322 <span class="c">#   o All its entries on and below the main diagonal are zero</span> | 
|  | 1336 1323 <span class="c">#</span> | 
|  | 1337 <a name="IsStrictlyUpperTriangular-"></a>1324 <span class="k">sub </span><span class="m">IsStrictlyUpperTriangular</span> <span class="s">{</span> | 
|  | 1338 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> | 
|  | 1339 1326   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1340 1327 | 
|  | 1341 1328   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1342 1329 | 
|  | 1343 1330   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1344 1331 <span class="s">}</span> | 
|  | 1345 1332 | 
|  | 1346 1333 <span class="c"># Is it a unit upper triangular matrix?</span> | 
|  | 1347 1334 <span class="c">#</span> | 
|  | 1348 1335 <span class="c"># A matrix is an unit upper triangular matrix:</span> | 
|  | 1349 1336 <span class="c">#   o It's a square matrix</span> | 
|  | 1350 1337 <span class="c">#   o All its entries main diagonal are one</span> | 
|  | 1351 1338 <span class="c">#   o All its entries below the main diagonal are zero</span> | 
|  | 1352 1339 <span class="c">#</span> | 
|  | 1353 <a name="IsUnitUpperTriangular-"></a>1340 <span class="k">sub </span><span class="m">IsUnitUpperTriangular</span> <span class="s">{</span> | 
|  | 1354 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> | 
|  | 1355 1342   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1356 1343 | 
|  | 1357 1344   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 1358 1345 | 
|  | 1359 1346   <span class="k">return</span> <span class="i">$This</span><span class="i">->_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1360 1347 <span class="s">}</span> | 
|  | 1361 1348 | 
|  | 1362 1349 <span class="c"># Is it a upper unitriangular matrix?</span> | 
|  | 1363 1350 <span class="c">#</span> | 
|  | 1364 <a name="IsUpperUniTriangular-"></a>1351 <span class="k">sub </span><span class="m">IsUpperUniTriangular</span> <span class="s">{</span> | 
|  | 1365 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> | 
|  | 1366 1353 | 
|  | 1367 1354   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsUnitUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1368 1355 <span class="s">}</span> | 
|  | 1369 1356 | 
|  | 1370 1357 <span class="c"># Is it an upper triangular, strictly upper triangular, or unit upper triangular matrix?</span> | 
|  | 1371 1358 <span class="c">#</span> | 
|  | 1372 <a name="_IsUpperTriangularMatrix-"></a>1359 <span class="k">sub </span><span class="m">_IsUpperTriangularMatrix</span> <span class="s">{</span> | 
|  | 1373 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> | 
|  | 1374 1361 | 
|  | 1375 1362   <span class="c"># Is is a square matrix?</span> | 
|  | 1376 1363   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1377 1364     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1378 1365   <span class="s">}</span> | 
|  | 1379 1366   <span class="c"># Check matrix values...</span> | 
|  | 1380 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> | 
|  | 1381 1368 | 
|  | 1382 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> | 
|  | 1383 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1384 1371 | 
|  | 1385 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> | 
|  | 1386 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> | 
|  | 1387 1374       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> && <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1388 1375         <span class="c"># Main diagonal...</span> | 
|  | 1389 1376         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1390 1377           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1391 1378         <span class="s">}</span> | 
|  | 1392 1379       <span class="s">}</span> | 
|  | 1393 1380       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> > <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1394 1381         <span class="c"># Elemens below the main diagonal...</span> | 
|  | 1395 1382         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1396 1383           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1397 1384         <span class="s">}</span> | 
|  | 1398 1385       <span class="s">}</span> | 
|  | 1399 1386     <span class="s">}</span> | 
|  | 1400 1387   <span class="s">}</span> | 
|  | 1401 1388   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1402 1389 <span class="s">}</span> | 
|  | 1403 1390 | 
|  | 1404 1391 <span class="c"># Is it a symmetrix matrix?</span> | 
|  | 1405 1392 <span class="c">#</span> | 
|  | 1406 1393 <span class="c"># A matrix is a symmetric matrix:</span> | 
|  | 1407 1394 <span class="c">#   o It's a square matrix</span> | 
|  | 1408 1395 <span class="c">#   o Its elements are symmetric with respect to main diagonal. In other words,</span> | 
|  | 1409 1396 <span class="c">#     elements below the main diagonal are equal to the elements above the main</span> | 
|  | 1410 1397 <span class="c">#     diagonal.</span> | 
|  | 1411 1398 <span class="c">#</span> | 
|  | 1412 1399 <span class="c"># Transpose of a symmetric matrix equals the matrix itself.</span> | 
|  | 1413 1400 <span class="c">#</span> | 
|  | 1414 <a name="IsSymmetric-"></a>1401 <span class="k">sub </span><span class="m">IsSymmetric</span> <span class="s">{</span> | 
|  | 1415 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> | 
|  | 1416 1403 | 
|  | 1417 1404   <span class="c"># Is is a square matrix?</span> | 
|  | 1418 1405   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1419 1406     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1420 1407   <span class="s">}</span> | 
|  | 1421 1408 | 
|  | 1422 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> | 
|  | 1423 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1424 1411 | 
|  | 1425 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> | 
|  | 1426 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> | 
|  | 1427 1414       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1428 1415         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1429 1416       <span class="s">}</span> | 
|  | 1430 1417     <span class="s">}</span> | 
|  | 1431 1418   <span class="s">}</span> | 
|  | 1432 1419   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1433 1420 <span class="s">}</span> | 
|  | 1434 1421 | 
|  | 1435 1422 <span class="c"># Is it a anti symmetrix matrix?</span> | 
|  | 1436 1423 <span class="c">#</span> | 
|  | 1437 1424 <span class="c"># A matrix is an anti symmetric matrix:</span> | 
|  | 1438 1425 <span class="c">#   o It's a square matrix</span> | 
|  | 1439 1426 <span class="c">#   o Its elements are asymmetric with respect to main diagonal. In other words,</span> | 
|  | 1440 1427 <span class="c">#     elements below the main diagonal are equal to the negative of elements above</span> | 
|  | 1441 1428 <span class="c">#     the main diagonal.</span> | 
|  | 1442 1429 <span class="c">#</span> | 
|  | 1443 1430 <span class="c"># Transpose of a anti symmetric matrix equals the negative of the matrix.</span> | 
|  | 1444 1431 <span class="c">#</span> | 
|  | 1445 <a name="IsAntiSymmetric-"></a>1432 <span class="k">sub </span><span class="m">IsAntiSymmetric</span> <span class="s">{</span> | 
|  | 1446 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> | 
|  | 1447 1434 | 
|  | 1448 1435   <span class="c"># Is is a square matrix?</span> | 
|  | 1449 1436   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">->IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1450 1437     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1451 1438   <span class="s">}</span> | 
|  | 1452 1439 | 
|  | 1453 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> | 
|  | 1454 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1455 1442 | 
|  | 1456 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> | 
|  | 1457 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> | 
|  | 1458 1445       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != -<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1459 1446         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1460 1447       <span class="s">}</span> | 
|  | 1461 1448     <span class="s">}</span> | 
|  | 1462 1449   <span class="s">}</span> | 
|  | 1463 1450   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1464 1451 <span class="s">}</span> | 
|  | 1465 1452 | 
|  | 1466 1453 <span class="c"># Is it a skew symmetrix matrix?</span> | 
|  | 1467 1454 <span class="c">#</span> | 
|  | 1468 1455 <span class="c"># It's another name for AnitSymmetricMatrix.</span> | 
|  | 1469 1456 <span class="c">#</span> | 
|  | 1470 <a name="IsSkewSymmetric-"></a>1457 <span class="k">sub </span><span class="m">IsSkewSymmetric</span> <span class="s">{</span> | 
|  | 1471 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> | 
|  | 1472 1459 | 
|  | 1473 1460   <span class="k">return</span> <span class="i">$This</span><span class="i">->IsAntiSymmetric</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1474 1461 <span class="s">}</span> | 
|  | 1475 1462 | 
|  | 1476 1463 <span class="c"># Is it a positive matrix with all its values >= zero?</span> | 
|  | 1477 1464 <span class="c">#</span> | 
|  | 1478 <a name="IsPositive-"></a>1465 <span class="k">sub </span><span class="m">IsPositive</span> <span class="s">{</span> | 
|  | 1479 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> | 
|  | 1480 1467 | 
|  | 1481 1468   <span class="c"># Check matrix values...</span> | 
|  | 1482 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> | 
|  | 1483 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1484 1471 | 
|  | 1485 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> | 
|  | 1486 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> | 
|  | 1487 1474       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1488 1475         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1489 1476       <span class="s">}</span> | 
|  | 1490 1477     <span class="s">}</span> | 
|  | 1491 1478   <span class="s">}</span> | 
|  | 1492 1479   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1493 1480 <span class="s">}</span> | 
|  | 1494 1481 | 
|  | 1495 1482 <span class="c"># Is it a positive matrix with all its values <= zero?</span> | 
|  | 1496 1483 <span class="c">#</span> | 
|  | 1497 <a name="IsNegative-"></a>1484 <span class="k">sub </span><span class="m">IsNegative</span> <span class="s">{</span> | 
|  | 1498 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> | 
|  | 1499 1486 | 
|  | 1500 1487   <span class="k">return</span> <span class="i">$This</span><span class="i">->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> | 
|  | 1501 1488 <span class="s">}</span> | 
|  | 1502 1489 | 
|  | 1503 1490 <span class="c"># Transpose the matrix by swaping rows with columns...</span> | 
|  | 1504 1491 <span class="c">#</span> | 
|  | 1505 <a name="Transpose-"></a>1492 <span class="k">sub </span><span class="m">Transpose</span> <span class="s">{</span> | 
|  | 1506 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> | 
|  | 1507 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> | 
|  | 1508 1495 | 
|  | 1509 1496   <span class="c"># Create the transpose matrix of size $NumOfCols x $NumOfRows</span> | 
|  | 1510 1497   <span class="c">#</span> | 
|  | 1511 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1512 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> | 
|  | 1513 1500 | 
|  | 1514 1501   <span class="c"># Swap rows and columns...</span> | 
|  | 1515 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> | 
|  | 1516 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> | 
|  | 1517 1504       <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span> | 
|  | 1518 1505     <span class="s">}</span> | 
|  | 1519 1506   <span class="s">}</span> | 
|  | 1520 1507   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1521 1508 <span class="s">}</span> | 
|  | 1522 1509 | 
|  | 1523 1510 <span class="c"># Is it a matrix object?</span> | 
|  | 1524 <a name="IsMatrix-"></a>1511 <span class="k">sub </span><span class="m">IsMatrix ($)</span> <span class="s">{</span> | 
|  | 1525 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> | 
|  | 1526 1513 | 
|  | 1527 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> | 
|  | 1528 1515 <span class="s">}</span> | 
|  | 1529 1516 | 
|  | 1530 1517 <span class="c"># Set value print format for an individual object or the whole class during StringifyMatrix operation...</span> | 
|  | 1531 <a name="SetValuePrintFormat-"></a>1518 <span class="k">sub </span><span class="m">SetValuePrintFormat ($;$)</span> <span class="s">{</span> | 
|  | 1532 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> | 
|  | 1533 1520 | 
|  | 1534 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> && <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> | 
|  | 1535 1522     <span class="c"># Set value print format for the specific object...</span> | 
|  | 1536 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> | 
|  | 1537 1524 | 
|  | 1538 1525     <span class="i">$This</span>->{<span class="w">ValueFormat</span>} = <span class="i">$ValuePrintFormat</span><span class="sc">;</span> | 
|  | 1539 1526   <span class="s">}</span> | 
|  | 1540 1527   <span class="k">else</span> <span class="s">{</span> | 
|  | 1541 1528     <span class="c"># Set value print format for the class...</span> | 
|  | 1542 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> | 
|  | 1543 1530 | 
|  | 1544 1531     <span class="i">$ValueFormat</span> = <span class="i">$ValuePrintFormat</span><span class="sc">;</span> | 
|  | 1545 1532   <span class="s">}</span> | 
|  | 1546 1533 <span class="s">}</span> | 
|  | 1547 1534 | 
|  | 1548 1535 <span class="c"># Set print style for matrix rows for an individual object or the whole class during StringifyMatrix</span> | 
|  | 1549 1536 <span class="c"># operation.</span> | 
|  | 1550 1537 <span class="c">#</span> | 
|  | 1551 1538 <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine. Default: AllRowsInOneLine</span> | 
|  | 1552 1539 <span class="c">#</span> | 
|  | 1553 <a name="SetMatrixPrintStyle-"></a>1540 <span class="k">sub </span><span class="m">SetMatrixPrintStyle ($;$)</span> <span class="s">{</span> | 
|  | 1554 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> | 
|  | 1555 1542 | 
|  | 1556 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> && <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> | 
|  | 1557 1544     <span class="c"># Set value print format for the specific object...</span> | 
|  | 1558 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> | 
|  | 1559 1546 | 
|  | 1560 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> | 
|  | 1561 1548       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine..."</span><span class="sc">;</span> | 
|  | 1562 1549     <span class="s">}</span> | 
|  | 1563 1550 | 
|  | 1564 1551     <span class="i">$This</span>->{<span class="w">MatrixPrintStyle</span>} = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span> | 
|  | 1565 1552   <span class="s">}</span> | 
|  | 1566 1553   <span class="k">else</span> <span class="s">{</span> | 
|  | 1567 1554     <span class="c"># Set value print format for the class...</span> | 
|  | 1568 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> | 
|  | 1569 1556 | 
|  | 1570 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> | 
|  | 1571 1558       <span class="w">croak</span> <span class="q">"Error: ${ClassName}::SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine..."</span><span class="sc">;</span> | 
|  | 1572 1559     <span class="s">}</span> | 
|  | 1573 1560 | 
|  | 1574 1561     <span class="i">$MatrixPrintStyle</span> = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span> | 
|  | 1575 1562   <span class="s">}</span> | 
|  | 1576 1563 <span class="s">}</span> | 
|  | 1577 1564 | 
|  | 1578 1565 <span class="c"># Is it a matrix object?</span> | 
|  | 1579 1566 <span class="c">#</span> | 
|  | 1580 <a name="_IsMatrix-"></a>1567 <span class="k">sub </span><span class="m">_IsMatrix</span> <span class="s">{</span> | 
|  | 1581 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> | 
|  | 1582 1569 | 
|  | 1583 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> && <span class="i">$Object</span><span class="i">->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> | 
|  | 1584 1571 <span class="s">}</span> | 
|  | 1585 1572 | 
|  | 1586 1573 <span class="c"># Make sure it's a matrix reference...</span> | 
|  | 1587 1574 <span class="c">#</span> | 
|  | 1588 <a name="_ValidateMatrix-"></a>1575 <span class="k">sub </span><span class="m">_ValidateMatrix</span> <span class="s">{</span> | 
|  | 1589 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> | 
|  | 1590 1577 | 
|  | 1591 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> | 
|  | 1592 1579     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1593 1580   <span class="s">}</span> | 
|  | 1594 1581 <span class="s">}</span> | 
|  | 1595 1582 | 
|  | 1596 1583 <span class="c"># Make sure both row and column indicies are valid...</span> | 
|  | 1597 1584 <span class="c">#</span> | 
|  | 1598 <a name="_ValidateRowAndColumnIndicies-"></a>1585 <span class="k">sub </span><span class="m">_ValidateRowAndColumnIndicies</span> <span class="s">{</span> | 
|  | 1599 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> | 
|  | 1600 1587 | 
|  | 1601 1588   <span class="i">$This</span><span class="i">->_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> | 
|  | 1602 1589   <span class="i">$This</span><span class="i">->_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> | 
|  | 1603 1590 | 
|  | 1604 1591   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1605 1592 <span class="s">}</span> | 
|  | 1606 1593 | 
|  | 1607 1594 <span class="c"># Make sure it's a valid row index...</span> | 
|  | 1608 1595 <span class="c">#</span> | 
|  | 1609 <a name="_ValidateRowIndex-"></a>1596 <span class="k">sub </span><span class="m">_ValidateRowIndex</span> <span class="s">{</span> | 
|  | 1610 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> | 
|  | 1611 1598   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1612 1599 | 
|  | 1613 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> | 
|  | 1614 1601     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: RowIndex must be defined..."</span><span class="sc">;</span> | 
|  | 1615 1602   <span class="s">}</span> | 
|  | 1616 1603   <span class="i">$NumOfRows</span> = <span class="i">$This</span><span class="i">->GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1617 1604   <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> < <span class="n">0</span> || <span class="i">$RowIndex</span> >= <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1618 1605     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: RowIndex value $RowIndex must be >= 0 and < $NumOfRows, NumOfRows, in matrix..."</span><span class="sc">;</span> | 
|  | 1619 1606   <span class="s">}</span> | 
|  | 1620 1607   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1621 1608 <span class="s">}</span> | 
|  | 1622 1609 | 
|  | 1623 1610 <span class="c"># Make sure it's a valid column index...</span> | 
|  | 1624 1611 <span class="c">#</span> | 
|  | 1625 <a name="_ValidateColumnIndex-"></a>1612 <span class="k">sub </span><span class="m">_ValidateColumnIndex</span> <span class="s">{</span> | 
|  | 1626 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> | 
|  | 1627 1614   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1628 1615 | 
|  | 1629 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> | 
|  | 1630 1617     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: ColIndex must be defined..."</span><span class="sc">;</span> | 
|  | 1631 1618   <span class="s">}</span> | 
|  | 1632 1619   <span class="i">$NumOfCols</span> = <span class="i">$This</span><span class="i">->GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1633 1620   <span class="k">if</span> <span class="s">(</span><span class="i">$ColIndex</span> < <span class="n">0</span> || <span class="i">$ColIndex</span> >= <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1634 1621     <span class="w">croak</span> <span class="q">"$ErrorMsgPrefix: ColIndex value $ColIndex must be >= 0 and < $NumOfCols, NumOfCols, in matrix..."</span><span class="sc">;</span> | 
|  | 1635 1622   <span class="s">}</span> | 
|  | 1636 1623   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span> | 
|  | 1637 1624 <span class="s">}</span> | 
|  | 1638 1625 | 
|  | 1639 1626 <span class="c">#</span> | 
|  | 1640 1627 <span class="c"># Matrix addition operator supports two addition modes:</span> | 
|  | 1641 1628 <span class="c">#   . Addition of two matrices by adding corresponding matrix values</span> | 
|  | 1642 1629 <span class="c">#   . Addition of a scalar value to matrix values ($Matrix + 1)</span> | 
|  | 1643 1630 <span class="c">#</span> | 
|  | 1644 1631 <span class="c"># Caveats:</span> | 
|  | 1645 1632 <span class="c">#   . Addition of a matrix to scalar is not allowed (1 + $Matrix)</span> | 
|  | 1646 1633 <span class="c">#</span> | 
|  | 1647 <a name="_MatrixAdditionOperator-"></a>1634 <span class="k">sub </span><span class="m">_MatrixAdditionOperator</span> <span class="s">{</span> | 
|  | 1648 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> | 
|  | 1649 1636 | 
|  | 1650 1637   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixAdditionOperator: Matrix addition failed"</span><span class="sc">;</span> | 
|  | 1651 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> | 
|  | 1652 1639 | 
|  | 1653 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> | 
|  | 1654 1641 | 
|  | 1655 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1656 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> | 
|  | 1657 1644 | 
|  | 1658 1645   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1659 1646     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1660 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> | 
|  | 1661 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> | 
|  | 1662 1649         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1663 1650       <span class="s">}</span> | 
|  | 1664 1651     <span class="s">}</span> | 
|  | 1665 1652   <span class="s">}</span> | 
|  | 1666 1653   <span class="k">else</span> <span class="s">{</span> | 
|  | 1667 1654     <span class="c"># Scalar addition...</span> | 
|  | 1668 1655     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1669 1656       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1670 1657     <span class="s">}</span> | 
|  | 1671 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> | 
|  | 1672 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> | 
|  | 1673 1660         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1674 1661       <span class="s">}</span> | 
|  | 1675 1662     <span class="s">}</span> | 
|  | 1676 1663   <span class="s">}</span> | 
|  | 1677 1664   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1678 1665 <span class="s">}</span> | 
|  | 1679 1666 | 
|  | 1680 1667 <span class="c">#</span> | 
|  | 1681 1668 <span class="c"># Matrix subtraction operator supports two subtraction modes:</span> | 
|  | 1682 1669 <span class="c">#   . Subtraction of two matrices by subtracting corresponding matrix values</span> | 
|  | 1683 1670 <span class="c">#   . Subtraction of a scalar value from matrix values ($Matrix - 1)</span> | 
|  | 1684 1671 <span class="c">#</span> | 
|  | 1685 1672 <span class="c"># Caveats:</span> | 
|  | 1686 1673 <span class="c">#   . Subtraction of a matrix from scalar is not allowed (1 - $Matrix)</span> | 
|  | 1687 1674 <span class="c">#</span> | 
|  | 1688 <a name="_MatrixSubtractionOperator-"></a>1675 <span class="k">sub </span><span class="m">_MatrixSubtractionOperator</span> <span class="s">{</span> | 
|  | 1689 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> | 
|  | 1690 1677 | 
|  | 1691 1678   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixSubtractionOperator: Matrix subtraction failed"</span><span class="sc">;</span> | 
|  | 1692 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> | 
|  | 1693 1680 | 
|  | 1694 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> | 
|  | 1695 1682 | 
|  | 1696 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1697 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> | 
|  | 1698 1685 | 
|  | 1699 1686   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1700 1687     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1701 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> | 
|  | 1702 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> | 
|  | 1703 1690         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1704 1691       <span class="s">}</span> | 
|  | 1705 1692     <span class="s">}</span> | 
|  | 1706 1693   <span class="s">}</span> | 
|  | 1707 1694   <span class="k">else</span> <span class="s">{</span> | 
|  | 1708 1695     <span class="c"># Scalar subtraction...</span> | 
|  | 1709 1696     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1710 1697       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1711 1698     <span class="s">}</span> | 
|  | 1712 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> | 
|  | 1713 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> | 
|  | 1714 1701         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1715 1702       <span class="s">}</span> | 
|  | 1716 1703     <span class="s">}</span> | 
|  | 1717 1704   <span class="s">}</span> | 
|  | 1718 1705   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1719 1706 <span class="s">}</span> | 
|  | 1720 1707 | 
|  | 1721 1708 <span class="c">#</span> | 
|  | 1722 1709 <span class="c"># Matrix multiplication operator supports two multiplication modes:</span> | 
|  | 1723 1710 <span class="c">#   . Multiplication of two matrices</span> | 
|  | 1724 1711 <span class="c">#   . Multiplication of matrix values by a scalar ($Matrix * 1)</span> | 
|  | 1725 1712 <span class="c">#</span> | 
|  | 1726 1713 <span class="c"># Caveats:</span> | 
|  | 1727 1714 <span class="c">#   . Multiplication of a scalar by a is not allowed (1 * $Matrix)</span> | 
|  | 1728 1715 <span class="c">#</span> | 
|  | 1729 <a name="_MatrixMultiplicationOperator-"></a>1716 <span class="k">sub </span><span class="m">_MatrixMultiplicationOperator</span> <span class="s">{</span> | 
|  | 1730 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> | 
|  | 1731 1718 | 
|  | 1732 1719   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixMultiplicationOperator: Matrix multiplication failed"</span><span class="sc">;</span> | 
|  | 1733 1720   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1734 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> | 
|  | 1735 1722 | 
|  | 1736 1723   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1737 1724 | 
|  | 1738 1725   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1739 1726     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1740 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> | 
|  | 1741 1728 | 
|  | 1742 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1743 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1744 1731 | 
|  | 1745 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> | 
|  | 1746 1733       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: NumOfCols in first matrix of size $NumOfRows1 x $NumOfCols1 must be equal to NumOfRows in second matrix of size $NumOfRows2 x $NumOfCols2..."</span><span class="sc">;</span> | 
|  | 1747 1734     <span class="s">}</span> | 
|  | 1748 1735 | 
|  | 1749 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> | 
|  | 1750 1737 | 
|  | 1751 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> | 
|  | 1752 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> | 
|  | 1753 1740         <span class="i">$Value</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1754 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> | 
|  | 1755 1742           <span class="i">$Value</span> += <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$RowColIndex</span>] * <span class="i">$Other</span>->[<span class="i">$RowColIndex</span>][<span class="i">$ColIndex2</span>]<span class="sc">;</span> | 
|  | 1756 1743         <span class="s">}</span> | 
|  | 1757 1744         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$ColIndex2</span>] = <span class="i">$Value</span><span class="sc">;</span> | 
|  | 1758 1745       <span class="s">}</span> | 
|  | 1759 1746     <span class="s">}</span> | 
|  | 1760 1747   <span class="s">}</span> | 
|  | 1761 1748   <span class="k">else</span> <span class="s">{</span> | 
|  | 1762 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> | 
|  | 1763 1750 | 
|  | 1764 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1765 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> | 
|  | 1766 1753     <span class="c"># Scalar subtraction...</span> | 
|  | 1767 1754     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1768 1755       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1769 1756     <span class="s">}</span> | 
|  | 1770 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> | 
|  | 1771 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> | 
|  | 1772 1759         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] * <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1773 1760       <span class="s">}</span> | 
|  | 1774 1761     <span class="s">}</span> | 
|  | 1775 1762   <span class="s">}</span> | 
|  | 1776 1763   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1777 1764 <span class="s">}</span> | 
|  | 1778 1765 | 
|  | 1779 1766 <span class="c">#</span> | 
|  | 1780 1767 <span class="c"># Matrix division operator supports two division modes:</span> | 
|  | 1781 1768 <span class="c">#   . Division of two matrices by dividing corresponding matrix values</span> | 
|  | 1782 1769 <span class="c">#   . Division matrix values  by a scalar($Matrix/2)</span> | 
|  | 1783 1770 <span class="c">#</span> | 
|  | 1784 1771 <span class="c"># Caveats:</span> | 
|  | 1785 1772 <span class="c">#   . Division of scalar value by a matrix is not allowed (2/$Matrix)</span> | 
|  | 1786 1773 <span class="c">#</span> | 
|  | 1787 <a name="_MatrixDivisionOperator-"></a>1774 <span class="k">sub </span><span class="m">_MatrixDivisionOperator</span> <span class="s">{</span> | 
|  | 1788 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> | 
|  | 1789 1776 | 
|  | 1790 1777   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixDivisionOperator: Matrix division failed"</span><span class="sc">;</span> | 
|  | 1791 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> | 
|  | 1792 1779 | 
|  | 1793 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> | 
|  | 1794 1781 | 
|  | 1795 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1796 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> | 
|  | 1797 1784 | 
|  | 1798 1785   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1799 1786     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1800 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> | 
|  | 1801 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> | 
|  | 1802 1789         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1803 1790       <span class="s">}</span> | 
|  | 1804 1791     <span class="s">}</span> | 
|  | 1805 1792   <span class="s">}</span> | 
|  | 1806 1793   <span class="k">else</span> <span class="s">{</span> | 
|  | 1807 1794     <span class="c"># Scalar subtraction...</span> | 
|  | 1808 1795     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1809 1796       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1810 1797     <span class="s">}</span> | 
|  | 1811 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> | 
|  | 1812 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> | 
|  | 1813 1800         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1814 1801       <span class="s">}</span> | 
|  | 1815 1802     <span class="s">}</span> | 
|  | 1816 1803   <span class="s">}</span> | 
|  | 1817 1804   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1818 1805 <span class="s">}</span> | 
|  | 1819 1806 | 
|  | 1820 1807 <span class="c">#</span> | 
|  | 1821 1808 <span class="c"># Matrix exponentiation operator supports two division modes:</span> | 
|  | 1822 1809 <span class="c">#   . Exponent of two matrices by exponentiation of corresponding matrix values</span> | 
|  | 1823 1810 <span class="c">#   . Exponentiation matrix values  by a scalar ($Matrix ** 2)</span> | 
|  | 1824 1811 <span class="c">#</span> | 
|  | 1825 1812 <span class="c"># Caveats:</span> | 
|  | 1826 1813 <span class="c">#   . Exponentiation of scalar value by a matrix is not allowed (2 ** $Matrix)</span> | 
|  | 1827 1814 <span class="c">#</span> | 
|  | 1828 <a name="_MatrixExponentiationOperator-"></a>1815 <span class="k">sub </span><span class="m">_MatrixExponentiationOperator</span> <span class="s">{</span> | 
|  | 1829 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> | 
|  | 1830 1817 | 
|  | 1831 1818   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixExponentiationOperator: Matrix exponentiation failed"</span><span class="sc">;</span> | 
|  | 1832 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> | 
|  | 1833 1820 | 
|  | 1834 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> | 
|  | 1835 1822 | 
|  | 1836 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1837 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> | 
|  | 1838 1825 | 
|  | 1839 1826   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1840 1827     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1841 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> | 
|  | 1842 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> | 
|  | 1843 1830         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1844 1831       <span class="s">}</span> | 
|  | 1845 1832     <span class="s">}</span> | 
|  | 1846 1833   <span class="s">}</span> | 
|  | 1847 1834   <span class="k">else</span> <span class="s">{</span> | 
|  | 1848 1835     <span class="c"># Scalar subtraction...</span> | 
|  | 1849 1836     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1850 1837       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1851 1838     <span class="s">}</span> | 
|  | 1852 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> | 
|  | 1853 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> | 
|  | 1854 1841         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1855 1842       <span class="s">}</span> | 
|  | 1856 1843     <span class="s">}</span> | 
|  | 1857 1844   <span class="s">}</span> | 
|  | 1858 1845   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1859 1846 <span class="s">}</span> | 
|  | 1860 1847 | 
|  | 1861 1848 <span class="c">#</span> | 
|  | 1862 1849 <span class="c"># Matrix modulus operator supports two division modes:</span> | 
|  | 1863 1850 <span class="c">#   . Modulus of two matrices by taking modulus between corresponding matrix values</span> | 
|  | 1864 1851 <span class="c">#   . Modulus of matrix values  by a scalar ($Matrix % 2)</span> | 
|  | 1865 1852 <span class="c">#</span> | 
|  | 1866 1853 <span class="c"># Caveats:</span> | 
|  | 1867 1854 <span class="c">#   . Modulus of scalar value by a matrix is not allowed (2 % $Matrix)</span> | 
|  | 1868 1855 <span class="c">#</span> | 
|  | 1869 <a name="_MatrixModulusOperator-"></a>1856 <span class="k">sub </span><span class="m">_MatrixModulusOperator</span> <span class="s">{</span> | 
|  | 1870 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> | 
|  | 1871 1858 | 
|  | 1872 1859   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixModulusOperator: Matrix modulus failed"</span><span class="sc">;</span> | 
|  | 1873 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> | 
|  | 1874 1861 | 
|  | 1875 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> | 
|  | 1876 1863 | 
|  | 1877 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1878 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> | 
|  | 1879 1866 | 
|  | 1880 1867   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1881 1868     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1882 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> | 
|  | 1883 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> | 
|  | 1884 1871         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 1885 1872       <span class="s">}</span> | 
|  | 1886 1873     <span class="s">}</span> | 
|  | 1887 1874   <span class="s">}</span> | 
|  | 1888 1875   <span class="k">else</span> <span class="s">{</span> | 
|  | 1889 1876     <span class="c"># Scalar subtraction...</span> | 
|  | 1890 1877     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1891 1878       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1892 1879     <span class="s">}</span> | 
|  | 1893 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> | 
|  | 1894 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> | 
|  | 1895 1882         <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span><span class="sc">;</span> | 
|  | 1896 1883       <span class="s">}</span> | 
|  | 1897 1884     <span class="s">}</span> | 
|  | 1898 1885   <span class="s">}</span> | 
|  | 1899 1886   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 1900 1887 <span class="s">}</span> | 
|  | 1901 1888 | 
|  | 1902 1889 <span class="c">#</span> | 
|  | 1903 1890 <span class="c"># Matrix booelan operator checks whether a matrix contains at least one non-zero</span> | 
|  | 1904 1891 <span class="c"># value...</span> | 
|  | 1905 1892 <span class="c">#</span> | 
|  | 1906 <a name="_MatrixBooleanOperator-"></a>1893 <span class="k">sub </span><span class="m">_MatrixBooleanOperator</span> <span class="s">{</span> | 
|  | 1907 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> | 
|  | 1908 1895 | 
|  | 1909 1896   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixBooleanOperator: Matrix boolean operation failed"</span><span class="sc">;</span> | 
|  | 1910 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> | 
|  | 1911 1898 | 
|  | 1912 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> | 
|  | 1913 1900 | 
|  | 1914 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1915 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> | 
|  | 1916 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> | 
|  | 1917 1904       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1918 1905         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1919 1906       <span class="s">}</span> | 
|  | 1920 1907     <span class="s">}</span> | 
|  | 1921 1908   <span class="s">}</span> | 
|  | 1922 1909   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1923 1910 <span class="s">}</span> | 
|  | 1924 1911 | 
|  | 1925 1912 <span class="c">#</span> | 
|  | 1926 1913 <span class="c"># Matrix not booelan operator checks whether a matrix contains only zero values...</span> | 
|  | 1927 1914 <span class="c"># value...</span> | 
|  | 1928 1915 <span class="c">#</span> | 
|  | 1929 <a name="_MatrixNotBooleanOperator-"></a>1916 <span class="k">sub </span><span class="m">_MatrixNotBooleanOperator</span> <span class="s">{</span> | 
|  | 1930 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> | 
|  | 1931 1918 | 
|  | 1932 1919   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixNotBooleanOperator: Matrix not boolean operation failed"</span><span class="sc">;</span> | 
|  | 1933 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> | 
|  | 1934 1921 | 
|  | 1935 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> | 
|  | 1936 1923 | 
|  | 1937 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1938 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> | 
|  | 1939 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> | 
|  | 1940 1927       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1941 1928         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1942 1929       <span class="s">}</span> | 
|  | 1943 1930     <span class="s">}</span> | 
|  | 1944 1931   <span class="s">}</span> | 
|  | 1945 1932   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 1946 1933 <span class="s">}</span> | 
|  | 1947 1934 | 
|  | 1948 1935 <span class="c">#</span> | 
|  | 1949 1936 <span class="c"># Matrix equal operator supports two modes:</span> | 
|  | 1950 1937 <span class="c">#   . Comparison of corresponding values in two matrices</span> | 
|  | 1951 1938 <span class="c">#   . Comparing matrix values to a scalar ($Matrix == 2)</span> | 
|  | 1952 1939 <span class="c">#</span> | 
|  | 1953 1940 <span class="c"># Caveats:</span> | 
|  | 1954 1941 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 == $Matrix)</span> | 
|  | 1955 1942 <span class="c">#</span> | 
|  | 1956 <a name="_MatrixEqualOperator-"></a>1943 <span class="k">sub </span><span class="m">_MatrixEqualOperator</span> <span class="s">{</span> | 
|  | 1957 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> | 
|  | 1958 1945 | 
|  | 1959 1946   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixEqualOperator: Matrix equal failed"</span><span class="sc">;</span> | 
|  | 1960 1947   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 1961 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> | 
|  | 1962 1949 | 
|  | 1963 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> | 
|  | 1964 1951 | 
|  | 1965 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1966 1953 | 
|  | 1967 1954   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1968 1955     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 1969 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> | 
|  | 1970 1957 | 
|  | 1971 1958     <span class="c"># Check sizes...</span> | 
|  | 1972 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 1973 1960     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1974 1961       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1975 1962     <span class="s">}</span> | 
|  | 1976 1963 | 
|  | 1977 1964     <span class="c"># Check values...</span> | 
|  | 1978 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> | 
|  | 1979 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> | 
|  | 1980 1967         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 1981 1968           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1982 1969         <span class="s">}</span> | 
|  | 1983 1970       <span class="s">}</span> | 
|  | 1984 1971     <span class="s">}</span> | 
|  | 1985 1972   <span class="s">}</span> | 
|  | 1986 1973   <span class="k">else</span> <span class="s">{</span> | 
|  | 1987 1974     <span class="c"># Scalar comparison...</span> | 
|  | 1988 1975     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 1989 1976       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 1990 1977     <span class="s">}</span> | 
|  | 1991 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> | 
|  | 1992 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> | 
|  | 1993 1980         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 1994 1981           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 1995 1982         <span class="s">}</span> | 
|  | 1996 1983       <span class="s">}</span> | 
|  | 1997 1984     <span class="s">}</span> | 
|  | 1998 1985   <span class="s">}</span> | 
|  | 1999 1986   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2000 1987 <span class="s">}</span> | 
|  | 2001 1988 | 
|  | 2002 1989 <span class="c">#</span> | 
|  | 2003 1990 <span class="c"># Matrix not equal operator supports two modes:</span> | 
|  | 2004 1991 <span class="c">#   . Comparison of corresponding values in two matrices</span> | 
|  | 2005 1992 <span class="c">#   . Comparing matrix values to a scalar ($Matrix != 2)</span> | 
|  | 2006 1993 <span class="c">#</span> | 
|  | 2007 1994 <span class="c"># Caveats:</span> | 
|  | 2008 1995 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 != $Matrix)</span> | 
|  | 2009 1996 <span class="c">#</span> | 
|  | 2010 <a name="_MatrixNotEqualOperator-"></a>1997 <span class="k">sub </span><span class="m">_MatrixNotEqualOperator</span> <span class="s">{</span> | 
|  | 2011 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> | 
|  | 2012 1999 | 
|  | 2013 2000   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixNotEqualOperator: Matrix not equal failed"</span><span class="sc">;</span> | 
|  | 2014 2001   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2015 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> | 
|  | 2016 2003 | 
|  | 2017 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> | 
|  | 2018 2005 | 
|  | 2019 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2020 2007 | 
|  | 2021 2008   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2022 2009     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 2023 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> | 
|  | 2024 2011 | 
|  | 2025 2012     <span class="c"># Check sizes...</span> | 
|  | 2026 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2027 2014     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2028 2015       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2029 2016     <span class="s">}</span> | 
|  | 2030 2017 | 
|  | 2031 2018     <span class="c"># Check values...</span> | 
|  | 2032 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> | 
|  | 2033 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> | 
|  | 2034 2021         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] == <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 2035 2022           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2036 2023         <span class="s">}</span> | 
|  | 2037 2024       <span class="s">}</span> | 
|  | 2038 2025     <span class="s">}</span> | 
|  | 2039 2026   <span class="s">}</span> | 
|  | 2040 2027   <span class="k">else</span> <span class="s">{</span> | 
|  | 2041 2028     <span class="c"># Scalar comparison...</span> | 
|  | 2042 2029     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2043 2030       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 2044 2031     <span class="s">}</span> | 
|  | 2045 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> | 
|  | 2046 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> | 
|  | 2047 2034         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 2048 2035           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2049 2036         <span class="s">}</span> | 
|  | 2050 2037       <span class="s">}</span> | 
|  | 2051 2038     <span class="s">}</span> | 
|  | 2052 2039   <span class="s">}</span> | 
|  | 2053 2040   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2054 2041 <span class="s">}</span> | 
|  | 2055 2042 | 
|  | 2056 2043 <span class="c">#</span> | 
|  | 2057 2044 <span class="c"># Matrix less than operator supports two modes:</span> | 
|  | 2058 2045 <span class="c">#   . Comparison of corresponding values in two matrices</span> | 
|  | 2059 2046 <span class="c">#   . Comparing matrix values to a scalar ($Matrix < 2)</span> | 
|  | 2060 2047 <span class="c">#</span> | 
|  | 2061 2048 <span class="c"># Caveats:</span> | 
|  | 2062 2049 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 < $Matrix)</span> | 
|  | 2063 2050 <span class="c">#</span> | 
|  | 2064 <a name="_MatrixLessThanOperator-"></a>2051 <span class="k">sub </span><span class="m">_MatrixLessThanOperator</span> <span class="s">{</span> | 
|  | 2065 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> | 
|  | 2066 2053 | 
|  | 2067 2054   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixLessThanOperator: Matrix less than failed"</span><span class="sc">;</span> | 
|  | 2068 2055   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2069 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> | 
|  | 2070 2057 | 
|  | 2071 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> | 
|  | 2072 2059 | 
|  | 2073 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2074 2061 | 
|  | 2075 2062   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2076 2063     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 2077 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> | 
|  | 2078 2065 | 
|  | 2079 2066     <span class="c"># Check sizes...</span> | 
|  | 2080 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2081 2068     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2082 2069       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2083 2070     <span class="s">}</span> | 
|  | 2084 2071 | 
|  | 2085 2072     <span class="c"># Check values...</span> | 
|  | 2086 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> | 
|  | 2087 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> | 
|  | 2088 2075         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] >= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 2089 2076           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2090 2077         <span class="s">}</span> | 
|  | 2091 2078       <span class="s">}</span> | 
|  | 2092 2079     <span class="s">}</span> | 
|  | 2093 2080   <span class="s">}</span> | 
|  | 2094 2081   <span class="k">else</span> <span class="s">{</span> | 
|  | 2095 2082     <span class="c"># Scalar comparison...</span> | 
|  | 2096 2083     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2097 2084       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 2098 2085     <span class="s">}</span> | 
|  | 2099 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> | 
|  | 2100 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> | 
|  | 2101 2088         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 2102 2089           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2103 2090         <span class="s">}</span> | 
|  | 2104 2091       <span class="s">}</span> | 
|  | 2105 2092     <span class="s">}</span> | 
|  | 2106 2093   <span class="s">}</span> | 
|  | 2107 2094   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2108 2095 <span class="s">}</span> | 
|  | 2109 2096 | 
|  | 2110 2097 <span class="c">#</span> | 
|  | 2111 2098 <span class="c"># Matrix less than equal operator supports two modes:</span> | 
|  | 2112 2099 <span class="c">#   . Comparion of corresponding values in two matrices</span> | 
|  | 2113 2100 <span class="c">#   . Comparing matrix values to a scalar ($Matrix <= 2)</span> | 
|  | 2114 2101 <span class="c">#</span> | 
|  | 2115 2102 <span class="c"># Caveats:</span> | 
|  | 2116 2103 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 <= $Matrix)</span> | 
|  | 2117 2104 <span class="c">#</span> | 
|  | 2118 <a name="_MatrixLessThanEqualOperator-"></a>2105 <span class="k">sub </span><span class="m">_MatrixLessThanEqualOperator</span> <span class="s">{</span> | 
|  | 2119 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> | 
|  | 2120 2107 | 
|  | 2121 2108   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixLessThanEqualOperator: Matrix less than equal failed"</span><span class="sc">;</span> | 
|  | 2122 2109   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2123 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> | 
|  | 2124 2111 | 
|  | 2125 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> | 
|  | 2126 2113 | 
|  | 2127 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2128 2115 | 
|  | 2129 2116   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2130 2117     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 2131 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> | 
|  | 2132 2119 | 
|  | 2133 2120     <span class="c"># Check sizes...</span> | 
|  | 2134 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2135 2122     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2136 2123       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2137 2124     <span class="s">}</span> | 
|  | 2138 2125 | 
|  | 2139 2126     <span class="c"># Check values...</span> | 
|  | 2140 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> | 
|  | 2141 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> | 
|  | 2142 2129         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] > <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 2143 2130           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2144 2131         <span class="s">}</span> | 
|  | 2145 2132       <span class="s">}</span> | 
|  | 2146 2133     <span class="s">}</span> | 
|  | 2147 2134   <span class="s">}</span> | 
|  | 2148 2135   <span class="k">else</span> <span class="s">{</span> | 
|  | 2149 2136     <span class="c"># Scalar comparison...</span> | 
|  | 2150 2137     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2151 2138       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 2152 2139     <span class="s">}</span> | 
|  | 2153 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> | 
|  | 2154 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> | 
|  | 2155 2142         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 2156 2143           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2157 2144         <span class="s">}</span> | 
|  | 2158 2145       <span class="s">}</span> | 
|  | 2159 2146     <span class="s">}</span> | 
|  | 2160 2147   <span class="s">}</span> | 
|  | 2161 2148   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2162 2149 <span class="s">}</span> | 
|  | 2163 2150 | 
|  | 2164 2151 <span class="c">#</span> | 
|  | 2165 2152 <span class="c"># Matrix greatar than operator supports two modes:</span> | 
|  | 2166 2153 <span class="c">#   . Comparison of corresponding values in two matrices</span> | 
|  | 2167 2154 <span class="c">#   . Comparing matrix values to a scalar ($Matrix > 2)</span> | 
|  | 2168 2155 <span class="c">#</span> | 
|  | 2169 2156 <span class="c"># Caveats:</span> | 
|  | 2170 2157 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 > $Matrix)</span> | 
|  | 2171 2158 <span class="c">#</span> | 
|  | 2172 <a name="_MatrixGreatarThanOperator-"></a>2159 <span class="k">sub </span><span class="m">_MatrixGreatarThanOperator</span> <span class="s">{</span> | 
|  | 2173 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> | 
|  | 2174 2161 | 
|  | 2175 2162   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixGreatarThanOperator: Matrix greatar than failed"</span><span class="sc">;</span> | 
|  | 2176 2163   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2177 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> | 
|  | 2178 2165 | 
|  | 2179 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> | 
|  | 2180 2167 | 
|  | 2181 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2182 2169 | 
|  | 2183 2170   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2184 2171     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 2185 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> | 
|  | 2186 2173 | 
|  | 2187 2174     <span class="c"># Check sizes...</span> | 
|  | 2188 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2189 2176     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2190 2177       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2191 2178     <span class="s">}</span> | 
|  | 2192 2179 | 
|  | 2193 2180     <span class="c"># Check values...</span> | 
|  | 2194 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> | 
|  | 2195 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> | 
|  | 2196 2183         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] <= <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 2197 2184           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2198 2185         <span class="s">}</span> | 
|  | 2199 2186       <span class="s">}</span> | 
|  | 2200 2187     <span class="s">}</span> | 
|  | 2201 2188   <span class="s">}</span> | 
|  | 2202 2189   <span class="k">else</span> <span class="s">{</span> | 
|  | 2203 2190     <span class="c"># Scalar comparison...</span> | 
|  | 2204 2191     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2205 2192       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 2206 2193     <span class="s">}</span> | 
|  | 2207 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> | 
|  | 2208 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> | 
|  | 2209 2196         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 2210 2197           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2211 2198         <span class="s">}</span> | 
|  | 2212 2199       <span class="s">}</span> | 
|  | 2213 2200     <span class="s">}</span> | 
|  | 2214 2201   <span class="s">}</span> | 
|  | 2215 2202   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2216 2203 <span class="s">}</span> | 
|  | 2217 2204 | 
|  | 2218 2205 <span class="c">#</span> | 
|  | 2219 2206 <span class="c"># Matrix greatar than equal operator supports two modes:</span> | 
|  | 2220 2207 <span class="c">#   . Comparison of corresponding values in two matrices</span> | 
|  | 2221 2208 <span class="c">#   . Comparing matrix values to a scalar ($Matrix >= 2)</span> | 
|  | 2222 2209 <span class="c">#</span> | 
|  | 2223 2210 <span class="c"># Caveats:</span> | 
|  | 2224 2211 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 >= $Matrix)</span> | 
|  | 2225 2212 <span class="c">#</span> | 
|  | 2226 <a name="_MatrixGreatarThanEqualOperator-"></a>2213 <span class="k">sub </span><span class="m">_MatrixGreatarThanEqualOperator</span> <span class="s">{</span> | 
|  | 2227 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> | 
|  | 2228 2215 | 
|  | 2229 2216   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixGreatarThanEqualOperator: Matrix greatar than equal failed"</span><span class="sc">;</span> | 
|  | 2230 2217   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2231 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> | 
|  | 2232 2219 | 
|  | 2233 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> | 
|  | 2234 2221 | 
|  | 2235 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2236 2223 | 
|  | 2237 2224   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2238 2225     <span class="c"># $OrderFlipped is set to false for two matrices...</span> | 
|  | 2239 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> | 
|  | 2240 2227 | 
|  | 2241 2228     <span class="c"># Check sizes...</span> | 
|  | 2242 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2243 2230     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> && <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2244 2231       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2245 2232     <span class="s">}</span> | 
|  | 2246 2233 | 
|  | 2247 2234     <span class="c"># Check values...</span> | 
|  | 2248 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> | 
|  | 2249 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> | 
|  | 2250 2237         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] < <span class="i">$Other</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span> | 
|  | 2251 2238           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2252 2239         <span class="s">}</span> | 
|  | 2253 2240       <span class="s">}</span> | 
|  | 2254 2241     <span class="s">}</span> | 
|  | 2255 2242   <span class="s">}</span> | 
|  | 2256 2243   <span class="k">else</span> <span class="s">{</span> | 
|  | 2257 2244     <span class="c"># Scalar comparison...</span> | 
|  | 2258 2245     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2259 2246       <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: First object must be a matrix..."</span><span class="sc">;</span> | 
|  | 2260 2247     <span class="s">}</span> | 
|  | 2261 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> | 
|  | 2262 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> | 
|  | 2263 2250         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>->{<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> | 
|  | 2264 2251           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span> | 
|  | 2265 2252         <span class="s">}</span> | 
|  | 2266 2253       <span class="s">}</span> | 
|  | 2267 2254     <span class="s">}</span> | 
|  | 2268 2255   <span class="s">}</span> | 
|  | 2269 2256   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2270 2257 <span class="s">}</span> | 
|  | 2271 2258 | 
|  | 2272 2259 <span class="c">#</span> | 
|  | 2273 2260 <span class="c"># Matrix negative value operator returns a matrix with values corresponding to</span> | 
|  | 2274 2261 <span class="c"># negative values of a matrix</span> | 
|  | 2275 2262 <span class="c">#</span> | 
|  | 2276 <a name="_MatrixNegativeValueOperator-"></a>2263 <span class="k">sub </span><span class="m">_MatrixNegativeValueOperator</span> <span class="s">{</span> | 
|  | 2277 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> | 
|  | 2278 2265 | 
|  | 2279 2266   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixNegativeValueOperator: Matrix negative value operation failed"</span><span class="sc">;</span> | 
|  | 2280 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> | 
|  | 2281 2268 | 
|  | 2282 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> | 
|  | 2283 2270 | 
|  | 2284 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2285 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> | 
|  | 2286 2273 | 
|  | 2287 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> | 
|  | 2288 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> | 
|  | 2289 2276       <span class="i">$Matrix</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = - <span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2290 2277     <span class="s">}</span> | 
|  | 2291 2278   <span class="s">}</span> | 
|  | 2292 2279   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2293 2280 <span class="s">}</span> | 
|  | 2294 2281 | 
|  | 2295 2282 <span class="c">#</span> | 
|  | 2296 2283 <span class="c"># Matrix absolute value operator returns a matrix with values corresponding to</span> | 
|  | 2297 2284 <span class="c"># absolute values of a matrix</span> | 
|  | 2298 2285 <span class="c">#</span> | 
|  | 2299 <a name="_MatrixAbsoluteValueOperator-"></a>2286 <span class="k">sub </span><span class="m">_MatrixAbsoluteValueOperator</span> <span class="s">{</span> | 
|  | 2300 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> | 
|  | 2301 2288 | 
|  | 2302 2289   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixAbsoluteValueOperator: Matrix absolute value operation failed"</span><span class="sc">;</span> | 
|  | 2303 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> | 
|  | 2304 2291 | 
|  | 2305 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> | 
|  | 2306 2293 | 
|  | 2307 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2308 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> | 
|  | 2309 2296 | 
|  | 2310 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> | 
|  | 2311 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> | 
|  | 2312 2299       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2313 2300     <span class="s">}</span> | 
|  | 2314 2301   <span class="s">}</span> | 
|  | 2315 2302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2316 2303 <span class="s">}</span> | 
|  | 2317 2304 | 
|  | 2318 2305 <span class="c">#</span> | 
|  | 2319 2306 <span class="c"># Matrix exp natural base operator returns a matrix with values corresponding to</span> | 
|  | 2320 2307 <span class="c"># e raised to the power of values in a matrix</span> | 
|  | 2321 2308 <span class="c">#</span> | 
|  | 2322 <a name="_MatrixExpNaturalBaseOperator-"></a>2309 <span class="k">sub </span><span class="m">_MatrixExpNaturalBaseOperator</span> <span class="s">{</span> | 
|  | 2323 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> | 
|  | 2324 2311 | 
|  | 2325 2312   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixExpNaturalBaseOperator: Matrix exp operation failed"</span><span class="sc">;</span> | 
|  | 2326 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> | 
|  | 2327 2314 | 
|  | 2328 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> | 
|  | 2329 2316 | 
|  | 2330 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2331 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> | 
|  | 2332 2319 | 
|  | 2333 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> | 
|  | 2334 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> | 
|  | 2335 2322       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2336 2323     <span class="s">}</span> | 
|  | 2337 2324   <span class="s">}</span> | 
|  | 2338 2325   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2339 2326 <span class="s">}</span> | 
|  | 2340 2327 | 
|  | 2341 2328 <span class="c">#</span> | 
|  | 2342 2329 <span class="c"># Matrix log natural base operator returns a matrix with values corresponding to</span> | 
|  | 2343 2330 <span class="c"># log of values in a matrix</span> | 
|  | 2344 2331 <span class="c">#</span> | 
|  | 2345 <a name="_MatrixLogNaturalBaseOperator-"></a>2332 <span class="k">sub </span><span class="m">_MatrixLogNaturalBaseOperator</span> <span class="s">{</span> | 
|  | 2346 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> | 
|  | 2347 2334 | 
|  | 2348 2335   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixLogNaturalBaseOperator: Matrix log operation failed"</span><span class="sc">;</span> | 
|  | 2349 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> | 
|  | 2350 2337 | 
|  | 2351 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> | 
|  | 2352 2339 | 
|  | 2353 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2354 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> | 
|  | 2355 2342 | 
|  | 2356 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> | 
|  | 2357 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> | 
|  | 2358 2345       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2359 2346     <span class="s">}</span> | 
|  | 2360 2347   <span class="s">}</span> | 
|  | 2361 2348   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2362 2349 <span class="s">}</span> | 
|  | 2363 2350 | 
|  | 2364 2351 <span class="c">#</span> | 
|  | 2365 2352 <span class="c"># Matrix square root operator returns a matrix with values corresponding to</span> | 
|  | 2366 2353 <span class="c"># sqrt of values in a matrix</span> | 
|  | 2367 2354 <span class="c">#</span> | 
|  | 2368 <a name="_MatrixSquareRootOperator-"></a>2355 <span class="k">sub </span><span class="m">_MatrixSquareRootOperator</span> <span class="s">{</span> | 
|  | 2369 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> | 
|  | 2370 2357 | 
|  | 2371 2358   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixSquareRootOperator: Matrix sqrt operation failed"</span><span class="sc">;</span> | 
|  | 2372 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> | 
|  | 2373 2360 | 
|  | 2374 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> | 
|  | 2375 2362 | 
|  | 2376 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2377 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> | 
|  | 2378 2365 | 
|  | 2379 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> | 
|  | 2380 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> | 
|  | 2381 2368       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2382 2369     <span class="s">}</span> | 
|  | 2383 2370   <span class="s">}</span> | 
|  | 2384 2371   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2385 2372 <span class="s">}</span> | 
|  | 2386 2373 | 
|  | 2387 2374 <span class="c">#</span> | 
|  | 2388 2375 <span class="c"># Matrix sine root operator returns a matrix with values corresponding to</span> | 
|  | 2389 2376 <span class="c"># sin of values in a matrix</span> | 
|  | 2390 2377 <span class="c">#</span> | 
|  | 2391 <a name="_MatrixSineOperator-"></a>2378 <span class="k">sub </span><span class="m">_MatrixSineOperator</span> <span class="s">{</span> | 
|  | 2392 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> | 
|  | 2393 2380 | 
|  | 2394 2381   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixSineOperator: Matrix sin operation failed"</span><span class="sc">;</span> | 
|  | 2395 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> | 
|  | 2396 2383 | 
|  | 2397 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> | 
|  | 2398 2385 | 
|  | 2399 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2400 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> | 
|  | 2401 2388 | 
|  | 2402 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> | 
|  | 2403 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> | 
|  | 2404 2391       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2405 2392     <span class="s">}</span> | 
|  | 2406 2393   <span class="s">}</span> | 
|  | 2407 2394   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2408 2395 <span class="s">}</span> | 
|  | 2409 2396 | 
|  | 2410 2397 <span class="c">#</span> | 
|  | 2411 2398 <span class="c"># Matrix cosine root operator returns a matrix with values corresponding to</span> | 
|  | 2412 2399 <span class="c"># cos of values in a matrix</span> | 
|  | 2413 2400 <span class="c">#</span> | 
|  | 2414 <a name="_MatrixCosineOperator-"></a>2401 <span class="k">sub </span><span class="m">_MatrixCosineOperator</span> <span class="s">{</span> | 
|  | 2415 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> | 
|  | 2416 2403 | 
|  | 2417 2404   <span class="i">$ErrorMsg</span> = <span class="q">"_MatrixCosineOperator: Matrix cos operation failed"</span><span class="sc">;</span> | 
|  | 2418 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> | 
|  | 2419 2406 | 
|  | 2420 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> | 
|  | 2421 2408 | 
|  | 2422 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2423 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> | 
|  | 2424 2411 | 
|  | 2425 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> | 
|  | 2426 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> | 
|  | 2427 2414       <span class="i">$Matrix</span>->{<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>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span> | 
|  | 2428 2415     <span class="s">}</span> | 
|  | 2429 2416   <span class="s">}</span> | 
|  | 2430 2417   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span> | 
|  | 2431 2418 <span class="s">}</span> | 
|  | 2432 2419 | 
|  | 2433 2420 <span class="c"># Turn matrix into array for @{$Matrix} operation...</span> | 
|  | 2434 2421 <span class="c">#</span> | 
|  | 2435 <a name="_MatrixToArrayOperator-"></a>2422 <span class="k">sub </span><span class="m">_MatrixToArrayOperator</span> <span class="s">{</span> | 
|  | 2436 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> | 
|  | 2437 2424 | 
|  | 2438 2425   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}}<span class="sc">;</span> | 
|  | 2439 2426 <span class="s">}</span> | 
|  | 2440 2427 | 
|  | 2441 2428 <span class="c"># Always return true in boolean context...</span> | 
|  | 2442 2429 <span class="c">#</span> | 
|  | 2443 <a name="_BoolifyMatrix-"></a>2430 <span class="k">sub </span><span class="m">_BoolifyMatrix</span> <span class="s">{</span> | 
|  | 2444 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> | 
|  | 2445 2432 | 
|  | 2446 2433   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span> | 
|  | 2447 2434 <span class="s">}</span> | 
|  | 2448 2435 | 
|  | 2449 2436 <span class="c"># Process parameters passed to overloaded operators...</span> | 
|  | 2450 2437 <span class="c">#</span> | 
|  | 2451 2438 <span class="c"># For uninary operators, $SecondParameter is not defined.</span> | 
|  | 2452 <a name="_ProcessOverloadedOperatorParameters-"></a>2439 <span class="k">sub </span><span class="m">_ProcessOverloadedOperatorParameters</span> <span class="s">{</span> | 
|  | 2453 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> | 
|  | 2454 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> | 
|  | 2455 2442 | 
|  | 2456 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> | 
|  | 2457 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> && <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> | 
|  | 2458 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> | 
|  | 2459 2446 | 
|  | 2460 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> | 
|  | 2461 2448 | 
|  | 2462 2449   <span class="i">$OtherIsMatrix</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2463 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> && <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> | 
|  | 2464 2451     <span class="c"># Make sure $Other is a matrix...</span> | 
|  | 2465 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> | 
|  | 2466 2453     <span class="k">if</span> <span class="s">(</span><span class="i">$CheckMatrixSizes</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2467 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> | 
|  | 2468 2455     <span class="s">}</span> | 
|  | 2469 2456     <span class="i">$OtherIsMatrix</span> = <span class="n">1</span><span class="sc">;</span> | 
|  | 2470 2457   <span class="s">}</span> | 
|  | 2471 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> | 
|  | 2472 2459 <span class="s">}</span> | 
|  | 2473 2460 | 
|  | 2474 2461 <span class="c"># Make sure size of the two matrices contain the same number of values...</span> | 
|  | 2475 <a name="_ValidateMatrixSizesAreEqual-"></a>2462 <span class="k">sub </span><span class="m">_ValidateMatrixSizesAreEqual</span> <span class="s">{</span> | 
|  | 2476 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> | 
|  | 2477 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> | 
|  | 2478 2465 | 
|  | 2479 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2480 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2481 2468 | 
|  | 2482 2469   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows1</span> == <span class="i">$NumOfRows2</span> && <span class="i">$NumOfCols1</span> == <span class="i">$NumOfCols2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2483 2470     <span class="w">croak</span> <span class="q">"Error: ${ClassName}->${ErrorMsg}: Size of the matrices must be same..."</span><span class="sc">;</span> | 
|  | 2484 2471   <span class="s">}</span> | 
|  | 2485 2472 <span class="s">}</span> | 
|  | 2486 2473 | 
|  | 2487 2474 <span class="c"># Return a string containing matrix values...</span> | 
|  | 2488 2475 <span class="c">#</span> | 
|  | 2489 <a name="StringifyMatrix-"></a>2476 <span class="k">sub </span><span class="m">StringifyMatrix</span> <span class="s">{</span> | 
|  | 2490 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> | 
|  | 2491 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> | 
|  | 2492 2479 | 
|  | 2493 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">->GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span> | 
|  | 2494 2481 | 
|  | 2495 2482   <span class="i">$MatrixPrintStyleValue</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">MatrixPrintStyle</span>}<span class="s">)</span> ? <span class="i">$This</span>->{<span class="w">MatrixPrintStyle</span>} <span class="co">:</span> <span class="i">$MatrixPrintStyle</span><span class="sc">;</span> | 
|  | 2496 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> | 
|  | 2497 2484 | 
|  | 2498 2485   <span class="i">$PrintFormat</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>->{<span class="w">ValueFormat</span>}<span class="s">)</span> ? <span class="i">$This</span>->{<span class="w">ValueFormat</span>} <span class="co">:</span> <span class="i">$ValueFormat</span><span class="sc">;</span> | 
|  | 2499 2486 | 
|  | 2500 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> | 
|  | 2501 2488   <span class="i">$FormatString</span> = <span class="k">join</span> <span class="q">' '</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="sc">;</span> | 
|  | 2502 2489 | 
|  | 2503 2490   <span class="i">$MatrixString</span> = <span class="k">sprintf</span> <span class="q">"<Size: $NumOfRows x $NumOfCols;"</span><span class="sc">;</span> | 
|  | 2504 2491   <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2505 2492     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">" Values:"</span><span class="sc">;</span> | 
|  | 2506 2493   <span class="s">}</span> | 
|  | 2507 2494   <span class="k">else</span> <span class="s">{</span> | 
|  | 2508 2495     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">" Values:\n"</span><span class="sc">;</span> | 
|  | 2509 2496   <span class="s">}</span> | 
|  | 2510 2497 | 
|  | 2511 2498   <span class="i">$RowNum</span> = <span class="n">0</span><span class="sc">;</span> | 
|  | 2512 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> | 
|  | 2513 2500     <span class="i">$RowNum</span>++<span class="sc">;</span> | 
|  | 2514 2501     <span class="i">$RowString</span> = <span class="k">sprintf</span> <span class="q">"Row${RowNum}:[$FormatString]"</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>->{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]}<span class="sc">;</span> | 
|  | 2515 2502     <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span> | 
|  | 2516 2503       <span class="i">$MatrixString</span> .= <span class="q">" $RowString"</span><span class="sc">;</span> | 
|  | 2517 2504     <span class="s">}</span> | 
|  | 2518 2505     <span class="k">else</span> <span class="s">{</span> | 
|  | 2519 2506       <span class="i">$MatrixString</span> .= <span class="q">"$RowString\n"</span><span class="sc">;</span> | 
|  | 2520 2507     <span class="s">}</span> | 
|  | 2521 2508   <span class="s">}</span> | 
|  | 2522 2509   <span class="i">$MatrixString</span> .= <span class="q">">"</span><span class="sc">;</span> | 
|  | 2523 2510   <span class="k">return</span> <span class="i">$MatrixString</span><span class="sc">;</span> | 
|  | 2524 2511 <span class="s">}</span> | 
|  | 2525 2512 | 
|  | 2526 <a name="EOF-"></a></pre> | 
|  | 2527 <p> </p> | 
|  | 2528 <br /> | 
|  | 2529 <center> | 
|  | 2530 <img src="../../../images/h2o2.png"> | 
|  | 2531 </center> | 
|  | 2532 </body> | 
|  | 2533 </html> |