diff mayachemtools/docs/modules/html/code/Matrix.html @ 0:73ae111cf86f draft

Uploaded
author deepakjadmin
date Wed, 20 Jan 2016 11:55:01 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mayachemtools/docs/modules/html/code/Matrix.html	Wed Jan 20 11:55:01 2016 -0500
@@ -0,0 +1,2533 @@
+<html>
+<head>
+<title>MayaChemTools:Code:Matrix.pm</title>
+<meta http-equiv="content-type" content="text/html;charset=utf-8">
+<link rel="stylesheet" type="text/css" href="../../../css/MayaChemToolsCode.css">
+</head>
+<body leftmargin="20" rightmargin="20" topmargin="10" bottommargin="10">
+<br/>
+<center>
+<a href="http://www.mayachemtools.org" title="MayaChemTools Home"><img src="../../../images/MayaChemToolsLogo.gif" border="0" alt="MayaChemTools"></a>
+</center>
+<br/>
+<pre>
+<a name="package-Matrix-"></a>   1 <span class="k">package </span><span class="i">Matrix</span><span class="sc">;</span>
+   2 <span class="c">#</span>
+   3 <span class="c"># $RCSfile: Matrix.pm,v $</span>
+   4 <span class="c"># $Date: 2015/02/28 20:47:17 $</span>
+   5 <span class="c"># $Revision: 1.16 $</span>
+   6 <span class="c">#</span>
+   7 <span class="c"># Author: Manish Sud &lt;msud@san.rr.com&gt;</span>
+   8 <span class="c">#</span>
+   9 <span class="c"># Copyright (C) 2015 Manish Sud. All rights reserved.</span>
+  10 <span class="c">#</span>
+  11 <span class="c"># This file is part of MayaChemTools.</span>
+  12 <span class="c">#</span>
+  13 <span class="c"># MayaChemTools is free software; you can redistribute it and/or modify it under</span>
+  14 <span class="c"># the terms of the GNU Lesser General Public License as published by the Free</span>
+  15 <span class="c"># Software Foundation; either version 3 of the License, or (at your option) any</span>
+  16 <span class="c"># later version.</span>
+  17 <span class="c">#</span>
+  18 <span class="c"># MayaChemTools is distributed in the hope that it will be useful, but without</span>
+  19 <span class="c"># any warranty; without even the implied warranty of merchantability of fitness</span>
+  20 <span class="c"># for a particular purpose.  See the GNU Lesser General Public License for more</span>
+  21 <span class="c"># details.</span>
+  22 <span class="c">#</span>
+  23 <span class="c"># You should have received a copy of the GNU Lesser General Public License</span>
+  24 <span class="c"># along with MayaChemTools; if not, see &lt;http://www.gnu.org/licenses/&gt; or</span>
+  25 <span class="c"># write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,</span>
+  26 <span class="c"># Boston, MA, 02111-1307, USA.</span>
+  27 <span class="c">#</span>
+  28 
+  29 <span class="k">use</span> <span class="w">strict</span><span class="sc">;</span>
+  30 <span class="k">use</span> <span class="w">Carp</span><span class="sc">;</span>
+  31 <span class="k">use</span> <span class="w">Exporter</span><span class="sc">;</span>
+  32 <span class="k">use</span> <span class="w">Scalar::Util</span> <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  33 <span class="k">use</span> <span class="w">Vector</span><span class="sc">;</span>
+  34 
+  35 <span class="k">use</span> <span class="w">vars</span> <span class="q">qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS)</span><span class="sc">;</span>
+  36 
+  37 <span class="i">@ISA</span> = <span class="q">qw(Exporter)</span><span class="sc">;</span>
+  38 <span class="i">@EXPORT</span> = <span class="q">qw(IsMatrix IdentityMatrix NewFromRows NewFromColumns NewFromDiagonal UnitMatrix ZeroMatrix)</span><span class="sc">;</span>
+  39 <span class="i">@EXPORT_OK</span> = <span class="q">qw(SetValuePrintFormat)</span><span class="sc">;</span>
+  40 
+  41 <span class="i">%EXPORT_TAGS</span> = <span class="s">(</span>
+  42                 <span class="w">all</span>  <span class="cm">=&gt;</span> <span class="s">[</span><span class="i">@EXPORT</span><span class="cm">,</span> <span class="i">@EXPORT_OK</span><span class="s">]</span>
+  43                <span class="s">)</span><span class="sc">;</span>
+  44 
+  45 <span class="c"># Setup class variables...</span>
+  46 <span class="k">my</span><span class="s">(</span><span class="i">$ClassName</span><span class="cm">,</span> <span class="i">$ValueFormat</span><span class="cm">,</span> <span class="i">$MatrixPrintStyle</span><span class="s">)</span><span class="sc">;</span>
+  47 <span class="i">_InitializeClass</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+  48 
+  49 <span class="c">#</span>
+  50 <span class="c"># Using the following explicity overloaded operators, Perl automatically generates methods</span>
+  51 <span class="c"># for operations with no explicitly defined methods. Autogenerated methods are possible for</span>
+  52 <span class="c"># these operators:</span>
+  53 <span class="c">#</span>
+  54 <span class="c">#    o Arithmetic operators: += -= *= /= **= %= ++ -- x= .=</span>
+  55 <span class="c">#    o Increment and decrement: ++ --</span>
+  56 <span class="c">#</span>
+  57 <span class="c"># &#39;fallback&#39; is set to &#39;false&#39; to raise exception for all other operators.</span>
+  58 <span class="c">#</span>
+  59 <span class="k">use</span> <span class="w">overload</span> <span class="q">&#39;&quot;&quot;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;StringifyMatrix&#39;</span><span class="cm">,</span>
+  60 
+  61   <span class="q">&#39;@{}&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixToArrayOperator&#39;</span><span class="cm">,</span>
+  62 
+  63   <span class="q">&#39;+&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixAdditionOperator&#39;</span><span class="cm">,</span>
+  64   <span class="q">&#39;-&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSubtractionOperator&#39;</span><span class="cm">,</span>
+  65   <span class="q">&#39;*&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixMultiplicationOperator&#39;</span><span class="cm">,</span>
+  66   <span class="q">&#39;/&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixDivisionOperator&#39;</span><span class="cm">,</span>
+  67   <span class="q">&#39;**&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixExponentiationOperator&#39;</span><span class="cm">,</span>
+  68   <span class="q">&#39;%&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixModulusOperator&#39;</span><span class="cm">,</span>
+  69 
+  70   <span class="q">&#39;bool&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixBooleanOperator&#39;</span><span class="cm">,</span>
+  71   <span class="q">&#39;!&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNotBooleanOperator&#39;</span><span class="cm">,</span>
+  72 
+  73   <span class="q">&#39;==&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixEqualOperator&#39;</span><span class="cm">,</span>
+  74   <span class="q">&#39;!=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNotEqualOperator&#39;</span><span class="cm">,</span>
+  75   <span class="q">&#39;&lt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLessThanOperator&#39;</span><span class="cm">,</span>
+  76   <span class="q">&#39;&lt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLessThanEqualOperator&#39;</span><span class="cm">,</span>
+  77   <span class="q">&#39;&gt;&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixGreatarThanOperator&#39;</span><span class="cm">,</span>
+  78   <span class="q">&#39;&gt;=&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixGreatarThanEqualOperator&#39;</span><span class="cm">,</span>
+  79 
+  80   <span class="q">&#39;neg&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixNegativeValueOperator&#39;</span><span class="cm">,</span>
+  81 
+  82   <span class="q">&#39;abs&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixAbsoluteValueOperator&#39;</span><span class="cm">,</span>
+  83   <span class="q">&#39;exp&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixExpNaturalBaseOperator&#39;</span><span class="cm">,</span>
+  84   <span class="q">&#39;log&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixLogNaturalBaseOperator&#39;</span><span class="cm">,</span>
+  85   <span class="q">&#39;sqrt&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSquareRootOperator&#39;</span><span class="cm">,</span>
+  86   <span class="q">&#39;cos&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixCosineOperator&#39;</span><span class="cm">,</span>
+  87   <span class="q">&#39;sin&#39;</span> <span class="cm">=&gt;</span> <span class="q">&#39;_MatrixSineOperator&#39;</span><span class="cm">,</span>
+  88 
+  89   <span class="q">&#39;fallback&#39;</span> <span class="cm">=&gt;</span> <span class="k">undef</span><span class="sc">;</span>
+  90 
+  91 <span class="c"># Class constructor...</span>
+<a name="new-"></a>  92 <span class="k">sub </span><span class="m">new</span> <span class="s">{</span>
+  93   <span class="k">my</span><span class="s">(</span><span class="i">$Class</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+  94 
+  95   <span class="c"># Initialize object...</span>
+  96   <span class="k">my</span> <span class="i">$This</span> = <span class="s">{</span><span class="s">}</span><span class="sc">;</span>
+  97   <span class="k">bless</span> <span class="i">$This</span><span class="cm">,</span> <span class="k">ref</span><span class="s">(</span><span class="i">$Class</span><span class="s">)</span> || <span class="i">$Class</span><span class="sc">;</span>
+  98   <span class="i">$This</span><span class="i">-&gt;_InitializeMatrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+  99 
+ 100   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 101 <span class="s">}</span>
+ 102 
+ 103 <span class="c"># Initialize object data...</span>
+ 104 <span class="c">#</span>
+<a name="_InitializeMatrix-"></a> 105 <span class="k">sub </span><span class="m">_InitializeMatrix</span> <span class="s">{</span>
+ 106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 107 
+ 108   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 109     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_InitializeMatrix: NumOfRows and NumOfCols must be specified...&quot;</span><span class="sc">;</span>
+ 110   <span class="s">}</span>
+ 111   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="s">(</span><span class="i">$NumOfRows</span> &gt; <span class="n">0</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">$NumOfRows</span> &gt; <span class="n">0</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 112     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_InitializeMatrix: NumOfRows and NumOfCols must be a positive number...&quot;</span><span class="sc">;</span>
+ 113   <span class="s">}</span>
+ 114   <span class="c"># Initialize matrix elements to zero...</span>
+ 115   <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 116 
+ 117   <span class="k">my</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@EmptyRow</span><span class="s">)</span><span class="sc">;</span>
+ 118 
+ 119   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 120   <span class="i">@EmptyRow</span> = <span class="s">(</span><span class="q">&#39;0&#39;</span><span class="s">)</span> x <span class="i">$NumOfCols</span><span class="sc">;</span>
+ 121 
+ 122   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 123     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 124     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@EmptyRow</span><span class="sc">;</span>
+ 125   <span class="s">}</span>
+ 126 <span class="s">}</span>
+ 127 
+ 128 <span class="c"># Initialize class ...</span>
+<a name="_InitializeClass-"></a> 129 <span class="k">sub </span><span class="m">_InitializeClass</span> <span class="s">{</span>
+ 130   <span class="c">#Class name...</span>
+ 131   <span class="i">$ClassName</span> = <span class="w">__PACKAGE__</span><span class="sc">;</span>
+ 132 
+ 133   <span class="c"># Print style for matrix rows during StringifyMatrix operation.</span>
+ 134   <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine</span>
+ 135   <span class="c">#</span>
+ 136   <span class="i">$MatrixPrintStyle</span> = <span class="q">&quot;AllRowsInOneLine&quot;</span><span class="sc">;</span>
+ 137 
+ 138   <span class="c"># Print format for matrix values...</span>
+ 139   <span class="i">$ValueFormat</span> = <span class="q">&quot;%g&quot;</span><span class="sc">;</span>
+ 140 <span class="s">}</span>
+ 141 
+ 142 <span class="c"># Get matrix size...</span>
+ 143 <span class="c">#</span>
+<a name="GetSize-"></a> 144 <span class="k">sub </span><span class="m">GetSize</span> <span class="s">{</span>
+ 145   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 146 
+ 147   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="cm">,</span> <span class="i">$This</span><span class="i">-&gt;GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="s">)</span><span class="sc">;</span>
+ 148 <span class="s">}</span>
+ 149 
+ 150 <span class="c"># Get matrix dimensions...</span>
+ 151 <span class="c">#</span>
+<a name="GetDimension-"></a> 152 <span class="k">sub </span><span class="m">GetDimension</span> <span class="s">{</span>
+ 153   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 154 
+ 155   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 156 <span class="s">}</span>
+ 157 
+ 158 <span class="c"># Get number of rows in matrix</span>
+ 159 <span class="c">#</span>
+<a name="GetNumOfRows-"></a> 160 <span class="k">sub </span><span class="m">GetNumOfRows</span> <span class="s">{</span>
+ 161   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 162   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
+ 163 
+ 164   <span class="c"># Size of row array...</span>
+ 165   <span class="i">$NumOfRows</span> = <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}} + <span class="n">1</span><span class="sc">;</span>
+ 166 
+ 167   <span class="k">return</span> <span class="i">$NumOfRows</span><span class="sc">;</span>
+ 168 <span class="s">}</span>
+ 169 
+ 170 <span class="c"># Get number of columns in matrix</span>
+ 171 <span class="c">#</span>
+<a name="GetNumOfColumns-"></a> 172 <span class="k">sub </span><span class="m">GetNumOfColumns</span> <span class="s">{</span>
+ 173   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 174   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 175 
+ 176   <span class="c"># Size of column array for first row assuming sizes of columns are same...</span>
+ 177   <span class="i">$NumOfCols</span> = <span class="i">$#</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="n">0</span>]} + <span class="n">1</span><span class="sc">;</span>
+ 178 
+ 179   <span class="k">return</span> <span class="i">$NumOfCols</span><span class="sc">;</span>
+ 180 <span class="s">}</span>
+ 181 
+ 182 <span class="c"># Get reference to array holding matrix values in order to directly manipulate these values...</span>
+ 183 <span class="c">#</span>
+<a name="GetMatrixValuesReference-"></a> 184 <span class="k">sub </span><span class="m">GetMatrixValuesReference</span> <span class="s">{</span>
+ 185   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 186 
+ 187   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
+ 188 <span class="s">}</span>
+ 189 
+ 190 <span class="c"># Copy matrix...</span>
+ 191 <span class="c">#</span>
+<a name="Copy-"></a> 192 <span class="k">sub </span><span class="m">Copy</span> <span class="s">{</span>
+ 193   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 194   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
+ 195 
+ 196   <span class="c"># Create a new matrix...</span>
+ 197   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 198   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 199 
+ 200   <span class="c"># Set matrix values...</span>
+ 201   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 202     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 203       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+ 204     <span class="s">}</span>
+ 205   <span class="s">}</span>
+ 206   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+ 207 <span class="s">}</span>
+ 208 
+ 209 <span class="c"># Create a new matrix using rows specified in one of the following formats:</span>
+ 210 <span class="c">#   o List of vector objects</span>
+ 211 <span class="c">#   o References to list of values</span>
+ 212 <span class="c">#   o List of strings containing row values delimited by space</span>
+ 213 <span class="c">#</span>
+ 214 <span class="c"># Each row must contain the same number of values.</span>
+ 215 <span class="c">#</span>
+ 216 <span class="c"># This functionality can be either invoked as a class function or an</span>
+ 217 <span class="c"># object method.</span>
+ 218 <span class="c">#</span>
+<a name="NewFromRows-"></a> 219 <span class="k">sub </span><span class="m">NewFromRows</span> <span class="s">{</span>
+ 220   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 221 
+ 222   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 223     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromRows&#39;</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
+ 224   <span class="s">}</span>
+ 225   <span class="k">else</span> <span class="s">{</span>
+ 226     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromRows&#39;</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+ 227   <span class="s">}</span>
+ 228 <span class="s">}</span>
+ 229 
+ 230 <span class="c"># Create a new matrix using columns specified in one of the following formats:</span>
+ 231 <span class="c">#   o List of vector objects</span>
+ 232 <span class="c">#   o References to list of values</span>
+ 233 <span class="c">#   o List of strings containing columns values delimited by space</span>
+ 234 <span class="c">#</span>
+ 235 <span class="c"># Each columns must contain the same number of values.</span>
+ 236 <span class="c">#</span>
+ 237 <span class="c"># This functionality can be either invoked as a class function or an</span>
+ 238 <span class="c"># object method.</span>
+ 239 <span class="c">#</span>
+<a name="NewFromColumns-"></a> 240 <span class="k">sub </span><span class="m">NewFromColumns</span> <span class="s">{</span>
+ 241   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 242 
+ 243   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 244     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromColumns&#39;</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
+ 245   <span class="s">}</span>
+ 246   <span class="k">else</span> <span class="s">{</span>
+ 247     <span class="k">return</span> <span class="i">_NewFromRowsOrColumns</span><span class="s">(</span><span class="q">&#39;FromColumns&#39;</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+ 248   <span class="s">}</span>
+ 249 <span class="s">}</span>
+ 250 
+ 251 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span>
+ 252 <span class="c">#   o A vector object</span>
+ 253 <span class="c">#   o Reference to list of values</span>
+ 254 <span class="c">#   o Strings containing diagonal values delimited by space</span>
+ 255 <span class="c">#</span>
+ 256 <span class="c"># This functionality can be either invoked as a class function or an</span>
+ 257 <span class="c"># object method.</span>
+ 258 <span class="c">#</span>
+<a name="NewFromDiagonal-"></a> 259 <span class="k">sub </span><span class="m">NewFromDiagonal</span> <span class="s">{</span>
+ 260   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">@OtherParamaters</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 261 
+ 262   <span class="k">if</span> <span class="s">(</span><span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 263     <span class="k">return</span> <span class="i">_NewFromDiagonal</span><span class="s">(</span><span class="i">@OtherParamaters</span><span class="s">)</span><span class="sc">;</span>
+ 264   <span class="s">}</span>
+ 265   <span class="k">else</span> <span class="s">{</span>
+ 266     <span class="k">return</span> <span class="i">_NewFromDiagonal</span><span class="s">(</span><span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+ 267   <span class="s">}</span>
+ 268 <span class="s">}</span>
+ 269 
+ 270 <span class="c"># Create a new matrix using diagonal values specified in one of the following formats:</span>
+ 271 <span class="c">#   o A vector object</span>
+ 272 <span class="c">#   o Reference to list of values</span>
+ 273 <span class="c">#   o Strings containing diagonal values delimited by space</span>
+ 274 <span class="c">#</span>
+<a name="_NewFromDiagonal-"></a> 275 <span class="k">sub </span><span class="m">_NewFromDiagonal</span> <span class="s">{</span>
+ 276   <span class="k">my</span><span class="s">(</span><span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 277   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$DiagonalValuesRef</span><span class="s">)</span><span class="sc">;</span>
+ 278 
+ 279   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromDiagonal&quot;</span><span class="sc">;</span>
+ 280   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span>
+ 281     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No diagonal values specified...&quot;</span><span class="sc">;</span>
+ 282   <span class="s">}</span>
+ 283 
+ 284   <span class="c"># Collect specified diagonal values...</span>
+ 285   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
+ 286   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
+ 287   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
+ 288 
+ 289   <span class="c"># Create a new matrix...</span>
+ 290   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 291 
+ 292   <span class="i">$NumOfRows</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span>
+ 293   <span class="i">$NumOfCols</span> = <span class="i">$NumOfRows</span><span class="sc">;</span>
+ 294 
+ 295   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 296 
+ 297   <span class="c"># Set diagonal values...</span>
+ 298   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 299     <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 300   <span class="s">}</span>
+ 301 
+ 302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+ 303 <span class="s">}</span>
+ 304 
+ 305 <span class="c"># Create a new matrix using rows or columns specified in one of the following formats:</span>
+ 306 <span class="c">#   o List of vector objects</span>
+ 307 <span class="c">#   o References to list of values</span>
+ 308 <span class="c">#   o List of strings containing row values delimited by space</span>
+ 309 <span class="c">#</span>
+ 310 <span class="c"># Each row or column must contain the same number of values.</span>
+ 311 <span class="c">#</span>
+<a name="_NewFromRowsOrColumns-"></a> 312 <span class="k">sub </span><span class="m">_NewFromRowsOrColumns</span> <span class="s">{</span>
+ 313   <span class="k">my</span><span class="s">(</span><span class="i">$Mode</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 314 
+ 315   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(FromRows|FromColumns)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 316     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::_NewFromRowsOrColumns: Unknown mode: $Mode...&quot;</span><span class="sc">;</span>
+ 317   <span class="s">}</span>
+ 318   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="s">)</span><span class="sc">;</span>
+ 319 
+ 320   <span class="c"># Retrieve information about specified values and make sure similar number of values</span>
+ 321   <span class="c"># are specified for each row or column...</span>
+ 322   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromRows$/i</span><span class="s">)</span> <span class="s">{</span>
+ 323     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromRows&quot;</span><span class="sc">;</span>
+ 324   <span class="s">}</span>
+ 325   <span class="k">else</span> <span class="s">{</span>
+ 326     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}::_NewFromColumns&quot;</span><span class="sc">;</span>
+ 327   <span class="s">}</span>
+ 328   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
+ 329   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
+ 330 
+ 331   <span class="c"># Create a new matrix...</span>
+ 332   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$RowMode</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 333 
+ 334   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromRows$/i</span><span class="s">)</span> <span class="s">{</span>
+ 335     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span>
+ 336     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
+ 337     <span class="i">$RowMode</span> = <span class="n">1</span><span class="sc">;</span>
+ 338   <span class="s">}</span>
+ 339   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^FromColumns$/i</span><span class="s">)</span> <span class="s">{</span>
+ 340     <span class="i">$NumOfRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
+ 341     <span class="i">$NumOfCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ValuesRefs</span>}<span class="sc">;</span>
+ 342     <span class="i">$RowMode</span> = <span class="n">0</span><span class="sc">;</span>
+ 343   <span class="s">}</span>
+ 344   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 345 
+ 346   <span class="c"># Setup matrix values...</span>
+ 347   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 348     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 349       <span class="i">$Value</span> = <span class="i">$RowMode</span> ? <span class="i">$ValuesRefs</span>-&gt;[<span class="i">$RowIndex</span>]-&gt;[<span class="i">$ColIndex</span>]<span class="co">:</span> <span class="i">$ValuesRefs</span>-&gt;[<span class="i">$ColIndex</span>]-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 350       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
+ 351     <span class="s">}</span>
+ 352   <span class="s">}</span>
+ 353 
+ 354   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+ 355 <span class="s">}</span>
+ 356 
+ 357 <span class="c"># Process specified matrix values in any of the following supported formats:</span>
+ 358 <span class="c">#</span>
+ 359 <span class="c">#   o List of vector objects</span>
+ 360 <span class="c">#   o References to list of values</span>
+ 361 <span class="c">#   o List of strings containing row values delimited by space</span>
+ 362 <span class="c">#</span>
+ 363 <span class="c"># And return a reference to an array containing references to arrays with specified values.</span>
+ 364 <span class="c">#</span>
+ 365 <span class="c"># Value of CombineValuesStatus determines whether all the values specified are combined</span>
+ 366 <span class="c"># into one array and return its reference as the only entry in the array being returned.</span>
+ 367 <span class="c">#</span>
+<a name="_ProcessSpecifiedMatrixValues-"></a> 368 <span class="k">sub </span><span class="m">_ProcessSpecifiedMatrixValues</span> <span class="s">{</span>
+ 369   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizesStatus</span><span class="cm">,</span> <span class="i">$CombineValuesStatus</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 370   <span class="k">my</span><span class="s">(</span><span class="i">$Value</span><span class="cm">,</span> <span class="i">$TypeOfValue</span><span class="cm">,</span> <span class="i">@ValuesRefs</span><span class="s">)</span><span class="sc">;</span>
+ 371 
+ 372   <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 373   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedValues</span><span class="s">)</span> <span class="s">{</span>
+ 374     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No values specified...&quot;</span><span class="sc">;</span>
+ 375   <span class="s">}</span>
+ 376 
+ 377   <span class="c"># Collect values...</span>
+ 378   <span class="k">for</span> <span class="i">$Value</span> <span class="s">(</span><span class="i">@SpecifiedValues</span><span class="s">)</span> <span class="s">{</span>
+ 379     <span class="i">$TypeOfValue</span> = <span class="k">ref</span> <span class="i">$Value</span><span class="sc">;</span>
+ 380 
+ 381     <span class="k">if</span> <span class="s">(</span><span class="i">Vector::IsVector</span><span class="s">(</span><span class="i">$Value</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 382       <span class="c"># Feference to vector object...</span>
+ 383       <span class="k">my</span><span class="s">(</span><span class="i">$ValuesRef</span><span class="s">)</span><span class="sc">;</span>
+ 384       <span class="i">$ValuesRef</span> = <span class="i">$Value</span><span class="i">-&gt;GetValues</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 385       <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="s">)</span> <span class="s">{</span>
+ 386         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified vector object must contain some values...&quot;</span><span class="sc">;</span>
+ 387       <span class="s">}</span>
+ 388       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$ValuesRef</span><span class="sc">;</span>
+ 389     <span class="s">}</span>
+ 390     <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfValue</span> =~ <span class="q">/^ARRAY/</span><span class="s">)</span> <span class="s">{</span>
+ 391       <span class="c"># Refernece to an array...</span>
+ 392       <span class="k">if</span> <span class="s">(</span>!<span class="i">@</span>{<span class="i">$Value</span>}<span class="s">)</span> <span class="s">{</span>
+ 393         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified array reference must contain some values...&quot;</span><span class="sc">;</span>
+ 394       <span class="s">}</span>
+ 395       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> <span class="i">$Value</span><span class="sc">;</span>
+ 396     <span class="s">}</span>
+ 397     <span class="k">elsif</span> <span class="s">(</span><span class="i">$TypeOfValue</span> <span class="k">eq</span> <span class="q">&#39;&#39;</span><span class="s">)</span> <span class="s">{</span>
+ 398       <span class="c"># String value...</span>
+ 399       <span class="k">my</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 400       <span class="i">@Values</span> = <span class="k">split</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 401       <span class="k">if</span> <span class="s">(</span>!<span class="i">@Values</span><span class="s">)</span> <span class="s">{</span>
+ 402         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Specified string must contain some values...&quot;</span><span class="sc">;</span>
+ 403       <span class="s">}</span>
+ 404       <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span>
+ 405     <span class="s">}</span>
+ 406     <span class="k">else</span> <span class="s">{</span>
+ 407       <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Value format, $TypeOfValue, of a specified value to be added to matrix object is not supported...&quot;</span><span class="sc">;</span>
+ 408     <span class="s">}</span>
+ 409   <span class="s">}</span>
+ 410 
+ 411   <span class="c"># Combine all specified values into one array...</span>
+ 412   <span class="k">if</span> <span class="s">(</span><span class="i">$CombineValuesStatus</span><span class="s">)</span> <span class="s">{</span>
+ 413     <span class="k">my</span><span class="s">(</span><span class="i">$ValuesRef</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 414 
+ 415     <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 416     <span class="k">for</span> <span class="i">$ValuesRef</span> <span class="s">(</span><span class="i">@ValuesRefs</span><span class="s">)</span> <span class="s">{</span>
+ 417       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$ValuesRef</span>}<span class="sc">;</span>
+ 418     <span class="s">}</span>
+ 419     <span class="i">@ValuesRefs</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 420     <span class="k">push</span> <span class="i">@ValuesRefs</span><span class="cm">,</span> \<span class="i">@Values</span><span class="sc">;</span>
+ 421   <span class="s">}</span>
+ 422 
+ 423   <span class="c"># Make sure reference to all specified value arrays contain the same number of values...</span>
+ 424   <span class="k">if</span> <span class="s">(</span><span class="i">$CheckSizesStatus</span><span class="s">)</span> <span class="s">{</span>
+ 425     <span class="k">my</span><span class="s">(</span><span class="i">$Index</span><span class="cm">,</span> <span class="i">$FirstValueSize</span><span class="s">)</span><span class="sc">;</span>
+ 426     <span class="i">$FirstValueSize</span> = <span class="i">$#</span>{<span class="i">$ValuesRefs</span>[<span class="n">0</span>]}<span class="sc">;</span>
+ 427     <span class="k">for</span> <span class="i">$Index</span> <span class="s">(</span><span class="n">1</span> .. <span class="i">$#ValuesRefs</span><span class="s">)</span> <span class="s">{</span>
+ 428       <span class="k">if</span> <span class="s">(</span><span class="i">$FirstValueSize</span> != <span class="i">$#</span>{<span class="i">$ValuesRefs</span>[<span class="i">$Index</span>]}<span class="s">)</span> <span class="s">{</span>
+ 429         <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified value type to be added to matrix object must be same...&quot;</span><span class="sc">;</span>
+ 430       <span class="s">}</span>
+ 431     <span class="s">}</span>
+ 432   <span class="s">}</span>
+ 433 
+ 434   <span class="k">return</span> \<span class="i">@ValuesRefs</span><span class="sc">;</span>
+ 435 <span class="s">}</span>
+ 436 
+ 437 <span class="c"># Create a new zero matrix of specified size or default size of 3 x 3.</span>
+ 438 <span class="c">#</span>
+ 439 <span class="c"># This functionality can be either invoked as a class function or an</span>
+ 440 <span class="c"># object method.</span>
+ 441 <span class="c">#</span>
+<a name="ZeroMatrix-"></a> 442 <span class="k">sub </span><span class="m">ZeroMatrix (;$$$)</span> <span class="s">{</span>
+ 443   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 444   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
+ 445 
+ 446   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span>
+ 447   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span> &amp;&amp; <span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 448     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
+ 449   <span class="s">}</span>
+ 450   <span class="k">else</span> <span class="s">{</span>
+ 451     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+ 452   <span class="s">}</span>
+ 453   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="n">3</span><span class="cm">,</span> <span class="n">3</span><span class="s">)</span><span class="sc">;</span>
+ 454 
+ 455   <span class="c"># Set up a new zero matrix</span>
+ 456   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 457 
+ 458   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+ 459 <span class="s">}</span>
+ 460 
+ 461 <span class="c"># Create a new unit matrix of specified size or default size of 3 x 3.</span>
+ 462 <span class="c">#</span>
+ 463 <span class="c"># This functionality can be either invoked as a class function or an</span>
+ 464 <span class="c"># object method.</span>
+ 465 <span class="c">#</span>
+<a name="UnitMatrix-"></a> 466 <span class="k">sub </span><span class="m">UnitMatrix (;$$$)</span> <span class="s">{</span>
+ 467   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 468   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 469 
+ 470   <span class="i">$This</span> = <span class="k">undef</span><span class="sc">;</span>
+ 471   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span> &amp;&amp; <span class="i">IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 472     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
+ 473   <span class="s">}</span>
+ 474   <span class="k">else</span> <span class="s">{</span>
+ 475     <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">undef</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+ 476   <span class="s">}</span>
+ 477   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span> &amp;&amp; <span class="k">defined</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="s">)</span> ? <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> <span class="co">:</span> <span class="s">(</span><span class="n">3</span><span class="cm">,</span> <span class="n">3</span><span class="s">)</span><span class="sc">;</span>
+ 478 
+ 479   <span class="c"># Set up a new zero matrix</span>
+ 480   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+ 481 
+ 482   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+ 483     <span class="w">carp</span> <span class="q">&quot;Warning: ${ClassName}::UnitMatrix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
+ 484   <span class="s">}</span>
+ 485 
+ 486   <span class="c"># Initialize diagonal elements to 1...</span>
+ 487   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 488     <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="n">1.0</span><span class="sc">;</span>
+ 489   <span class="s">}</span>
+ 490 
+ 491   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+ 492 <span class="s">}</span>
+ 493 
+ 494 <span class="c"># Identity matrix of specified size or size 3 x 3...</span>
+ 495 <span class="c">#</span>
+<a name="IdentityMatrix-"></a> 496 <span class="k">sub </span><span class="m">IdentityMatrix (;$$$)</span> <span class="s">{</span>
+ 497   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 498 
+ 499   <span class="k">return</span> <span class="i">UnitMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ThirdParameter</span><span class="s">)</span><span class="sc">;</span>
+ 500 <span class="s">}</span>
+ 501 
+ 502 <span class="c"># Set all matrix values to 0s...</span>
+ 503 <span class="c">#</span>
+<a name="Zero-"></a> 504 <span class="k">sub </span><span class="m">Zero</span> <span class="s">{</span>
+ 505   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 506 
+ 507   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;SetAllValues</span><span class="s">(</span><span class="n">0.0</span><span class="s">)</span><span class="sc">;</span>
+ 508 <span class="s">}</span>
+ 509 
+ 510 <span class="c"># Set all matrix values to 1s...</span>
+ 511 <span class="c">#</span>
+<a name="One-"></a> 512 <span class="k">sub </span><span class="m">One</span> <span class="s">{</span>
+ 513   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 514 
+ 515   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;SetAllValues</span><span class="s">(</span><span class="n">1.0</span><span class="s">)</span><span class="sc">;</span>
+ 516 <span class="s">}</span>
+ 517 
+ 518 <span class="c"># Get a matrix value with row and column indicies starting from 0...</span>
+ 519 <span class="c">#</span>
+<a name="GetValue-"></a> 520 <span class="k">sub </span><span class="m">GetValue</span> <span class="s">{</span>
+ 521   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$SkipIndexCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 522 
+ 523   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span>
+ 524     <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 525   <span class="s">}</span>
+ 526 
+ 527   <span class="i">$This</span><span class="i">-&gt;_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">&quot;Error: ${ClassName}::GetValue&quot;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 528 
+ 529   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 530 <span class="s">}</span>
+ 531 
+ 532 <span class="c"># Get a matrix value...</span>
+ 533 <span class="c">#</span>
+<a name="_GetValue-"></a> 534 <span class="k">sub </span><span class="m">_GetValue</span> <span class="s">{</span>
+ 535   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 536 
+ 537   <span class="k">return</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+ 538 <span class="s">}</span>
+ 539 
+ 540 <span class="c"># Set a matrix value with row and column indicies starting from 0...</span>
+ 541 <span class="c">#</span>
+<a name="SetValue-"></a> 542 <span class="k">sub </span><span class="m">SetValue</span> <span class="s">{</span>
+ 543   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$SkipIndexCheck</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 544 
+ 545   <span class="k">if</span> <span class="s">(</span><span class="i">$SkipIndexCheck</span><span class="s">)</span> <span class="s">{</span>
+ 546     <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 547   <span class="s">}</span>
+ 548 
+ 549   <span class="i">$This</span><span class="i">-&gt;_ValidateRowAndColumnIndicies</span><span class="s">(</span><span class="q">&quot;Error: ${ClassName}::SetValue&quot;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 550 
+ 551   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_SetValue</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+ 552 <span class="s">}</span>
+ 553 
+ 554 <span class="c"># Set a matrix value...</span>
+ 555 <span class="c">#</span>
+<a name="_SetValue-"></a> 556 <span class="k">sub </span><span class="m">_SetValue</span> <span class="s">{</span>
+ 557   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 558 
+ 559   <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
+ 560 
+ 561   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 562 <span class="s">}</span>
+ 563 
+ 564 <span class="c"># Set all matrix values to a specified value...</span>
+ 565 <span class="c">#</span>
+<a name="SetAllValues-"></a> 566 <span class="k">sub </span><span class="m">SetAllValues</span> <span class="s">{</span>
+ 567   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 568   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 569 
+ 570   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 571   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 572     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 573       <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$Value</span><span class="sc">;</span>
+ 574     <span class="s">}</span>
+ 575   <span class="s">}</span>
+ 576   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 577 <span class="s">}</span>
+ 578 
+ 579 <span class="c"># Set values of a row in a matrix value with row index starting from 0...</span>
+ 580 <span class="c">#</span>
+<a name="SetRowValues-"></a> 581 <span class="k">sub </span><span class="m">SetRowValues</span> <span class="s">{</span>
+ 582   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 583   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$RowValuesRef</span><span class="cm">,</span> <span class="i">$NumOfRowValues</span><span class="s">)</span><span class="sc">;</span>
+ 584 
+ 585   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetRowValues&quot;</span><span class="sc">;</span>
+ 586 
+ 587   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 588   <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 589 
+ 590   <span class="c"># Collect specified row values...</span>
+ 591   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
+ 592   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
+ 593   <span class="i">$RowValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
+ 594 
+ 595   <span class="c"># Check number of specified row values...</span>
+ 596   <span class="i">$NumOfRowValues</span> = <span class="i">@</span>{<span class="i">$RowValuesRef</span>}<span class="sc">;</span>
+ 597   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRowValues</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+ 598     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of specified row values, $NumOfRowValues, must be equal to number of row values, $NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
+ 599   <span class="s">}</span>
+ 600 
+ 601   <span class="c"># Set row values...</span>
+ 602   <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRowValues</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 603     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$RowValuesRef</span>-&gt;[<span class="i">$ColIndex</span>]<span class="sc">;</span>
+ 604   <span class="s">}</span>
+ 605   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 606 <span class="s">}</span>
+ 607 
+ 608 <span class="c"># Add new row values to a matrix...</span>
+ 609 <span class="c">#</span>
+<a name="AddRowValues-"></a> 610 <span class="k">sub </span><span class="m">AddRowValues</span> <span class="s">{</span>
+ 611   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 612   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$RowValueRef</span><span class="cm">,</span> <span class="i">$RowValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfNewRows</span><span class="cm">,</span> <span class="i">$NumOfNewCols</span><span class="s">)</span><span class="sc">;</span>
+ 613 
+ 614   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;AddRowValues&quot;</span><span class="sc">;</span>
+ 615 
+ 616   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 617 
+ 618   <span class="c"># Collect specified row values...</span>
+ 619   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
+ 620   <span class="i">$RowValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
+ 621 
+ 622   <span class="c"># Check number of specified row values...</span>
+ 623   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>}<span class="sc">;</span>
+ 624   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$RowValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
+ 625 
+ 626   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNewCols</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+ 627     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified row, $NumOfNewCols, must be equal to number of row values, $NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
+ 628   <span class="s">}</span>
+ 629 
+ 630   <span class="c"># Add each row to the matrix...</span>
+ 631   <span class="i">$RowIndex</span> = <span class="i">$NumOfRows</span> - <span class="n">1</span><span class="sc">;</span>
+ 632   <span class="k">for</span> <span class="i">$RowValueRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$RowValuesRefs</span>}<span class="s">)</span> <span class="s">{</span>
+ 633     <span class="i">$RowIndex</span>++<span class="sc">;</span>
+ 634     <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]} = <span class="i">@</span>{<span class="i">$RowValueRef</span>}<span class="sc">;</span>
+ 635   <span class="s">}</span>
+ 636 
+ 637   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 638 <span class="s">}</span>
+ 639 
+ 640 <span class="c"># Get values of a row in matrix as an array. In scalar context, number of row</span>
+ 641 <span class="c"># values is returned...</span>
+ 642 <span class="c">#</span>
+<a name="GetRowValues-"></a> 643 <span class="k">sub </span><span class="m">GetRowValues</span> <span class="s">{</span>
+ 644   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 645 
+ 646   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 647 <span class="s">}</span>
+ 648 
+ 649 <span class="c"># Get values of a row in matrix as a vector object...</span>
+ 650 <span class="c">#</span>
+<a name="GetRowValuesAsVector-"></a> 651 <span class="k">sub </span><span class="m">GetRowValuesAsVector</span> <span class="s">{</span>
+ 652   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 653 
+ 654   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 655 <span class="s">}</span>
+ 656 
+ 657 <span class="c"># Get values of a row as row matrix object...</span>
+ 658 <span class="c">#</span>
+<a name="GetRowValuesAsRowMatrix-"></a> 659 <span class="k">sub </span><span class="m">GetRowValuesAsRowMatrix</span> <span class="s">{</span>
+ 660   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 661 
+ 662   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 663 <span class="s">}</span>
+ 664 
+ 665 <span class="c"># Get values of a row as column matrix object...</span>
+ 666 <span class="c">#</span>
+<a name="GetRowValuesAsColumnMatrix-"></a> 667 <span class="k">sub </span><span class="m">GetRowValuesAsColumnMatrix</span> <span class="s">{</span>
+ 668   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 669 
+ 670   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 671 <span class="s">}</span>
+ 672 
+ 673 <span class="c"># Get values of a row in matrix as a space delimited string...</span>
+ 674 <span class="c">#</span>
+<a name="GetRowValuesAsString-"></a> 675 <span class="k">sub </span><span class="m">GetRowValuesAsString</span> <span class="s">{</span>
+ 676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 677 
+ 678   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="cm">,</span> <span class="q">&#39;FromRow&#39;</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 679 <span class="s">}</span>
+ 680 
+ 681 <span class="c"># Set values of a column in a matrix value with row index starting from 0...</span>
+ 682 <span class="c">#</span>
+<a name="SetColumnValues-"></a> 683 <span class="k">sub </span><span class="m">SetColumnValues</span> <span class="s">{</span>
+ 684   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 685   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$ColValuesRef</span><span class="cm">,</span> <span class="i">$NumOfColValues</span><span class="s">)</span><span class="sc">;</span>
+ 686 
+ 687   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetColumnValues&quot;</span><span class="sc">;</span>
+ 688 
+ 689   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 690   <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 691 
+ 692   <span class="c"># Collect specified row values...</span>
+ 693   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
+ 694   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
+ 695   <span class="i">$ColValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
+ 696 
+ 697   <span class="c"># Check number of specified col values...</span>
+ 698   <span class="i">$NumOfColValues</span> = <span class="i">@</span>{<span class="i">$ColValuesRef</span>}<span class="sc">;</span>
+ 699   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfColValues</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
+ 700     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of specified col values, $NumOfColValues, must be equal to number of column values, $NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
+ 701   <span class="s">}</span>
+ 702 
+ 703   <span class="c"># Set col values...</span>
+ 704   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfColValues</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 705     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 706   <span class="s">}</span>
+ 707   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 708 <span class="s">}</span>
+ 709 
+ 710 <span class="c"># Add new column values to a matrix...</span>
+ 711 <span class="c">#</span>
+<a name="AddColumnValues-"></a> 712 <span class="k">sub </span><span class="m">AddColumnValues</span> <span class="s">{</span>
+ 713   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 714   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ColValueRef</span><span class="cm">,</span> <span class="i">$ColValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfNewRows</span><span class="cm">,</span> <span class="i">$NumOfNewCols</span><span class="s">)</span><span class="sc">;</span>
+ 715 
+ 716   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;AddColumnValues&quot;</span><span class="sc">;</span>
+ 717 
+ 718   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 719 
+ 720   <span class="c"># Collect specified column values...</span>
+ 721   <span class="i">$CheckSizes</span> = <span class="n">1</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">0</span><span class="sc">;</span>
+ 722   <span class="i">$ColValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedValues</span><span class="s">)</span><span class="sc">;</span>
+ 723 
+ 724   <span class="c"># Check number of specified column values...</span>
+ 725   <span class="i">$NumOfNewCols</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>}<span class="sc">;</span>
+ 726   <span class="i">$NumOfNewRows</span> = <span class="k">scalar</span> <span class="i">@</span>{<span class="i">$ColValuesRefs</span>-&gt;[<span class="n">0</span>]}<span class="sc">;</span>
+ 727 
+ 728   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfNewRows</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
+ 729     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: Number of values in each specified column, $NumOfNewRows, must be equal to number of column values, $NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
+ 730   <span class="s">}</span>
+ 731 
+ 732   <span class="c"># Add each column to the matrix...</span>
+ 733   <span class="i">$ColIndex</span> = <span class="i">$NumOfCols</span> - <span class="n">1</span><span class="sc">;</span>
+ 734   <span class="k">for</span> <span class="i">$ColValueRef</span> <span class="s">(</span><span class="i">@</span>{<span class="i">$ColValuesRefs</span>}<span class="s">)</span> <span class="s">{</span>
+ 735     <span class="i">$ColIndex</span>++<span class="sc">;</span>
+ 736     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 737       <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$ColValueRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 738     <span class="s">}</span>
+ 739   <span class="s">}</span>
+ 740 
+ 741   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 742 <span class="s">}</span>
+ 743 
+ 744 <span class="c"># Get values of a column in matrix as an array. In scalar context, number of column</span>
+ 745 <span class="c"># values is returned...</span>
+ 746 <span class="c">#</span>
+<a name="GetColumnValues-"></a> 747 <span class="k">sub </span><span class="m">GetColumnValues</span> <span class="s">{</span>
+ 748   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 749 
+ 750   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 751 <span class="s">}</span>
+ 752 
+ 753 <span class="c"># Get values of a column in matrix as a vector object...</span>
+ 754 <span class="c">#</span>
+<a name="GetColumnValuesAsVector-"></a> 755 <span class="k">sub </span><span class="m">GetColumnValuesAsVector</span> <span class="s">{</span>
+ 756   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 757 
+ 758   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 759 <span class="s">}</span>
+ 760 
+ 761 <span class="c"># Get values of a column as row matrix object...</span>
+ 762 <span class="c">#</span>
+<a name="GetColumnValuesAsRowMatrix-"></a> 763 <span class="k">sub </span><span class="m">GetColumnValuesAsRowMatrix</span> <span class="s">{</span>
+ 764   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 765 
+ 766   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 767 <span class="s">}</span>
+ 768 
+ 769 <span class="c"># Get values of a column as column matrix object...</span>
+ 770 <span class="c">#</span>
+<a name="GetColumnValuesAsColumnMatrix-"></a> 771 <span class="k">sub </span><span class="m">GetColumnValuesAsColumnMatrix</span> <span class="s">{</span>
+ 772   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 773 
+ 774   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 775 <span class="s">}</span>
+ 776 
+ 777 <span class="c"># Get values of a column in matrix as a space delimited string...</span>
+ 778 <span class="c">#</span>
+<a name="GetColumnValuesAsString-"></a> 779 <span class="k">sub </span><span class="m">GetColumnValuesAsString</span> <span class="s">{</span>
+ 780   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 781 
+ 782   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetRowOrColumnValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="cm">,</span> <span class="q">&#39;FromColumn&#39;</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 783 <span class="s">}</span>
+ 784 
+ 785 <span class="c"># Get row or column values...</span>
+ 786 <span class="c">#</span>
+<a name="_GetRowOrColumnValues-"></a> 787 <span class="k">sub </span><span class="m">_GetRowOrColumnValues</span> <span class="s">{</span>
+ 788   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="cm">,</span> <span class="i">$ValueMode</span><span class="cm">,</span> <span class="i">$ValueModeIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 789 
+ 790   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(AsArray|AsVector|AsRowMatrix|AsColumnMatrix|AsString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 791     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetRowOrColumnValues: Unknown mode, $Mode, specified...&quot;</span><span class="sc">;</span>
+ 792   <span class="s">}</span>
+ 793   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> !~ <span class="q">/^(FromRow|FromColumn)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 794     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetRowOrColumnValues: Unknown value mode, $ValueMode, specified...&quot;</span><span class="sc">;</span>
+ 795   <span class="s">}</span>
+ 796 
+ 797   <span class="c"># Setup error message prefix...</span>
+ 798   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="s">)</span><span class="sc">;</span>
+ 799 
+ 800   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;${ClassName}-&gt;_GetRowOrColumnValues&quot;</span><span class="sc">;</span>
+ 801   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromRow$/i</span><span class="s">)</span> <span class="s">{</span>
+ 802     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;GetRowValues${Mode}&quot;</span><span class="sc">;</span>
+ 803   <span class="s">}</span>
+ 804   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromColumn$/i</span><span class="s">)</span> <span class="s">{</span>
+ 805     <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;GetColumnValues${Mode}&quot;</span><span class="sc">;</span>
+ 806   <span class="s">}</span>
+ 807 
+ 808   <span class="c"># Validate specified index and collect values...</span>
+ 809   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 810 
+ 811   <span class="i">@Values</span>  = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 812   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 813 
+ 814   <span class="k">if</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromRow$/i</span><span class="s">)</span> <span class="s">{</span>
+ 815     <span class="i">$RowIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span>
+ 816     <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+ 817 
+ 818     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 819       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+ 820     <span class="s">}</span>
+ 821   <span class="s">}</span>
+ 822   <span class="k">elsif</span> <span class="s">(</span><span class="i">$ValueMode</span> =~ <span class="q">/^FromColumn$/i</span><span class="s">)</span> <span class="s">{</span>
+ 823     <span class="i">$ColIndex</span> = <span class="i">$ValueModeIndex</span><span class="sc">;</span>
+ 824     <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+ 825 
+ 826     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 827       <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+ 828     <span class="s">}</span>
+ 829   <span class="s">}</span>
+ 830 
+ 831   <span class="c"># Return values...</span>
+ 832   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsRowMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
+ 833     <span class="k">return</span> <span class="i">NewFromRows</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 834   <span class="s">}</span>
+ 835   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsColumnMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
+ 836     <span class="k">return</span> <span class="i">NewFromColumns</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 837   <span class="s">}</span>
+ 838   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsVector$/i</span><span class="s">)</span> <span class="s">{</span>
+ 839     <span class="k">return</span> <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 840   <span class="s">}</span>
+ 841   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsString$/i</span><span class="s">)</span> <span class="s">{</span>
+ 842     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 843   <span class="s">}</span>
+ 844   <span class="k">else</span> <span class="s">{</span>
+ 845     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Values</span><span class="sc">;</span>
+ 846   <span class="s">}</span>
+ 847 <span class="s">}</span>
+ 848 
+ 849 <span class="c"># Set values of the diagonal in a square matrix...</span>
+ 850 <span class="c">#</span>
+<a name="SetDiagonalValues-"></a> 851 <span class="k">sub </span><span class="m">SetDiagonalValues</span> <span class="s">{</span>
+ 852   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 853   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">$ValuesRefs</span><span class="cm">,</span> <span class="i">$NumOfDiagonalValues</span><span class="cm">,</span> <span class="i">$DiagonalValuesRef</span><span class="s">)</span><span class="sc">;</span>
+ 854 
+ 855   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;Error: ${ClassName}-&gt;SetDiagonalValues&quot;</span><span class="sc">;</span>
+ 856   <span class="k">if</span> <span class="s">(</span>!<span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span> <span class="s">{</span>
+ 857     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: No diagonal values specified...&quot;</span><span class="sc">;</span>
+ 858   <span class="s">}</span>
+ 859 
+ 860   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 861   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+ 862     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
+ 863   <span class="s">}</span>
+ 864 
+ 865   <span class="c"># Collect specified diagonal values...</span>
+ 866   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span> <span class="i">$CombineValues</span> = <span class="n">1</span><span class="sc">;</span>
+ 867   <span class="i">$ValuesRefs</span> = <span class="i">_ProcessSpecifiedMatrixValues</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="cm">,</span> <span class="i">$CombineValues</span><span class="cm">,</span> <span class="i">@SpecifiedDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
+ 868   <span class="i">$DiagonalValuesRef</span> = <span class="i">$ValuesRefs</span>-&gt;[<span class="n">0</span>]<span class="sc">;</span>
+ 869   <span class="i">$NumOfDiagonalValues</span> = <span class="i">@</span>{<span class="i">$DiagonalValuesRef</span>}<span class="sc">;</span>
+ 870 
+ 871   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfDiagonalValues</span> != <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
+ 872     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Number of specified diagonal values, $NumOfDiagonalValues, must be equal to number of rows, $NumOfRows, in square matrix...&quot;</span><span class="sc">;</span>
+ 873   <span class="s">}</span>
+ 874 
+ 875   <span class="c"># Set diagonal values...</span>
+ 876   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 877     <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>] = <span class="i">$DiagonalValuesRef</span>-&gt;[<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 878   <span class="s">}</span>
+ 879 
+ 880   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+ 881 <span class="s">}</span>
+ 882 
+ 883 <span class="c"># Get values of the diagonal in a square matrix as an array. In scalar context, number of</span>
+ 884 <span class="c"># diagonal values is returned...</span>
+ 885 <span class="c">#</span>
+<a name="GetDiagonalValues-"></a> 886 <span class="k">sub </span><span class="m">GetDiagonalValues</span> <span class="s">{</span>
+ 887   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 888 
+ 889   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsArray&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 890 <span class="s">}</span>
+ 891 
+ 892 <span class="c"># Get values of the diagonal in a square matrix as vector object...</span>
+ 893 <span class="c">#</span>
+<a name="GetDiagonalValuesAsVector-"></a> 894 <span class="k">sub </span><span class="m">GetDiagonalValuesAsVector</span> <span class="s">{</span>
+ 895   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 896 
+ 897   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsVector&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 898 <span class="s">}</span>
+ 899 
+ 900 <span class="c"># Get values of the diagonal in a square matrix as row matrix object</span>
+ 901 <span class="c">#</span>
+<a name="GetDiagonalValuesAsRowMatrix-"></a> 902 <span class="k">sub </span><span class="m">GetDiagonalValuesAsRowMatrix</span> <span class="s">{</span>
+ 903   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 904 
+ 905   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsRowMatrix&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 906 <span class="s">}</span>
+ 907 
+ 908 <span class="c"># Get values of the diagonal in a square matrix as column matrix object</span>
+ 909 <span class="c">#</span>
+<a name="GetDiagonalValuesAsColumnMatrix-"></a> 910 <span class="k">sub </span><span class="m">GetDiagonalValuesAsColumnMatrix</span> <span class="s">{</span>
+ 911   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 912 
+ 913   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsColumnMatrix&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 914 <span class="s">}</span>
+ 915 
+ 916 <span class="c"># Get values of the diagonal in a square matrix as a space delimited string...</span>
+ 917 <span class="c">#</span>
+<a name="GetDiagonalValuesAsString-"></a> 918 <span class="k">sub </span><span class="m">GetDiagonalValuesAsString</span> <span class="s">{</span>
+ 919   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 920 
+ 921   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_GetDiagonalValues</span><span class="s">(</span><span class="q">&#39;AsString&#39;</span><span class="s">)</span><span class="sc">;</span>
+ 922 <span class="s">}</span>
+ 923 
+ 924 <span class="c"># Get diagonal values...</span>
+<a name="_GetDiagonalValues-"></a> 925 <span class="k">sub </span><span class="m">_GetDiagonalValues</span> <span class="s">{</span>
+ 926   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Mode</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 927 
+ 928   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> !~ <span class="q">/^(AsArray|AsVector|AsRowMatrix|AsColumnMatrix|AsString)$/i</span><span class="s">)</span> <span class="s">{</span>
+ 929     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;_GetDiagonalValues: Unknown mode, $Mode, specified...&quot;</span><span class="sc">;</span>
+ 930   <span class="s">}</span>
+ 931 
+ 932   <span class="c"># Make sure it&#39;s a square matrix...</span>
+ 933   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="s">)</span><span class="sc">;</span>
+ 934 
+ 935   <span class="i">$ErrorMsgPrefix</span> = <span class="q">&quot;${ClassName}-&gt;_GetDiagonalValues${Mode}&quot;</span><span class="sc">;</span>
+ 936   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 937   <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfRows</span> != <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+ 938     <span class="w">croak</span> <span class="q">&quot;Error: $ErrorMsgPrefix: Specified matrix, $NumOfRows x $NumOfCols, is not a square matrix...&quot;</span><span class="sc">;</span>
+ 939   <span class="s">}</span>
+ 940 
+ 941   <span class="c"># Collect values...</span>
+ 942   <span class="k">my</span><span class="s">(</span><span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 943   <span class="i">@Values</span> = <span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 944 
+ 945   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 946     <span class="k">push</span> <span class="i">@Values</span><span class="cm">,</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span>
+ 947   <span class="s">}</span>
+ 948 
+ 949   <span class="c"># Return values...</span>
+ 950   <span class="k">if</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsRowMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
+ 951     <span class="k">return</span> <span class="i">NewFromRows</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 952   <span class="s">}</span>
+ 953   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsColumnMatrix$/i</span><span class="s">)</span> <span class="s">{</span>
+ 954     <span class="k">return</span> <span class="i">NewFromColumns</span><span class="s">(</span>\<span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 955   <span class="s">}</span>
+ 956   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsVector$/i</span><span class="s">)</span> <span class="s">{</span>
+ 957     <span class="k">return</span> <span class="i">new</span> <span class="i">Vector</span><span class="s">(</span><span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 958   <span class="s">}</span>
+ 959   <span class="k">elsif</span> <span class="s">(</span><span class="i">$Mode</span> =~ <span class="q">/^AsString$/i</span><span class="s">)</span> <span class="s">{</span>
+ 960     <span class="k">return</span> <span class="k">join</span><span class="s">(</span><span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@Values</span><span class="s">)</span><span class="sc">;</span>
+ 961   <span class="s">}</span>
+ 962   <span class="k">else</span> <span class="s">{</span>
+ 963     <span class="k">return</span> <span class="k">wantarray</span> ? <span class="i">@Values</span> <span class="co">:</span> <span class="k">scalar</span> <span class="i">@Values</span><span class="sc">;</span>
+ 964   <span class="s">}</span>
+ 965 <span class="s">}</span>
+ 966 
+ 967 <span class="c"># Is it a square matrix?</span>
+ 968 <span class="c">#</span>
+<a name="IsSquare-"></a> 969 <span class="k">sub </span><span class="m">IsSquare</span> <span class="s">{</span>
+ 970   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 971   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 972 
+ 973   <span class="k">return</span> <span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$NumOfCols</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+ 974 <span class="s">}</span>
+ 975 
+ 976 <span class="c"># Is it a unit matrix?</span>
+ 977 <span class="c">#</span>
+ 978 <span class="c"># A matrix is a unit matrix:</span>
+ 979 <span class="c">#   o It&#39;s a square matrix</span>
+ 980 <span class="c">#   o All its diagonal elements are ones and its off-diagonal elements are zeros</span>
+ 981 <span class="c">#</span>
+<a name="IsUnit-"></a> 982 <span class="k">sub </span><span class="m">IsUnit</span> <span class="s">{</span>
+ 983   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+ 984 
+ 985   <span class="c"># Is is a square matrix?</span>
+ 986   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 987     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 988   <span class="s">}</span>
+ 989 
+ 990   <span class="c"># Check matrix values...</span>
+ 991   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$ExpectedValue</span><span class="s">)</span><span class="sc">;</span>
+ 992   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+ 993 
+ 994   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 995     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+ 996       <span class="i">$ExpectedValue</span> = <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> ? <span class="n">1.0</span> <span class="co">:</span> <span class="n">0.0</span><span class="sc">;</span>
+ 997       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$ExpectedValue</span><span class="s">)</span> <span class="s">{</span>
+ 998         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+ 999       <span class="s">}</span>
+1000     <span class="s">}</span>
+1001   <span class="s">}</span>
+1002   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1003 <span class="s">}</span>
+1004 
+1005 <span class="c"># Is it an identity matrix?</span>
+1006 <span class="c">#</span>
+<a name="IsIdentity-"></a>1007 <span class="k">sub </span><span class="m">IsIdentity</span> <span class="s">{</span>
+1008   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1009 
+1010   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnit</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1011 <span class="s">}</span>
+1012 
+1013 <span class="c"># Is it a diagonal matrix?</span>
+1014 <span class="c">#</span>
+1015 <span class="c"># A matrix is a diagonal matrix:</span>
+1016 <span class="c">#   o It&#39;s a square matrix</span>
+1017 <span class="c">#   o All its off-diagonal elements are zeros and its diagonal elements may or may not</span>
+1018 <span class="c">#     be zeros</span>
+1019 <span class="c">#</span>
+1020 <span class="c">#</span>
+<a name="IsDiagonal-"></a>1021 <span class="k">sub </span><span class="m">IsDiagonal</span> <span class="s">{</span>
+1022   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1023 
+1024   <span class="c"># Is is a square matrix?</span>
+1025   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1026     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1027   <span class="s">}</span>
+1028 
+1029   <span class="c"># Check off-diagonal matrix values...</span>
+1030   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1031   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1032 
+1033   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1034     <span class="j">COLINDEX:</span> <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1035       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1036         <span class="k">next</span> <span class="j">COLINDEX</span><span class="sc">;</span>
+1037       <span class="s">}</span>
+1038       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1039         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1040       <span class="s">}</span>
+1041     <span class="s">}</span>
+1042   <span class="s">}</span>
+1043   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1044 <span class="s">}</span>
+1045 
+1046 <span class="c"># Is it a lower bidiagonal matrix?</span>
+1047 <span class="c">#</span>
+1048 <span class="c"># A matrix is a lower bidiagonal matrix:</span>
+1049 <span class="c">#   o It&#39;s a square matrix</span>
+1050 <span class="c">#   o All its main diagonal and lower diagonal elements are non-zeros and all its</span>
+1051 <span class="c">#     other elements are zeros</span>
+1052 <span class="c">#</span>
+<a name="IsLowerBiDiagonal-"></a>1053 <span class="k">sub </span><span class="m">IsLowerBiDiagonal</span> <span class="s">{</span>
+1054   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1055 
+1056   <span class="c"># Is is a square matrix?</span>
+1057   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1058     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1059   <span class="s">}</span>
+1060 
+1061   <span class="c"># Check matrix values...</span>
+1062   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+1063   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1064 
+1065   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1066     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1067       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1068       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1069         <span class="c"># Main diagonal...</span>
+1070         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1071           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1072         <span class="s">}</span>
+1073       <span class="s">}</span>
+1074       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> + <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1075         <span class="c"># Lower diagonal...</span>
+1076         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1077           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1078         <span class="s">}</span>
+1079       <span class="s">}</span>
+1080       <span class="k">else</span> <span class="s">{</span>
+1081         <span class="c"># Other elements...</span>
+1082         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1083           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1084         <span class="s">}</span>
+1085       <span class="s">}</span>
+1086     <span class="s">}</span>
+1087   <span class="s">}</span>
+1088   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1089 <span class="s">}</span>
+1090 
+1091 <span class="c"># Is it an upper bidiagonal matrix?</span>
+1092 <span class="c">#</span>
+1093 <span class="c"># A matrix is an upper bidiagonal matrix:</span>
+1094 <span class="c">#   o It&#39;s a square matrix</span>
+1095 <span class="c">#   o All its main diagonal and upper diagonal elements are non-zeros and all its</span>
+1096 <span class="c">#     other elements are zeros</span>
+1097 <span class="c">#</span>
+<a name="IsUpperBiDiagonal-"></a>1098 <span class="k">sub </span><span class="m">IsUpperBiDiagonal</span> <span class="s">{</span>
+1099   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1100 
+1101   <span class="c"># Is is a square matrix?</span>
+1102   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1103     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1104   <span class="s">}</span>
+1105   <span class="c"># Check matrix values...</span>
+1106   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+1107   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1108 
+1109   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1110     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1111       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1112       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1113         <span class="c"># Main diagonal...</span>
+1114         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1115           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1116         <span class="s">}</span>
+1117       <span class="s">}</span>
+1118       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1119         <span class="c"># Upper diagonal...</span>
+1120         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1121           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1122         <span class="s">}</span>
+1123       <span class="s">}</span>
+1124       <span class="k">else</span> <span class="s">{</span>
+1125         <span class="c"># Other elements...</span>
+1126         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1127           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1128         <span class="s">}</span>
+1129       <span class="s">}</span>
+1130     <span class="s">}</span>
+1131   <span class="s">}</span>
+1132   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1133 <span class="s">}</span>
+1134 
+1135 <span class="c"># Is it a bidiagonal matrix?</span>
+1136 <span class="c">#</span>
+1137 <span class="c"># A matrix is a bidiagonal matrix:</span>
+1138 <span class="c">#</span>
+<a name="IsBiDiagonal-"></a>1139 <span class="k">sub </span><span class="m">IsBiDiagonal</span> <span class="s">{</span>
+1140   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1141 
+1142   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="i">-&gt;IsUpperBiDiagonal</span><span class="s">(</span><span class="s">)</span> || <span class="i">$This</span><span class="i">-&gt;IsLowerBiDiagonal</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1143 <span class="s">}</span>
+1144 
+1145 <span class="c"># Is it a tridiagonal matrix?</span>
+1146 <span class="c">#</span>
+1147 <span class="c"># A matrix is a  tribidiagonal matrix:</span>
+1148 <span class="c">#   o It&#39;s a square matrix</span>
+1149 <span class="c">#   o All its main diagonal, upper diagonal, and lower diagonal elements are non-zeros and all its</span>
+1150 <span class="c">#     other elements are zeros</span>
+1151 <span class="c">#</span>
+1152 <span class="c">#</span>
+<a name="IsTriDiagonal-"></a>1153 <span class="k">sub </span><span class="m">IsTriDiagonal</span> <span class="s">{</span>
+1154   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1155 
+1156   <span class="c"># Is is a square matrix?</span>
+1157   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1158     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1159   <span class="s">}</span>
+1160 
+1161   <span class="c"># Check matrix values...</span>
+1162   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$Value</span><span class="s">)</span><span class="sc">;</span>
+1163   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1164 
+1165   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1166     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1167       <span class="i">$Value</span> = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1168       <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1169         <span class="c"># Main diagonal...</span>
+1170         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1171           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1172         <span class="s">}</span>
+1173       <span class="s">}</span>
+1174       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1175         <span class="c"># Upper diagonal...</span>
+1176         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1177           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1178         <span class="s">}</span>
+1179       <span class="s">}</span>
+1180       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> == <span class="s">(</span><span class="i">$ColIndex</span> + <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1181         <span class="c"># Lower diagonal...</span>
+1182         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> == <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1183           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1184         <span class="s">}</span>
+1185       <span class="s">}</span>
+1186       <span class="k">else</span> <span class="s">{</span>
+1187         <span class="c"># Other elements...</span>
+1188         <span class="k">if</span> <span class="s">(</span><span class="i">$Value</span> != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1189           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1190         <span class="s">}</span>
+1191       <span class="s">}</span>
+1192     <span class="s">}</span>
+1193   <span class="s">}</span>
+1194   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1195 <span class="s">}</span>
+1196 
+1197 <span class="c"># Is it a lower triangular matrix?</span>
+1198 <span class="c">#</span>
+1199 <span class="c"># A matrix is a lower triangular matrix:</span>
+1200 <span class="c">#   o It&#39;s a square matrix</span>
+1201 <span class="c">#   o All its entries above the main diagonal are zero</span>
+1202 <span class="c">#</span>
+<a name="IsLowerTriangular-"></a>1203 <span class="k">sub </span><span class="m">IsLowerTriangular</span> <span class="s">{</span>
+1204   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1205 
+1206   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1207 <span class="s">}</span>
+1208 
+1209 <span class="c"># Is it a left triangular matrix?</span>
+1210 <span class="c">#</span>
+1211 <span class="c"># A matrix is a left triangular matrix:</span>
+1212 <span class="c">#   o It&#39;s a square matrix</span>
+1213 <span class="c">#   o All its entries above the main diagonal are zero</span>
+1214 <span class="c">#</span>
+<a name="IsLeftTriangular-"></a>1215 <span class="k">sub </span><span class="m">IsLeftTriangular</span> <span class="s">{</span>
+1216   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1217 
+1218   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1219 <span class="s">}</span>
+1220 
+1221 <span class="c"># Is it a strictly lower triangular matrix?</span>
+1222 <span class="c">#</span>
+1223 <span class="c"># A matrix is a strictly lower triangular matrix:</span>
+1224 <span class="c">#   o It&#39;s a square matrix</span>
+1225 <span class="c">#   o All its entries on and above the main diagonal are zero</span>
+1226 <span class="c">#</span>
+<a name="IsStrictlyLowerTriangular-"></a>1227 <span class="k">sub </span><span class="m">IsStrictlyLowerTriangular</span> <span class="s">{</span>
+1228   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1229   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1230 
+1231   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span>
+1232 
+1233   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1234 <span class="s">}</span>
+1235 
+1236 <span class="c"># Is it an unit lower triangular matrix?</span>
+1237 <span class="c">#</span>
+1238 <span class="c"># A matrix is an unit lower triangular matrix:</span>
+1239 <span class="c">#   o It&#39;s a square matrix</span>
+1240 <span class="c">#   o All its entries main diagonal are one</span>
+1241 <span class="c">#   o All its entries above the main diagonal are zero</span>
+1242 <span class="c">#</span>
+<a name="IsUnitLowerTriangular-"></a>1243 <span class="k">sub </span><span class="m">IsUnitLowerTriangular</span> <span class="s">{</span>
+1244   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1245   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1246 
+1247   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span>
+1248 
+1249   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsLowerTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1250 <span class="s">}</span>
+1251 
+1252 <span class="c"># Is it a lower unitriangular matrix?</span>
+1253 <span class="c">#</span>
+<a name="IsLowerUniTriangular-"></a>1254 <span class="k">sub </span><span class="m">IsLowerUniTriangular</span> <span class="s">{</span>
+1255   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1256 
+1257   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnitLowerTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1258 <span class="s">}</span>
+1259 
+1260 <span class="c"># Is it a lower triangular, strictly lower triangular, or unit lower triangular matrix?</span>
+1261 <span class="c">#</span>
+<a name="_IsLowerTriangularMatrix-"></a>1262 <span class="k">sub </span><span class="m">_IsLowerTriangularMatrix</span> <span class="s">{</span>
+1263   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$DiagonalValue</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1264 
+1265   <span class="c"># Is is a square matrix?</span>
+1266   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1267     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1268   <span class="s">}</span>
+1269   <span class="c"># Check matrix values...</span>
+1270   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$CheckDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
+1271 
+1272   <span class="i">$CheckDiagonalValues</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1273   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1274 
+1275   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1276     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1277       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> &amp;&amp; <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1278         <span class="c"># Main diagonal...</span>
+1279         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$DiagonalValue</span><span class="s">)</span> <span class="s">{</span>
+1280           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1281         <span class="s">}</span>
+1282       <span class="s">}</span>
+1283       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> &lt; <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1284         <span class="c"># Elemens above the main diagonal...</span>
+1285         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1286           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1287         <span class="s">}</span>
+1288       <span class="s">}</span>
+1289     <span class="s">}</span>
+1290   <span class="s">}</span>
+1291   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1292 <span class="s">}</span>
+1293 
+1294 <span class="c"># Is it an upper triangular matrix?</span>
+1295 <span class="c">#</span>
+1296 <span class="c"># A matrix is an upper triangular matrix:</span>
+1297 <span class="c">#   o It&#39;s a square matrix</span>
+1298 <span class="c">#   o All its entries below the main diagonal are zero</span>
+1299 <span class="c">#</span>
+<a name="IsUpperTriangular-"></a>1300 <span class="k">sub </span><span class="m">IsUpperTriangular</span> <span class="s">{</span>
+1301   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1302 
+1303   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1304 <span class="s">}</span>
+1305 
+1306 <span class="c"># Is it a right triangular matrix?</span>
+1307 <span class="c">#</span>
+1308 <span class="c"># A matrix is a right triangular matrix:</span>
+1309 <span class="c">#   o It&#39;s a square matrix</span>
+1310 <span class="c">#   o All its entries below the main diagonal are zero</span>
+1311 <span class="c">#</span>
+<a name="IsRightTriangular-"></a>1312 <span class="k">sub </span><span class="m">IsRightTriangular</span> <span class="s">{</span>
+1313   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1314 
+1315   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1316 <span class="s">}</span>
+1317 
+1318 <span class="c"># Is it a strictly upper triangular matrix?</span>
+1319 <span class="c">#</span>
+1320 <span class="c"># A matrix is a strictly upper triangular matrix:</span>
+1321 <span class="c">#   o It&#39;s a square matrix</span>
+1322 <span class="c">#   o All its entries on and below the main diagonal are zero</span>
+1323 <span class="c">#</span>
+<a name="IsStrictlyUpperTriangular-"></a>1324 <span class="k">sub </span><span class="m">IsStrictlyUpperTriangular</span> <span class="s">{</span>
+1325   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1326   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1327 
+1328   <span class="i">$DiagonalValue</span> = <span class="n">0</span><span class="sc">;</span>
+1329 
+1330   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1331 <span class="s">}</span>
+1332 
+1333 <span class="c"># Is it a unit upper triangular matrix?</span>
+1334 <span class="c">#</span>
+1335 <span class="c"># A matrix is an unit upper triangular matrix:</span>
+1336 <span class="c">#   o It&#39;s a square matrix</span>
+1337 <span class="c">#   o All its entries main diagonal are one</span>
+1338 <span class="c">#   o All its entries below the main diagonal are zero</span>
+1339 <span class="c">#</span>
+<a name="IsUnitUpperTriangular-"></a>1340 <span class="k">sub </span><span class="m">IsUnitUpperTriangular</span> <span class="s">{</span>
+1341   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1342   <span class="k">my</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1343 
+1344   <span class="i">$DiagonalValue</span> = <span class="n">1</span><span class="sc">;</span>
+1345 
+1346   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;_IsUpperTriangularMatrix</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span><span class="sc">;</span>
+1347 <span class="s">}</span>
+1348 
+1349 <span class="c"># Is it a upper unitriangular matrix?</span>
+1350 <span class="c">#</span>
+<a name="IsUpperUniTriangular-"></a>1351 <span class="k">sub </span><span class="m">IsUpperUniTriangular</span> <span class="s">{</span>
+1352   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1353 
+1354   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsUnitUpperTriangular</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1355 <span class="s">}</span>
+1356 
+1357 <span class="c"># Is it an upper triangular, strictly upper triangular, or unit upper triangular matrix?</span>
+1358 <span class="c">#</span>
+<a name="_IsUpperTriangularMatrix-"></a>1359 <span class="k">sub </span><span class="m">_IsUpperTriangularMatrix</span> <span class="s">{</span>
+1360   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$DiagonalValue</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1361 
+1362   <span class="c"># Is is a square matrix?</span>
+1363   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1364     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1365   <span class="s">}</span>
+1366   <span class="c"># Check matrix values...</span>
+1367   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="cm">,</span> <span class="i">$CheckDiagonalValues</span><span class="s">)</span><span class="sc">;</span>
+1368 
+1369   <span class="i">$CheckDiagonalValues</span> = <span class="k">defined</span><span class="s">(</span><span class="i">$DiagonalValue</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1370   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1371 
+1372   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1373     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1374       <span class="k">if</span> <span class="s">(</span><span class="i">$CheckDiagonalValues</span> &amp;&amp; <span class="i">$RowIndex</span> == <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1375         <span class="c"># Main diagonal...</span>
+1376         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$DiagonalValue</span><span class="s">)</span> <span class="s">{</span>
+1377           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1378         <span class="s">}</span>
+1379       <span class="s">}</span>
+1380       <span class="k">elsif</span> <span class="s">(</span><span class="i">$RowIndex</span> &gt; <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1381         <span class="c"># Elemens below the main diagonal...</span>
+1382         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1383           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1384         <span class="s">}</span>
+1385       <span class="s">}</span>
+1386     <span class="s">}</span>
+1387   <span class="s">}</span>
+1388   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1389 <span class="s">}</span>
+1390 
+1391 <span class="c"># Is it a symmetrix matrix?</span>
+1392 <span class="c">#</span>
+1393 <span class="c"># A matrix is a symmetric matrix:</span>
+1394 <span class="c">#   o It&#39;s a square matrix</span>
+1395 <span class="c">#   o Its elements are symmetric with respect to main diagonal. In other words,</span>
+1396 <span class="c">#     elements below the main diagonal are equal to the elements above the main</span>
+1397 <span class="c">#     diagonal.</span>
+1398 <span class="c">#</span>
+1399 <span class="c"># Transpose of a symmetric matrix equals the matrix itself.</span>
+1400 <span class="c">#</span>
+<a name="IsSymmetric-"></a>1401 <span class="k">sub </span><span class="m">IsSymmetric</span> <span class="s">{</span>
+1402   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1403 
+1404   <span class="c"># Is is a square matrix?</span>
+1405   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1406     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1407   <span class="s">}</span>
+1408 
+1409   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1410   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1411 
+1412   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1413     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$RowIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1414       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span>
+1415         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1416       <span class="s">}</span>
+1417     <span class="s">}</span>
+1418   <span class="s">}</span>
+1419   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1420 <span class="s">}</span>
+1421 
+1422 <span class="c"># Is it a anti symmetrix matrix?</span>
+1423 <span class="c">#</span>
+1424 <span class="c"># A matrix is an anti symmetric matrix:</span>
+1425 <span class="c">#   o It&#39;s a square matrix</span>
+1426 <span class="c">#   o Its elements are asymmetric with respect to main diagonal. In other words,</span>
+1427 <span class="c">#     elements below the main diagonal are equal to the negative of elements above</span>
+1428 <span class="c">#     the main diagonal.</span>
+1429 <span class="c">#</span>
+1430 <span class="c"># Transpose of a anti symmetric matrix equals the negative of the matrix.</span>
+1431 <span class="c">#</span>
+<a name="IsAntiSymmetric-"></a>1432 <span class="k">sub </span><span class="m">IsAntiSymmetric</span> <span class="s">{</span>
+1433   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1434 
+1435   <span class="c"># Is is a square matrix?</span>
+1436   <span class="k">if</span> <span class="s">(</span>!<span class="i">$This</span><span class="i">-&gt;IsSquare</span><span class="s">(</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1437     <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1438   <span class="s">}</span>
+1439 
+1440   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1441   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1442 
+1443   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1444     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$RowIndex</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1445       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != -<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="s">)</span> <span class="s">{</span>
+1446         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1447       <span class="s">}</span>
+1448     <span class="s">}</span>
+1449   <span class="s">}</span>
+1450   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1451 <span class="s">}</span>
+1452 
+1453 <span class="c"># Is it a skew symmetrix matrix?</span>
+1454 <span class="c">#</span>
+1455 <span class="c"># It&#39;s another name for AnitSymmetricMatrix.</span>
+1456 <span class="c">#</span>
+<a name="IsSkewSymmetric-"></a>1457 <span class="k">sub </span><span class="m">IsSkewSymmetric</span> <span class="s">{</span>
+1458   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1459 
+1460   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsAntiSymmetric</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1461 <span class="s">}</span>
+1462 
+1463 <span class="c"># Is it a positive matrix with all its values &gt;= zero?</span>
+1464 <span class="c">#</span>
+<a name="IsPositive-"></a>1465 <span class="k">sub </span><span class="m">IsPositive</span> <span class="s">{</span>
+1466   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1467 
+1468   <span class="c"># Check matrix values...</span>
+1469   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1470   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1471 
+1472   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1473     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1474       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1475         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1476       <span class="s">}</span>
+1477     <span class="s">}</span>
+1478   <span class="s">}</span>
+1479   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1480 <span class="s">}</span>
+1481 
+1482 <span class="c"># Is it a positive matrix with all its values &lt;= zero?</span>
+1483 <span class="c">#</span>
+<a name="IsNegative-"></a>1484 <span class="k">sub </span><span class="m">IsNegative</span> <span class="s">{</span>
+1485   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1486 
+1487   <span class="k">return</span> <span class="i">$This</span><span class="i">-&gt;IsPositive</span><span class="s">(</span><span class="s">)</span> ? <span class="n">0</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+1488 <span class="s">}</span>
+1489 
+1490 <span class="c"># Transpose the matrix by swaping rows with columns...</span>
+1491 <span class="c">#</span>
+<a name="Transpose-"></a>1492 <span class="k">sub </span><span class="m">Transpose</span> <span class="s">{</span>
+1493   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1494   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1495 
+1496   <span class="c"># Create the transpose matrix of size $NumOfCols x $NumOfRows</span>
+1497   <span class="c">#</span>
+1498   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1499   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
+1500 
+1501   <span class="c"># Swap rows and columns...</span>
+1502   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1503     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1504       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$ColIndex</span>][<span class="i">$RowIndex</span>]<span class="sc">;</span>
+1505     <span class="s">}</span>
+1506   <span class="s">}</span>
+1507   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1508 <span class="s">}</span>
+1509 
+1510 <span class="c"># Is it a matrix object?</span>
+<a name="IsMatrix-"></a>1511 <span class="k">sub </span><span class="m">IsMatrix ($)</span> <span class="s">{</span>
+1512   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1513 
+1514   <span class="k">return</span> <span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span><span class="sc">;</span>
+1515 <span class="s">}</span>
+1516 
+1517 <span class="c"># Set value print format for an individual object or the whole class during StringifyMatrix operation...</span>
+<a name="SetValuePrintFormat-"></a>1518 <span class="k">sub </span><span class="m">SetValuePrintFormat ($;$)</span> <span class="s">{</span>
+1519   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1520 
+1521   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1522     <span class="c"># Set value print format for the specific object...</span>
+1523     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+1524 
+1525     <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
+1526   <span class="s">}</span>
+1527   <span class="k">else</span> <span class="s">{</span>
+1528     <span class="c"># Set value print format for the class...</span>
+1529     <span class="k">my</span><span class="s">(</span><span class="i">$ValuePrintFormat</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span>
+1530 
+1531     <span class="i">$ValueFormat</span> = <span class="i">$ValuePrintFormat</span><span class="sc">;</span>
+1532   <span class="s">}</span>
+1533 <span class="s">}</span>
+1534 
+1535 <span class="c"># Set print style for matrix rows for an individual object or the whole class during StringifyMatrix</span>
+1536 <span class="c"># operation.</span>
+1537 <span class="c">#</span>
+1538 <span class="c"># Possible values: AllRowsInOneLine, OneRowPerLine. Default: AllRowsInOneLine</span>
+1539 <span class="c">#</span>
+<a name="SetMatrixPrintStyle-"></a>1540 <span class="k">sub </span><span class="m">SetMatrixPrintStyle ($;$)</span> <span class="s">{</span>
+1541   <span class="k">my</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1542 
+1543   <span class="k">if</span> <span class="s">(</span><span class="s">(</span><span class="i">@_</span> == <span class="n">2</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1544     <span class="c"># Set value print format for the specific object...</span>
+1545     <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$MatrixPrintStyleValue</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+1546 
+1547     <span class="k">if</span> <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> !~ <span class="q">/^(AllRowsInOneLine|OneRowPerLine)$/i</span><span class="s">)</span> <span class="s">{</span>
+1548       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine...&quot;</span><span class="sc">;</span>
+1549     <span class="s">}</span>
+1550 
+1551     <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>} = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span>
+1552   <span class="s">}</span>
+1553   <span class="k">else</span> <span class="s">{</span>
+1554     <span class="c"># Set value print format for the class...</span>
+1555     <span class="k">my</span><span class="s">(</span><span class="i">$MatrixPrintStyleValue</span><span class="s">)</span> = <span class="s">(</span><span class="i">$FirstParameter</span><span class="s">)</span><span class="sc">;</span>
+1556 
+1557     <span class="k">if</span> <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> !~ <span class="q">/^(AllRowsInOneLine|OneRowPerLine)$/i</span><span class="s">)</span> <span class="s">{</span>
+1558       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}::SetMatrixPrintStyle: Specified MatrixPrintStyle, $MatrixPrintStyleValue, is not valid. Supported values: AllRowsInOneLine, OneRowPerLine...&quot;</span><span class="sc">;</span>
+1559     <span class="s">}</span>
+1560 
+1561     <span class="i">$MatrixPrintStyle</span> = <span class="i">$MatrixPrintStyleValue</span><span class="sc">;</span>
+1562   <span class="s">}</span>
+1563 <span class="s">}</span>
+1564 
+1565 <span class="c"># Is it a matrix object?</span>
+1566 <span class="c">#</span>
+<a name="_IsMatrix-"></a>1567 <span class="k">sub </span><span class="m">_IsMatrix</span> <span class="s">{</span>
+1568   <span class="k">my</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1569 
+1570   <span class="k">return</span> <span class="s">(</span><span class="i">Scalar::Util::blessed</span><span class="s">(</span><span class="i">$Object</span><span class="s">)</span> &amp;&amp; <span class="i">$Object</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="i">$ClassName</span><span class="s">)</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+1571 <span class="s">}</span>
+1572 
+1573 <span class="c"># Make sure it&#39;s a matrix reference...</span>
+1574 <span class="c">#</span>
+<a name="_ValidateMatrix-"></a>1575 <span class="k">sub </span><span class="m">_ValidateMatrix</span> <span class="s">{</span>
+1576   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Matrix</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1577 
+1578   <span class="k">if</span> <span class="s">(</span>!<span class="i">_IsMatrix</span><span class="s">(</span><span class="i">$Matrix</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1579     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Object must be a matrix...&quot;</span><span class="sc">;</span>
+1580   <span class="s">}</span>
+1581 <span class="s">}</span>
+1582 
+1583 <span class="c"># Make sure both row and column indicies are valid...</span>
+1584 <span class="c">#</span>
+<a name="_ValidateRowAndColumnIndicies-"></a>1585 <span class="k">sub </span><span class="m">_ValidateRowAndColumnIndicies</span> <span class="s">{</span>
+1586   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColumnIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1587 
+1588   <span class="i">$This</span><span class="i">-&gt;_ValidateRowIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span><span class="sc">;</span>
+1589   <span class="i">$This</span><span class="i">-&gt;_ValidateColumnIndex</span><span class="s">(</span><span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColumnIndex</span><span class="s">)</span><span class="sc">;</span>
+1590 
+1591   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1592 <span class="s">}</span>
+1593 
+1594 <span class="c"># Make sure it&#39;s a valid row index...</span>
+1595 <span class="c">#</span>
+<a name="_ValidateRowIndex-"></a>1596 <span class="k">sub </span><span class="m">_ValidateRowIndex</span> <span class="s">{</span>
+1597   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1598   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="s">)</span><span class="sc">;</span>
+1599 
+1600   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$RowIndex</span><span class="s">)</span> <span class="s">{</span>
+1601     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: RowIndex must be defined...&quot;</span><span class="sc">;</span>
+1602   <span class="s">}</span>
+1603   <span class="i">$NumOfRows</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfRows</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1604   <span class="k">if</span> <span class="s">(</span><span class="i">$RowIndex</span> &lt; <span class="n">0</span> || <span class="i">$RowIndex</span> &gt;= <span class="i">$NumOfRows</span><span class="s">)</span> <span class="s">{</span>
+1605     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: RowIndex value $RowIndex must be &gt;= 0 and &lt; $NumOfRows, NumOfRows, in matrix...&quot;</span><span class="sc">;</span>
+1606   <span class="s">}</span>
+1607   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1608 <span class="s">}</span>
+1609 
+1610 <span class="c"># Make sure it&#39;s a valid column index...</span>
+1611 <span class="c">#</span>
+<a name="_ValidateColumnIndex-"></a>1612 <span class="k">sub </span><span class="m">_ValidateColumnIndex</span> <span class="s">{</span>
+1613   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$ErrorMsgPrefix</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+1614   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1615 
+1616   <span class="k">if</span> <span class="s">(</span>!<span class="k">defined</span> <span class="i">$ColIndex</span><span class="s">)</span> <span class="s">{</span>
+1617     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: ColIndex must be defined...&quot;</span><span class="sc">;</span>
+1618   <span class="s">}</span>
+1619   <span class="i">$NumOfCols</span> = <span class="i">$This</span><span class="i">-&gt;GetNumOfColumns</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1620   <span class="k">if</span> <span class="s">(</span><span class="i">$ColIndex</span> &lt; <span class="n">0</span> || <span class="i">$ColIndex</span> &gt;= <span class="i">$NumOfCols</span><span class="s">)</span> <span class="s">{</span>
+1621     <span class="w">croak</span> <span class="q">&quot;$ErrorMsgPrefix: ColIndex value $ColIndex must be &gt;= 0 and &lt; $NumOfCols, NumOfCols, in matrix...&quot;</span><span class="sc">;</span>
+1622   <span class="s">}</span>
+1623   <span class="k">return</span> <span class="i">$This</span><span class="sc">;</span>
+1624 <span class="s">}</span>
+1625 
+1626 <span class="c">#</span>
+1627 <span class="c"># Matrix addition operator supports two addition modes:</span>
+1628 <span class="c">#   . Addition of two matrices by adding corresponding matrix values</span>
+1629 <span class="c">#   . Addition of a scalar value to matrix values ($Matrix + 1)</span>
+1630 <span class="c">#</span>
+1631 <span class="c"># Caveats:</span>
+1632 <span class="c">#   . Addition of a matrix to scalar is not allowed (1 + $Matrix)</span>
+1633 <span class="c">#</span>
+<a name="_MatrixAdditionOperator-"></a>1634 <span class="k">sub </span><span class="m">_MatrixAdditionOperator</span> <span class="s">{</span>
+1635   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1636 
+1637   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixAdditionOperator: Matrix addition failed&quot;</span><span class="sc">;</span>
+1638   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1639 
+1640   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1641 
+1642   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1643   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1644 
+1645   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1646     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1647     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1648       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1649         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1650       <span class="s">}</span>
+1651     <span class="s">}</span>
+1652   <span class="s">}</span>
+1653   <span class="k">else</span> <span class="s">{</span>
+1654     <span class="c"># Scalar addition...</span>
+1655     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1656       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1657     <span class="s">}</span>
+1658     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1659       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1660         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] + <span class="i">$Other</span><span class="sc">;</span>
+1661       <span class="s">}</span>
+1662     <span class="s">}</span>
+1663   <span class="s">}</span>
+1664   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1665 <span class="s">}</span>
+1666 
+1667 <span class="c">#</span>
+1668 <span class="c"># Matrix subtraction operator supports two subtraction modes:</span>
+1669 <span class="c">#   . Subtraction of two matrices by subtracting corresponding matrix values</span>
+1670 <span class="c">#   . Subtraction of a scalar value from matrix values ($Matrix - 1)</span>
+1671 <span class="c">#</span>
+1672 <span class="c"># Caveats:</span>
+1673 <span class="c">#   . Subtraction of a matrix from scalar is not allowed (1 - $Matrix)</span>
+1674 <span class="c">#</span>
+<a name="_MatrixSubtractionOperator-"></a>1675 <span class="k">sub </span><span class="m">_MatrixSubtractionOperator</span> <span class="s">{</span>
+1676   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1677 
+1678   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSubtractionOperator: Matrix subtraction failed&quot;</span><span class="sc">;</span>
+1679   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1680 
+1681   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1682 
+1683   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1684   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1685 
+1686   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1687     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1688     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1689       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1690         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1691       <span class="s">}</span>
+1692     <span class="s">}</span>
+1693   <span class="s">}</span>
+1694   <span class="k">else</span> <span class="s">{</span>
+1695     <span class="c"># Scalar subtraction...</span>
+1696     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1697       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1698     <span class="s">}</span>
+1699     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1700       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1701         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] - <span class="i">$Other</span><span class="sc">;</span>
+1702       <span class="s">}</span>
+1703     <span class="s">}</span>
+1704   <span class="s">}</span>
+1705   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1706 <span class="s">}</span>
+1707 
+1708 <span class="c">#</span>
+1709 <span class="c"># Matrix multiplication operator supports two multiplication modes:</span>
+1710 <span class="c">#   . Multiplication of two matrices</span>
+1711 <span class="c">#   . Multiplication of matrix values by a scalar ($Matrix * 1)</span>
+1712 <span class="c">#</span>
+1713 <span class="c"># Caveats:</span>
+1714 <span class="c">#   . Multiplication of a scalar by a is not allowed (1 * $Matrix)</span>
+1715 <span class="c">#</span>
+<a name="_MatrixMultiplicationOperator-"></a>1716 <span class="k">sub </span><span class="m">_MatrixMultiplicationOperator</span> <span class="s">{</span>
+1717   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="s">)</span><span class="sc">;</span>
+1718 
+1719   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixMultiplicationOperator: Matrix multiplication failed&quot;</span><span class="sc">;</span>
+1720   <span class="i">$CheckSizes</span> = <span class="n">0</span><span class="sc">;</span>
+1721   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckSizes</span><span class="s">)</span><span class="sc">;</span>
+1722 
+1723   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="s">)</span><span class="sc">;</span>
+1724 
+1725   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1726     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1727     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="cm">,</span> <span class="i">$RowIndex1</span><span class="cm">,</span> <span class="i">$ColIndex1</span><span class="cm">,</span> <span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="cm">,</span> <span class="i">$ColIndex2</span><span class="cm">,</span> <span class="i">$Value</span><span class="cm">,</span> <span class="i">$RowColIndex</span><span class="s">)</span><span class="sc">;</span>
+1728 
+1729     <span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1730     <span class="s">(</span><span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1731 
+1732     <span class="k">if</span> <span class="s">(</span><span class="i">$NumOfCols1</span> != <span class="i">$NumOfRows2</span><span class="s">)</span> <span class="s">{</span>
+1733       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: NumOfCols in first matrix of size $NumOfRows1 x $NumOfCols1 must be equal to NumOfRows in second matrix of size $NumOfRows2 x $NumOfCols2...&quot;</span><span class="sc">;</span>
+1734     <span class="s">}</span>
+1735 
+1736     <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span><span class="sc">;</span>
+1737 
+1738     <span class="k">for</span> <span class="i">$RowIndex1</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows1</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1739       <span class="k">for</span> <span class="i">$ColIndex2</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols2</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1740         <span class="i">$Value</span> = <span class="n">0</span><span class="sc">;</span>
+1741         <span class="k">for</span> <span class="i">$RowColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols1</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1742           <span class="i">$Value</span> += <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$RowColIndex</span>] * <span class="i">$Other</span>-&gt;[<span class="i">$RowColIndex</span>][<span class="i">$ColIndex2</span>]<span class="sc">;</span>
+1743         <span class="s">}</span>
+1744         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex1</span>][<span class="i">$ColIndex2</span>] = <span class="i">$Value</span><span class="sc">;</span>
+1745       <span class="s">}</span>
+1746     <span class="s">}</span>
+1747   <span class="s">}</span>
+1748   <span class="k">else</span> <span class="s">{</span>
+1749     <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1750 
+1751     <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1752     <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1753     <span class="c"># Scalar subtraction...</span>
+1754     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1755       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1756     <span class="s">}</span>
+1757     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1758       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1759         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] * <span class="i">$Other</span><span class="sc">;</span>
+1760       <span class="s">}</span>
+1761     <span class="s">}</span>
+1762   <span class="s">}</span>
+1763   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1764 <span class="s">}</span>
+1765 
+1766 <span class="c">#</span>
+1767 <span class="c"># Matrix division operator supports two division modes:</span>
+1768 <span class="c">#   . Division of two matrices by dividing corresponding matrix values</span>
+1769 <span class="c">#   . Division matrix values  by a scalar($Matrix/2)</span>
+1770 <span class="c">#</span>
+1771 <span class="c"># Caveats:</span>
+1772 <span class="c">#   . Division of scalar value by a matrix is not allowed (2/$Matrix)</span>
+1773 <span class="c">#</span>
+<a name="_MatrixDivisionOperator-"></a>1774 <span class="k">sub </span><span class="m">_MatrixDivisionOperator</span> <span class="s">{</span>
+1775   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1776 
+1777   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixDivisionOperator: Matrix division failed&quot;</span><span class="sc">;</span>
+1778   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1779 
+1780   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1781 
+1782   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1783   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1784 
+1785   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1786     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1787     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1788       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1789         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1790       <span class="s">}</span>
+1791     <span class="s">}</span>
+1792   <span class="s">}</span>
+1793   <span class="k">else</span> <span class="s">{</span>
+1794     <span class="c"># Scalar subtraction...</span>
+1795     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1796       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1797     <span class="s">}</span>
+1798     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1799       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1800         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] / <span class="i">$Other</span><span class="sc">;</span>
+1801       <span class="s">}</span>
+1802     <span class="s">}</span>
+1803   <span class="s">}</span>
+1804   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1805 <span class="s">}</span>
+1806 
+1807 <span class="c">#</span>
+1808 <span class="c"># Matrix exponentiation operator supports two division modes:</span>
+1809 <span class="c">#   . Exponent of two matrices by exponentiation of corresponding matrix values</span>
+1810 <span class="c">#   . Exponentiation matrix values  by a scalar ($Matrix ** 2)</span>
+1811 <span class="c">#</span>
+1812 <span class="c"># Caveats:</span>
+1813 <span class="c">#   . Exponentiation of scalar value by a matrix is not allowed (2 ** $Matrix)</span>
+1814 <span class="c">#</span>
+<a name="_MatrixExponentiationOperator-"></a>1815 <span class="k">sub </span><span class="m">_MatrixExponentiationOperator</span> <span class="s">{</span>
+1816   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1817 
+1818   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixExponentiationOperator: Matrix exponentiation failed&quot;</span><span class="sc">;</span>
+1819   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1820 
+1821   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1822 
+1823   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1824   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1825 
+1826   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1827     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1828     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1829       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1830         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1831       <span class="s">}</span>
+1832     <span class="s">}</span>
+1833   <span class="s">}</span>
+1834   <span class="k">else</span> <span class="s">{</span>
+1835     <span class="c"># Scalar subtraction...</span>
+1836     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1837       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1838     <span class="s">}</span>
+1839     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1840       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1841         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] ** <span class="i">$Other</span><span class="sc">;</span>
+1842       <span class="s">}</span>
+1843     <span class="s">}</span>
+1844   <span class="s">}</span>
+1845   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1846 <span class="s">}</span>
+1847 
+1848 <span class="c">#</span>
+1849 <span class="c"># Matrix modulus operator supports two division modes:</span>
+1850 <span class="c">#   . Modulus of two matrices by taking modulus between corresponding matrix values</span>
+1851 <span class="c">#   . Modulus of matrix values  by a scalar ($Matrix % 2)</span>
+1852 <span class="c">#</span>
+1853 <span class="c"># Caveats:</span>
+1854 <span class="c">#   . Modulus of scalar value by a matrix is not allowed (2 % $Matrix)</span>
+1855 <span class="c">#</span>
+<a name="_MatrixModulusOperator-"></a>1856 <span class="k">sub </span><span class="m">_MatrixModulusOperator</span> <span class="s">{</span>
+1857   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1858 
+1859   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixModulusOperator: Matrix modulus failed&quot;</span><span class="sc">;</span>
+1860   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1861 
+1862   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1863 
+1864   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1865   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1866 
+1867   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1868     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1869     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1870       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1871         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+1872       <span class="s">}</span>
+1873     <span class="s">}</span>
+1874   <span class="s">}</span>
+1875   <span class="k">else</span> <span class="s">{</span>
+1876     <span class="c"># Scalar subtraction...</span>
+1877     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1878       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1879     <span class="s">}</span>
+1880     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1881       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1882         <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] % <span class="i">$Other</span><span class="sc">;</span>
+1883       <span class="s">}</span>
+1884     <span class="s">}</span>
+1885   <span class="s">}</span>
+1886   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+1887 <span class="s">}</span>
+1888 
+1889 <span class="c">#</span>
+1890 <span class="c"># Matrix booelan operator checks whether a matrix contains at least one non-zero</span>
+1891 <span class="c"># value...</span>
+1892 <span class="c">#</span>
+<a name="_MatrixBooleanOperator-"></a>1893 <span class="k">sub </span><span class="m">_MatrixBooleanOperator</span> <span class="s">{</span>
+1894   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1895 
+1896   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixBooleanOperator: Matrix boolean operation failed&quot;</span><span class="sc">;</span>
+1897   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1898 
+1899   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1900 
+1901   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1902   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1903     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1904       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1905         <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1906       <span class="s">}</span>
+1907     <span class="s">}</span>
+1908   <span class="s">}</span>
+1909   <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1910 <span class="s">}</span>
+1911 
+1912 <span class="c">#</span>
+1913 <span class="c"># Matrix not booelan operator checks whether a matrix contains only zero values...</span>
+1914 <span class="c"># value...</span>
+1915 <span class="c">#</span>
+<a name="_MatrixNotBooleanOperator-"></a>1916 <span class="k">sub </span><span class="m">_MatrixNotBooleanOperator</span> <span class="s">{</span>
+1917   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1918 
+1919   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNotBooleanOperator: Matrix not boolean operation failed&quot;</span><span class="sc">;</span>
+1920   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+1921 
+1922   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1923 
+1924   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1925   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1926     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1927       <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="n">0.0</span><span class="s">)</span> <span class="s">{</span>
+1928         <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1929       <span class="s">}</span>
+1930     <span class="s">}</span>
+1931   <span class="s">}</span>
+1932   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1933 <span class="s">}</span>
+1934 
+1935 <span class="c">#</span>
+1936 <span class="c"># Matrix equal operator supports two modes:</span>
+1937 <span class="c">#   . Comparison of corresponding values in two matrices</span>
+1938 <span class="c">#   . Comparing matrix values to a scalar ($Matrix == 2)</span>
+1939 <span class="c">#</span>
+1940 <span class="c"># Caveats:</span>
+1941 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 == $Matrix)</span>
+1942 <span class="c">#</span>
+<a name="_MatrixEqualOperator-"></a>1943 <span class="k">sub </span><span class="m">_MatrixEqualOperator</span> <span class="s">{</span>
+1944   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1945 
+1946   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixEqualOperator: Matrix equal failed&quot;</span><span class="sc">;</span>
+1947   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+1948   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+1949 
+1950   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+1951 
+1952   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1953 
+1954   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+1955     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+1956     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+1957 
+1958     <span class="c"># Check sizes...</span>
+1959     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+1960     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1961       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1962     <span class="s">}</span>
+1963 
+1964     <span class="c"># Check values...</span>
+1965     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1966       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1967         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+1968           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1969         <span class="s">}</span>
+1970       <span class="s">}</span>
+1971     <span class="s">}</span>
+1972   <span class="s">}</span>
+1973   <span class="k">else</span> <span class="s">{</span>
+1974     <span class="c"># Scalar comparison...</span>
+1975     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+1976       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+1977     <span class="s">}</span>
+1978     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1979       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+1980         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] != <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+1981           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+1982         <span class="s">}</span>
+1983       <span class="s">}</span>
+1984     <span class="s">}</span>
+1985   <span class="s">}</span>
+1986   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+1987 <span class="s">}</span>
+1988 
+1989 <span class="c">#</span>
+1990 <span class="c"># Matrix not equal operator supports two modes:</span>
+1991 <span class="c">#   . Comparison of corresponding values in two matrices</span>
+1992 <span class="c">#   . Comparing matrix values to a scalar ($Matrix != 2)</span>
+1993 <span class="c">#</span>
+1994 <span class="c"># Caveats:</span>
+1995 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 != $Matrix)</span>
+1996 <span class="c">#</span>
+<a name="_MatrixNotEqualOperator-"></a>1997 <span class="k">sub </span><span class="m">_MatrixNotEqualOperator</span> <span class="s">{</span>
+1998   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+1999 
+2000   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNotEqualOperator: Matrix not equal failed&quot;</span><span class="sc">;</span>
+2001   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+2002   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2003 
+2004   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2005 
+2006   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2007 
+2008   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+2009     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+2010     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2011 
+2012     <span class="c"># Check sizes...</span>
+2013     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2014     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2015       <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2016     <span class="s">}</span>
+2017 
+2018     <span class="c"># Check values...</span>
+2019     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2020       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2021         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] == <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+2022           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2023         <span class="s">}</span>
+2024       <span class="s">}</span>
+2025     <span class="s">}</span>
+2026   <span class="s">}</span>
+2027   <span class="k">else</span> <span class="s">{</span>
+2028     <span class="c"># Scalar comparison...</span>
+2029     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+2030       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+2031     <span class="s">}</span>
+2032     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2033       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2034         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] == <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+2035           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2036         <span class="s">}</span>
+2037       <span class="s">}</span>
+2038     <span class="s">}</span>
+2039   <span class="s">}</span>
+2040   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2041 <span class="s">}</span>
+2042 
+2043 <span class="c">#</span>
+2044 <span class="c"># Matrix less than operator supports two modes:</span>
+2045 <span class="c">#   . Comparison of corresponding values in two matrices</span>
+2046 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &lt; 2)</span>
+2047 <span class="c">#</span>
+2048 <span class="c"># Caveats:</span>
+2049 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &lt; $Matrix)</span>
+2050 <span class="c">#</span>
+<a name="_MatrixLessThanOperator-"></a>2051 <span class="k">sub </span><span class="m">_MatrixLessThanOperator</span> <span class="s">{</span>
+2052   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2053 
+2054   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLessThanOperator: Matrix less than failed&quot;</span><span class="sc">;</span>
+2055   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+2056   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2057 
+2058   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2059 
+2060   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2061 
+2062   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+2063     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+2064     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2065 
+2066     <span class="c"># Check sizes...</span>
+2067     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2068     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2069       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2070     <span class="s">}</span>
+2071 
+2072     <span class="c"># Check values...</span>
+2073     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2074       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2075         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+2076           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2077         <span class="s">}</span>
+2078       <span class="s">}</span>
+2079     <span class="s">}</span>
+2080   <span class="s">}</span>
+2081   <span class="k">else</span> <span class="s">{</span>
+2082     <span class="c"># Scalar comparison...</span>
+2083     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+2084       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+2085     <span class="s">}</span>
+2086     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2087       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2088         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+2089           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2090         <span class="s">}</span>
+2091       <span class="s">}</span>
+2092     <span class="s">}</span>
+2093   <span class="s">}</span>
+2094   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2095 <span class="s">}</span>
+2096 
+2097 <span class="c">#</span>
+2098 <span class="c"># Matrix less than equal operator supports two modes:</span>
+2099 <span class="c">#   . Comparion of corresponding values in two matrices</span>
+2100 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &lt;= 2)</span>
+2101 <span class="c">#</span>
+2102 <span class="c"># Caveats:</span>
+2103 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &lt;= $Matrix)</span>
+2104 <span class="c">#</span>
+<a name="_MatrixLessThanEqualOperator-"></a>2105 <span class="k">sub </span><span class="m">_MatrixLessThanEqualOperator</span> <span class="s">{</span>
+2106   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2107 
+2108   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLessThanEqualOperator: Matrix less than equal failed&quot;</span><span class="sc">;</span>
+2109   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+2110   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2111 
+2112   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2113 
+2114   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2115 
+2116   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+2117     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+2118     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2119 
+2120     <span class="c"># Check sizes...</span>
+2121     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2122     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2123       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2124     <span class="s">}</span>
+2125 
+2126     <span class="c"># Check values...</span>
+2127     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2128       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2129         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+2130           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2131         <span class="s">}</span>
+2132       <span class="s">}</span>
+2133     <span class="s">}</span>
+2134   <span class="s">}</span>
+2135   <span class="k">else</span> <span class="s">{</span>
+2136     <span class="c"># Scalar comparison...</span>
+2137     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+2138       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+2139     <span class="s">}</span>
+2140     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2141       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2142         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &gt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+2143           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2144         <span class="s">}</span>
+2145       <span class="s">}</span>
+2146     <span class="s">}</span>
+2147   <span class="s">}</span>
+2148   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2149 <span class="s">}</span>
+2150 
+2151 <span class="c">#</span>
+2152 <span class="c"># Matrix greatar than operator supports two modes:</span>
+2153 <span class="c">#   . Comparison of corresponding values in two matrices</span>
+2154 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &gt; 2)</span>
+2155 <span class="c">#</span>
+2156 <span class="c"># Caveats:</span>
+2157 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &gt; $Matrix)</span>
+2158 <span class="c">#</span>
+<a name="_MatrixGreatarThanOperator-"></a>2159 <span class="k">sub </span><span class="m">_MatrixGreatarThanOperator</span> <span class="s">{</span>
+2160   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2161 
+2162   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixGreatarThanOperator: Matrix greatar than failed&quot;</span><span class="sc">;</span>
+2163   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+2164   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2165 
+2166   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2167 
+2168   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2169 
+2170   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+2171     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+2172     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2173 
+2174     <span class="c"># Check sizes...</span>
+2175     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2176     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2177       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2178     <span class="s">}</span>
+2179 
+2180     <span class="c"># Check values...</span>
+2181     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2182       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2183         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt;= <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+2184           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2185         <span class="s">}</span>
+2186       <span class="s">}</span>
+2187     <span class="s">}</span>
+2188   <span class="s">}</span>
+2189   <span class="k">else</span> <span class="s">{</span>
+2190     <span class="c"># Scalar comparison...</span>
+2191     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+2192       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+2193     <span class="s">}</span>
+2194     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2195       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2196         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt;= <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+2197           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2198         <span class="s">}</span>
+2199       <span class="s">}</span>
+2200     <span class="s">}</span>
+2201   <span class="s">}</span>
+2202   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2203 <span class="s">}</span>
+2204 
+2205 <span class="c">#</span>
+2206 <span class="c"># Matrix greatar than equal operator supports two modes:</span>
+2207 <span class="c">#   . Comparison of corresponding values in two matrices</span>
+2208 <span class="c">#   . Comparing matrix values to a scalar ($Matrix &gt;= 2)</span>
+2209 <span class="c">#</span>
+2210 <span class="c"># Caveats:</span>
+2211 <span class="c">#   . Comparison of a scalar to matrix values is not allowed (2 &gt;= $Matrix)</span>
+2212 <span class="c">#</span>
+<a name="_MatrixGreatarThanEqualOperator-"></a>2213 <span class="k">sub </span><span class="m">_MatrixGreatarThanEqualOperator</span> <span class="s">{</span>
+2214   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2215 
+2216   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixGreatarThanEqualOperator: Matrix greatar than equal failed&quot;</span><span class="sc">;</span>
+2217   <span class="i">$CheckMatrixSizes</span> = <span class="n">0</span><span class="sc">;</span>
+2218   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2219 
+2220   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2221 
+2222   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2223 
+2224   <span class="k">if</span> <span class="s">(</span><span class="i">$OtherIsMatrix</span><span class="s">)</span> <span class="s">{</span>
+2225     <span class="c"># $OrderFlipped is set to false for two matrices...</span>
+2226     <span class="k">my</span><span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2227 
+2228     <span class="c"># Check sizes...</span>
+2229     <span class="s">(</span><span class="i">$OtherNumOfRows</span><span class="cm">,</span> <span class="i">$OtherNumOfCols</span><span class="s">)</span> = <span class="i">$Other</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2230     <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows</span> == <span class="i">$OtherNumOfRows</span> &amp;&amp; <span class="i">$NumOfCols</span> == <span class="i">$OtherNumOfCols</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2231       <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2232     <span class="s">}</span>
+2233 
+2234     <span class="c"># Check values...</span>
+2235     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2236       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2237         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="i">$Other</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="s">)</span> <span class="s">{</span>
+2238           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2239         <span class="s">}</span>
+2240       <span class="s">}</span>
+2241     <span class="s">}</span>
+2242   <span class="s">}</span>
+2243   <span class="k">else</span> <span class="s">{</span>
+2244     <span class="c"># Scalar comparison...</span>
+2245     <span class="k">if</span> <span class="s">(</span><span class="i">$OrderFlipped</span><span class="s">)</span> <span class="s">{</span>
+2246       <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: First object must be a matrix...&quot;</span><span class="sc">;</span>
+2247     <span class="s">}</span>
+2248     <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2249       <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2250         <span class="k">if</span> <span class="s">(</span><span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] &lt; <span class="i">$Other</span><span class="s">)</span> <span class="s">{</span>
+2251           <span class="k">return</span> <span class="n">0</span><span class="sc">;</span>
+2252         <span class="s">}</span>
+2253       <span class="s">}</span>
+2254     <span class="s">}</span>
+2255   <span class="s">}</span>
+2256   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2257 <span class="s">}</span>
+2258 
+2259 <span class="c">#</span>
+2260 <span class="c"># Matrix negative value operator returns a matrix with values corresponding to</span>
+2261 <span class="c"># negative values of a matrix</span>
+2262 <span class="c">#</span>
+<a name="_MatrixNegativeValueOperator-"></a>2263 <span class="k">sub </span><span class="m">_MatrixNegativeValueOperator</span> <span class="s">{</span>
+2264   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2265 
+2266   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixNegativeValueOperator: Matrix negative value operation failed&quot;</span><span class="sc">;</span>
+2267   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2268 
+2269   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2270 
+2271   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2272   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2273 
+2274   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2275     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2276       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = - <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2277     <span class="s">}</span>
+2278   <span class="s">}</span>
+2279   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2280 <span class="s">}</span>
+2281 
+2282 <span class="c">#</span>
+2283 <span class="c"># Matrix absolute value operator returns a matrix with values corresponding to</span>
+2284 <span class="c"># absolute values of a matrix</span>
+2285 <span class="c">#</span>
+<a name="_MatrixAbsoluteValueOperator-"></a>2286 <span class="k">sub </span><span class="m">_MatrixAbsoluteValueOperator</span> <span class="s">{</span>
+2287   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2288 
+2289   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixAbsoluteValueOperator: Matrix absolute value operation failed&quot;</span><span class="sc">;</span>
+2290   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2291 
+2292   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2293 
+2294   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2295   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2296 
+2297   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2298     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2299       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">abs</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2300     <span class="s">}</span>
+2301   <span class="s">}</span>
+2302   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2303 <span class="s">}</span>
+2304 
+2305 <span class="c">#</span>
+2306 <span class="c"># Matrix exp natural base operator returns a matrix with values corresponding to</span>
+2307 <span class="c"># e raised to the power of values in a matrix</span>
+2308 <span class="c">#</span>
+<a name="_MatrixExpNaturalBaseOperator-"></a>2309 <span class="k">sub </span><span class="m">_MatrixExpNaturalBaseOperator</span> <span class="s">{</span>
+2310   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2311 
+2312   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixExpNaturalBaseOperator: Matrix exp operation failed&quot;</span><span class="sc">;</span>
+2313   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2314 
+2315   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2316 
+2317   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2318   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2319 
+2320   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2321     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2322       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">exp</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2323     <span class="s">}</span>
+2324   <span class="s">}</span>
+2325   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2326 <span class="s">}</span>
+2327 
+2328 <span class="c">#</span>
+2329 <span class="c"># Matrix log natural base operator returns a matrix with values corresponding to</span>
+2330 <span class="c"># log of values in a matrix</span>
+2331 <span class="c">#</span>
+<a name="_MatrixLogNaturalBaseOperator-"></a>2332 <span class="k">sub </span><span class="m">_MatrixLogNaturalBaseOperator</span> <span class="s">{</span>
+2333   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2334 
+2335   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixLogNaturalBaseOperator: Matrix log operation failed&quot;</span><span class="sc">;</span>
+2336   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2337 
+2338   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2339 
+2340   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2341   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2342 
+2343   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2344     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2345       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">log</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2346     <span class="s">}</span>
+2347   <span class="s">}</span>
+2348   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2349 <span class="s">}</span>
+2350 
+2351 <span class="c">#</span>
+2352 <span class="c"># Matrix square root operator returns a matrix with values corresponding to</span>
+2353 <span class="c"># sqrt of values in a matrix</span>
+2354 <span class="c">#</span>
+<a name="_MatrixSquareRootOperator-"></a>2355 <span class="k">sub </span><span class="m">_MatrixSquareRootOperator</span> <span class="s">{</span>
+2356   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2357 
+2358   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSquareRootOperator: Matrix sqrt operation failed&quot;</span><span class="sc">;</span>
+2359   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2360 
+2361   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2362 
+2363   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2364   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2365 
+2366   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2367     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2368       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">sqrt</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2369     <span class="s">}</span>
+2370   <span class="s">}</span>
+2371   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2372 <span class="s">}</span>
+2373 
+2374 <span class="c">#</span>
+2375 <span class="c"># Matrix sine root operator returns a matrix with values corresponding to</span>
+2376 <span class="c"># sin of values in a matrix</span>
+2377 <span class="c">#</span>
+<a name="_MatrixSineOperator-"></a>2378 <span class="k">sub </span><span class="m">_MatrixSineOperator</span> <span class="s">{</span>
+2379   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2380 
+2381   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixSineOperator: Matrix sin operation failed&quot;</span><span class="sc">;</span>
+2382   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2383 
+2384   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2385 
+2386   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2387   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2388 
+2389   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2390     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2391       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">sin</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2392     <span class="s">}</span>
+2393   <span class="s">}</span>
+2394   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2395 <span class="s">}</span>
+2396 
+2397 <span class="c">#</span>
+2398 <span class="c"># Matrix cosine root operator returns a matrix with values corresponding to</span>
+2399 <span class="c"># cos of values in a matrix</span>
+2400 <span class="c">#</span>
+<a name="_MatrixCosineOperator-"></a>2401 <span class="k">sub </span><span class="m">_MatrixCosineOperator</span> <span class="s">{</span>
+2402   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$ErrorMsg</span><span class="s">)</span><span class="sc">;</span>
+2403 
+2404   <span class="i">$ErrorMsg</span> = <span class="q">&quot;_MatrixCosineOperator: Matrix cos operation failed&quot;</span><span class="sc">;</span>
+2405   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span> = <span class="i">_ProcessOverloadedOperatorParameters</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">@_</span><span class="s">)</span><span class="sc">;</span>
+2406 
+2407   <span class="k">my</span><span class="s">(</span><span class="i">$Matrix</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$ColIndex</span><span class="s">)</span><span class="sc">;</span>
+2408 
+2409   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2410   <span class="i">$Matrix</span> = <span class="i">new</span> <span class="i">Matrix</span><span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span><span class="sc">;</span>
+2411 
+2412   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2413     <span class="k">for</span> <span class="i">$ColIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfCols</span> - <span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2414       <span class="i">$Matrix</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>] = <span class="k">cos</span> <span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>][<span class="i">$ColIndex</span>]<span class="sc">;</span>
+2415     <span class="s">}</span>
+2416   <span class="s">}</span>
+2417   <span class="k">return</span> <span class="i">$Matrix</span><span class="sc">;</span>
+2418 <span class="s">}</span>
+2419 
+2420 <span class="c"># Turn matrix into array for @{$Matrix} operation...</span>
+2421 <span class="c">#</span>
+<a name="_MatrixToArrayOperator-"></a>2422 <span class="k">sub </span><span class="m">_MatrixToArrayOperator</span> <span class="s">{</span>
+2423   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2424 
+2425   <span class="k">return</span> \<span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}}<span class="sc">;</span>
+2426 <span class="s">}</span>
+2427 
+2428 <span class="c"># Always return true in boolean context...</span>
+2429 <span class="c">#</span>
+<a name="_BoolifyMatrix-"></a>2430 <span class="k">sub </span><span class="m">_BoolifyMatrix</span> <span class="s">{</span>
+2431   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2432 
+2433   <span class="k">return</span> <span class="n">1</span><span class="sc">;</span>
+2434 <span class="s">}</span>
+2435 
+2436 <span class="c"># Process parameters passed to overloaded operators...</span>
+2437 <span class="c">#</span>
+2438 <span class="c"># For uninary operators, $SecondParameter is not defined.</span>
+<a name="_ProcessOverloadedOperatorParameters-"></a>2439 <span class="k">sub </span><span class="m">_ProcessOverloadedOperatorParameters</span> <span class="s">{</span>
+2440   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="cm">,</span> <span class="i">$ParametersOrderStatus</span><span class="cm">,</span> <span class="i">$CheckMatrixSizesStatus</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2441   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="cm">,</span> <span class="i">$CheckMatrixSizes</span><span class="s">)</span><span class="sc">;</span>
+2442 
+2443   <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span> =  <span class="s">(</span><span class="i">$FirstParameter</span><span class="cm">,</span> <span class="i">$SecondParameter</span><span class="s">)</span><span class="sc">;</span>
+2444   <span class="i">$OrderFlipped</span> = <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$ParametersOrderStatus</span><span class="s">)</span> &amp;&amp; <span class="i">$ParametersOrderStatus</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2445   <span class="i">$CheckMatrixSizes</span> = <span class="s">(</span><span class="k">defined</span> <span class="i">$CheckMatrixSizesStatus</span><span class="s">)</span> ? <span class="i">$CheckMatrixSizesStatus</span> <span class="co">:</span> <span class="n">1</span><span class="sc">;</span>
+2446 
+2447   <span class="i">_ValidateMatrix</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="s">)</span><span class="sc">;</span>
+2448 
+2449   <span class="i">$OtherIsMatrix</span> = <span class="n">0</span><span class="sc">;</span>
+2450   <span class="k">if</span> <span class="s">(</span><span class="k">defined</span><span class="s">(</span><span class="i">$Other</span><span class="s">)</span> &amp;&amp; <span class="s">(</span><span class="k">ref</span> <span class="i">$Other</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2451     <span class="c"># Make sure $Other is a matrix...</span>
+2452     <span class="i">_ValidateMatrix</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
+2453     <span class="k">if</span> <span class="s">(</span><span class="i">$CheckMatrixSizes</span><span class="s">)</span> <span class="s">{</span>
+2454       <span class="i">_ValidateMatrixSizesAreEqual</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="s">)</span><span class="sc">;</span>
+2455     <span class="s">}</span>
+2456     <span class="i">$OtherIsMatrix</span> = <span class="n">1</span><span class="sc">;</span>
+2457   <span class="s">}</span>
+2458   <span class="k">return</span> <span class="s">(</span><span class="i">$This</span><span class="cm">,</span> <span class="i">$Other</span><span class="cm">,</span> <span class="i">$OrderFlipped</span><span class="cm">,</span> <span class="i">$OtherIsMatrix</span><span class="s">)</span><span class="sc">;</span>
+2459 <span class="s">}</span>
+2460 
+2461 <span class="c"># Make sure size of the two matrices contain the same number of values...</span>
+<a name="_ValidateMatrixSizesAreEqual-"></a>2462 <span class="k">sub </span><span class="m">_ValidateMatrixSizesAreEqual</span> <span class="s">{</span>
+2463   <span class="k">my</span><span class="s">(</span><span class="i">$ErrorMsg</span><span class="cm">,</span> <span class="i">$Matrix1</span><span class="cm">,</span> <span class="i">$Matrix2</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2464   <span class="k">my</span><span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="cm">,</span> <span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span><span class="sc">;</span>
+2465 
+2466   <span class="s">(</span><span class="i">$NumOfRows1</span><span class="cm">,</span> <span class="i">$NumOfCols1</span><span class="s">)</span> = <span class="i">$Matrix1</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2467   <span class="s">(</span><span class="i">$NumOfRows2</span><span class="cm">,</span> <span class="i">$NumOfCols2</span><span class="s">)</span> = <span class="i">$Matrix2</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2468 
+2469   <span class="k">if</span> <span class="s">(</span>!<span class="s">(</span><span class="i">$NumOfRows1</span> == <span class="i">$NumOfRows2</span> &amp;&amp; <span class="i">$NumOfCols1</span> == <span class="i">$NumOfCols2</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2470     <span class="w">croak</span> <span class="q">&quot;Error: ${ClassName}-&gt;${ErrorMsg}: Size of the matrices must be same...&quot;</span><span class="sc">;</span>
+2471   <span class="s">}</span>
+2472 <span class="s">}</span>
+2473 
+2474 <span class="c"># Return a string containing matrix values...</span>
+2475 <span class="c">#</span>
+<a name="StringifyMatrix-"></a>2476 <span class="k">sub </span><span class="m">StringifyMatrix</span> <span class="s">{</span>
+2477   <span class="k">my</span><span class="s">(</span><span class="i">$This</span><span class="s">)</span> = <span class="i">@_</span><span class="sc">;</span>
+2478   <span class="k">my</span><span class="s">(</span><span class="i">$MatrixString</span><span class="cm">,</span> <span class="i">$MatrixPrintStyleValue</span><span class="cm">,</span> <span class="i">$PrintFormat</span><span class="cm">,</span> <span class="i">$AllRowsInOneLine</span><span class="cm">,</span> <span class="i">$FormatString</span><span class="cm">,</span> <span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="cm">,</span> <span class="i">$RowIndex</span><span class="cm">,</span> <span class="i">$RowNum</span><span class="cm">,</span> <span class="i">$RowString</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="s">)</span><span class="sc">;</span>
+2479 
+2480   <span class="s">(</span><span class="i">$NumOfRows</span><span class="cm">,</span> <span class="i">$NumOfCols</span><span class="s">)</span> = <span class="i">$This</span><span class="i">-&gt;GetSize</span><span class="s">(</span><span class="s">)</span><span class="sc">;</span>
+2481 
+2482   <span class="i">$MatrixPrintStyleValue</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">MatrixPrintStyle</span>} <span class="co">:</span> <span class="i">$MatrixPrintStyle</span><span class="sc">;</span>
+2483   <span class="i">$AllRowsInOneLine</span> = <span class="s">(</span><span class="i">$MatrixPrintStyleValue</span> =~ <span class="q">/^AllRowsInOneLine$/i</span><span class="s">)</span> ? <span class="n">1</span> <span class="co">:</span> <span class="n">0</span><span class="sc">;</span>
+2484 
+2485   <span class="i">$PrintFormat</span> = <span class="s">(</span><span class="k">exists</span> <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>}<span class="s">)</span> ? <span class="i">$This</span>-&gt;{<span class="w">ValueFormat</span>} <span class="co">:</span> <span class="i">$ValueFormat</span><span class="sc">;</span>
+2486 
+2487   <span class="i">@ValuesFormat</span> = <span class="s">(</span><span class="i">$PrintFormat</span><span class="s">)</span> x <span class="i">$NumOfCols</span><span class="sc">;</span>
+2488   <span class="i">$FormatString</span> = <span class="k">join</span> <span class="q">&#39; &#39;</span><span class="cm">,</span> <span class="i">@ValuesFormat</span><span class="sc">;</span>
+2489 
+2490   <span class="i">$MatrixString</span> = <span class="k">sprintf</span> <span class="q">&quot;&lt;Size: $NumOfRows x $NumOfCols;&quot;</span><span class="sc">;</span>
+2491   <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span>
+2492     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">&quot; Values:&quot;</span><span class="sc">;</span>
+2493   <span class="s">}</span>
+2494   <span class="k">else</span> <span class="s">{</span>
+2495     <span class="i">$MatrixString</span> .= <span class="k">sprintf</span> <span class="q">&quot; Values:\n&quot;</span><span class="sc">;</span>
+2496   <span class="s">}</span>
+2497 
+2498   <span class="i">$RowNum</span> = <span class="n">0</span><span class="sc">;</span>
+2499   <span class="k">for</span> <span class="i">$RowIndex</span> <span class="s">(</span><span class="n">0</span> .. <span class="s">(</span><span class="i">$NumOfRows</span> -<span class="n">1</span><span class="s">)</span><span class="s">)</span> <span class="s">{</span>
+2500     <span class="i">$RowNum</span>++<span class="sc">;</span>
+2501     <span class="i">$RowString</span> = <span class="k">sprintf</span> <span class="q">&quot;Row${RowNum}:[$FormatString]&quot;</span><span class="cm">,</span> <span class="i">@</span>{<span class="i">$This</span>-&gt;{<span class="w">Values</span>}[<span class="i">$RowIndex</span>]}<span class="sc">;</span>
+2502     <span class="k">if</span> <span class="s">(</span><span class="i">$AllRowsInOneLine</span><span class="s">)</span> <span class="s">{</span>
+2503       <span class="i">$MatrixString</span> .= <span class="q">&quot; $RowString&quot;</span><span class="sc">;</span>
+2504     <span class="s">}</span>
+2505     <span class="k">else</span> <span class="s">{</span>
+2506       <span class="i">$MatrixString</span> .= <span class="q">&quot;$RowString\n&quot;</span><span class="sc">;</span>
+2507     <span class="s">}</span>
+2508   <span class="s">}</span>
+2509   <span class="i">$MatrixString</span> .= <span class="q">&quot;&gt;&quot;</span><span class="sc">;</span>
+2510   <span class="k">return</span> <span class="i">$MatrixString</span><span class="sc">;</span>
+2511 <span class="s">}</span>
+2512 
+<a name="EOF-"></a></pre>
+<p>&nbsp;</p>
+<br />
+<center>
+<img src="../../../images/h2o2.png">
+</center>
+</body>
+</html>