comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/BigMatrixImpl.html @ 13:cbf34dd4d7e6

commons-math-2.1 added
author dwinter
date Tue, 04 Jan 2011 10:02:07 +0100
parents
children
comparison
equal deleted inserted replaced
12:970d26a94fb7 13:cbf34dd4d7e6
1 <HTML>
2 <BODY BGCOLOR="white">
3 <PRE>
4 <FONT color="green">001</FONT> /*<a name="line.1"></a>
5 <FONT color="green">002</FONT> * Licensed to the Apache Software Foundation (ASF) under one or more<a name="line.2"></a>
6 <FONT color="green">003</FONT> * contributor license agreements. See the NOTICE file distributed with<a name="line.3"></a>
7 <FONT color="green">004</FONT> * this work for additional information regarding copyright ownership.<a name="line.4"></a>
8 <FONT color="green">005</FONT> * The ASF licenses this file to You under the Apache License, Version 2.0<a name="line.5"></a>
9 <FONT color="green">006</FONT> * (the "License"); you may not use this file except in compliance with<a name="line.6"></a>
10 <FONT color="green">007</FONT> * the License. You may obtain a copy of the License at<a name="line.7"></a>
11 <FONT color="green">008</FONT> *<a name="line.8"></a>
12 <FONT color="green">009</FONT> * http://www.apache.org/licenses/LICENSE-2.0<a name="line.9"></a>
13 <FONT color="green">010</FONT> *<a name="line.10"></a>
14 <FONT color="green">011</FONT> * Unless required by applicable law or agreed to in writing, software<a name="line.11"></a>
15 <FONT color="green">012</FONT> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.12"></a>
16 <FONT color="green">013</FONT> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.13"></a>
17 <FONT color="green">014</FONT> * See the License for the specific language governing permissions and<a name="line.14"></a>
18 <FONT color="green">015</FONT> * limitations under the License.<a name="line.15"></a>
19 <FONT color="green">016</FONT> */<a name="line.16"></a>
20 <FONT color="green">017</FONT> <a name="line.17"></a>
21 <FONT color="green">018</FONT> package org.apache.commons.math.linear;<a name="line.18"></a>
22 <FONT color="green">019</FONT> import java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.math.BigDecimal;<a name="line.20"></a>
24 <FONT color="green">021</FONT> <a name="line.21"></a>
25 <FONT color="green">022</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.22"></a>
26 <FONT color="green">023</FONT> <a name="line.23"></a>
27 <FONT color="green">024</FONT> /**<a name="line.24"></a>
28 <FONT color="green">025</FONT> * Implementation of {@link BigMatrix} using a BigDecimal[][] array to store entries<a name="line.25"></a>
29 <FONT color="green">026</FONT> * and &lt;a href="http://www.math.gatech.edu/~bourbaki/math2601/Web-notes/2num.pdf"&gt;<a name="line.26"></a>
30 <FONT color="green">027</FONT> * LU decompostion&lt;/a&gt; to support linear system<a name="line.27"></a>
31 <FONT color="green">028</FONT> * solution and inverse.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * The LU decompostion is performed as needed, to support the following operations: &lt;ul&gt;<a name="line.30"></a>
34 <FONT color="green">031</FONT> * &lt;li&gt;solve&lt;/li&gt;<a name="line.31"></a>
35 <FONT color="green">032</FONT> * &lt;li&gt;isSingular&lt;/li&gt;<a name="line.32"></a>
36 <FONT color="green">033</FONT> * &lt;li&gt;getDeterminant&lt;/li&gt;<a name="line.33"></a>
37 <FONT color="green">034</FONT> * &lt;li&gt;inverse&lt;/li&gt; &lt;/ul&gt;&lt;/p&gt;<a name="line.34"></a>
38 <FONT color="green">035</FONT> * &lt;p&gt;<a name="line.35"></a>
39 <FONT color="green">036</FONT> * &lt;strong&gt;Usage notes&lt;/strong&gt;:&lt;br&gt;<a name="line.36"></a>
40 <FONT color="green">037</FONT> * &lt;ul&gt;&lt;li&gt;<a name="line.37"></a>
41 <FONT color="green">038</FONT> * The LU decomposition is stored and reused on subsequent calls. If matrix<a name="line.38"></a>
42 <FONT color="green">039</FONT> * data are modified using any of the public setXxx methods, the saved<a name="line.39"></a>
43 <FONT color="green">040</FONT> * decomposition is discarded. If data are modified via references to the<a name="line.40"></a>
44 <FONT color="green">041</FONT> * underlying array obtained using &lt;code&gt;getDataRef()&lt;/code&gt;, then the stored<a name="line.41"></a>
45 <FONT color="green">042</FONT> * LU decomposition will not be discarded. In this case, you need to<a name="line.42"></a>
46 <FONT color="green">043</FONT> * explicitly invoke &lt;code&gt;LUDecompose()&lt;/code&gt; to recompute the decomposition<a name="line.43"></a>
47 <FONT color="green">044</FONT> * before using any of the methods above.&lt;/li&gt;<a name="line.44"></a>
48 <FONT color="green">045</FONT> * &lt;li&gt;<a name="line.45"></a>
49 <FONT color="green">046</FONT> * As specified in the {@link BigMatrix} interface, matrix element indexing<a name="line.46"></a>
50 <FONT color="green">047</FONT> * is 0-based -- e.g., &lt;code&gt;getEntry(0, 0)&lt;/code&gt;<a name="line.47"></a>
51 <FONT color="green">048</FONT> * returns the element in the first row, first column of the matrix.&lt;/li&gt;&lt;/ul&gt;&lt;/p&gt;<a name="line.48"></a>
52 <FONT color="green">049</FONT> *<a name="line.49"></a>
53 <FONT color="green">050</FONT> * @deprecated as of 2.0, replaced by {@link Array2DRowFieldMatrix} with a {@link<a name="line.50"></a>
54 <FONT color="green">051</FONT> * org.apache.commons.math.util.BigReal} parameter<a name="line.51"></a>
55 <FONT color="green">052</FONT> * @version $Revision: 811833 $ $Date: 2009-09-06 12:27:50 -0400 (Sun, 06 Sep 2009) $<a name="line.52"></a>
56 <FONT color="green">053</FONT> */<a name="line.53"></a>
57 <FONT color="green">054</FONT> @Deprecated<a name="line.54"></a>
58 <FONT color="green">055</FONT> public class BigMatrixImpl implements BigMatrix, Serializable {<a name="line.55"></a>
59 <FONT color="green">056</FONT> <a name="line.56"></a>
60 <FONT color="green">057</FONT> /** BigDecimal 0 */<a name="line.57"></a>
61 <FONT color="green">058</FONT> static final BigDecimal ZERO = new BigDecimal(0);<a name="line.58"></a>
62 <FONT color="green">059</FONT> <a name="line.59"></a>
63 <FONT color="green">060</FONT> /** BigDecimal 1 */<a name="line.60"></a>
64 <FONT color="green">061</FONT> static final BigDecimal ONE = new BigDecimal(1);<a name="line.61"></a>
65 <FONT color="green">062</FONT> <a name="line.62"></a>
66 <FONT color="green">063</FONT> /** Bound to determine effective singularity in LU decomposition */<a name="line.63"></a>
67 <FONT color="green">064</FONT> private static final BigDecimal TOO_SMALL = new BigDecimal(10E-12);<a name="line.64"></a>
68 <FONT color="green">065</FONT> <a name="line.65"></a>
69 <FONT color="green">066</FONT> /** Serialization id */<a name="line.66"></a>
70 <FONT color="green">067</FONT> private static final long serialVersionUID = -1011428905656140431L;<a name="line.67"></a>
71 <FONT color="green">068</FONT> <a name="line.68"></a>
72 <FONT color="green">069</FONT> /** Entries of the matrix */<a name="line.69"></a>
73 <FONT color="green">070</FONT> protected BigDecimal data[][] = null;<a name="line.70"></a>
74 <FONT color="green">071</FONT> <a name="line.71"></a>
75 <FONT color="green">072</FONT> /** Entries of cached LU decomposition.<a name="line.72"></a>
76 <FONT color="green">073</FONT> * All updates to data (other than luDecompose()) *must* set this to null<a name="line.73"></a>
77 <FONT color="green">074</FONT> */<a name="line.74"></a>
78 <FONT color="green">075</FONT> protected BigDecimal lu[][] = null;<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> /** Permutation associated with LU decomposition */<a name="line.77"></a>
81 <FONT color="green">078</FONT> protected int[] permutation = null;<a name="line.78"></a>
82 <FONT color="green">079</FONT> <a name="line.79"></a>
83 <FONT color="green">080</FONT> /** Parity of the permutation associated with the LU decomposition */<a name="line.80"></a>
84 <FONT color="green">081</FONT> protected int parity = 1;<a name="line.81"></a>
85 <FONT color="green">082</FONT> <a name="line.82"></a>
86 <FONT color="green">083</FONT> /** Rounding mode for divisions **/<a name="line.83"></a>
87 <FONT color="green">084</FONT> private int roundingMode = BigDecimal.ROUND_HALF_UP;<a name="line.84"></a>
88 <FONT color="green">085</FONT> <a name="line.85"></a>
89 <FONT color="green">086</FONT> /*** BigDecimal scale ***/<a name="line.86"></a>
90 <FONT color="green">087</FONT> private int scale = 64;<a name="line.87"></a>
91 <FONT color="green">088</FONT> <a name="line.88"></a>
92 <FONT color="green">089</FONT> /**<a name="line.89"></a>
93 <FONT color="green">090</FONT> * Creates a matrix with no data<a name="line.90"></a>
94 <FONT color="green">091</FONT> */<a name="line.91"></a>
95 <FONT color="green">092</FONT> public BigMatrixImpl() {<a name="line.92"></a>
96 <FONT color="green">093</FONT> }<a name="line.93"></a>
97 <FONT color="green">094</FONT> <a name="line.94"></a>
98 <FONT color="green">095</FONT> /**<a name="line.95"></a>
99 <FONT color="green">096</FONT> * Create a new BigMatrix with the supplied row and column dimensions.<a name="line.96"></a>
100 <FONT color="green">097</FONT> *<a name="line.97"></a>
101 <FONT color="green">098</FONT> * @param rowDimension the number of rows in the new matrix<a name="line.98"></a>
102 <FONT color="green">099</FONT> * @param columnDimension the number of columns in the new matrix<a name="line.99"></a>
103 <FONT color="green">100</FONT> * @throws IllegalArgumentException if row or column dimension is not<a name="line.100"></a>
104 <FONT color="green">101</FONT> * positive<a name="line.101"></a>
105 <FONT color="green">102</FONT> */<a name="line.102"></a>
106 <FONT color="green">103</FONT> public BigMatrixImpl(int rowDimension, int columnDimension) {<a name="line.103"></a>
107 <FONT color="green">104</FONT> if (rowDimension &lt;= 0 ) {<a name="line.104"></a>
108 <FONT color="green">105</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.105"></a>
109 <FONT color="green">106</FONT> "invalid row dimension {0} (must be positive)",<a name="line.106"></a>
110 <FONT color="green">107</FONT> rowDimension);<a name="line.107"></a>
111 <FONT color="green">108</FONT> }<a name="line.108"></a>
112 <FONT color="green">109</FONT> if (columnDimension &lt;= 0) {<a name="line.109"></a>
113 <FONT color="green">110</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.110"></a>
114 <FONT color="green">111</FONT> "invalid column dimension {0} (must be positive)",<a name="line.111"></a>
115 <FONT color="green">112</FONT> columnDimension);<a name="line.112"></a>
116 <FONT color="green">113</FONT> }<a name="line.113"></a>
117 <FONT color="green">114</FONT> data = new BigDecimal[rowDimension][columnDimension];<a name="line.114"></a>
118 <FONT color="green">115</FONT> lu = null;<a name="line.115"></a>
119 <FONT color="green">116</FONT> }<a name="line.116"></a>
120 <FONT color="green">117</FONT> <a name="line.117"></a>
121 <FONT color="green">118</FONT> /**<a name="line.118"></a>
122 <FONT color="green">119</FONT> * Create a new BigMatrix using &lt;code&gt;d&lt;/code&gt; as the underlying<a name="line.119"></a>
123 <FONT color="green">120</FONT> * data array.<a name="line.120"></a>
124 <FONT color="green">121</FONT> * &lt;p&gt;The input array is copied, not referenced. This constructor has<a name="line.121"></a>
125 <FONT color="green">122</FONT> * the same effect as calling {@link #BigMatrixImpl(BigDecimal[][], boolean)}<a name="line.122"></a>
126 <FONT color="green">123</FONT> * with the second argument set to &lt;code&gt;true&lt;/code&gt;.&lt;/p&gt;<a name="line.123"></a>
127 <FONT color="green">124</FONT> *<a name="line.124"></a>
128 <FONT color="green">125</FONT> * @param d data for new matrix<a name="line.125"></a>
129 <FONT color="green">126</FONT> * @throws IllegalArgumentException if &lt;code&gt;d&lt;/code&gt; is not rectangular<a name="line.126"></a>
130 <FONT color="green">127</FONT> * (not all rows have the same length) or empty<a name="line.127"></a>
131 <FONT color="green">128</FONT> * @throws NullPointerException if &lt;code&gt;d&lt;/code&gt; is null<a name="line.128"></a>
132 <FONT color="green">129</FONT> */<a name="line.129"></a>
133 <FONT color="green">130</FONT> public BigMatrixImpl(BigDecimal[][] d) {<a name="line.130"></a>
134 <FONT color="green">131</FONT> this.copyIn(d);<a name="line.131"></a>
135 <FONT color="green">132</FONT> lu = null;<a name="line.132"></a>
136 <FONT color="green">133</FONT> }<a name="line.133"></a>
137 <FONT color="green">134</FONT> <a name="line.134"></a>
138 <FONT color="green">135</FONT> /**<a name="line.135"></a>
139 <FONT color="green">136</FONT> * Create a new BigMatrix using the input array as the underlying<a name="line.136"></a>
140 <FONT color="green">137</FONT> * data array.<a name="line.137"></a>
141 <FONT color="green">138</FONT> * &lt;p&gt;If an array is built specially in order to be embedded in a<a name="line.138"></a>
142 <FONT color="green">139</FONT> * BigMatrix and not used directly, the &lt;code&gt;copyArray&lt;/code&gt; may be<a name="line.139"></a>
143 <FONT color="green">140</FONT> * set to &lt;code&gt;false&lt;/code. This will prevent the copying and improve<a name="line.140"></a>
144 <FONT color="green">141</FONT> * performance as no new array will be built and no data will be copied.&lt;/p&gt;<a name="line.141"></a>
145 <FONT color="green">142</FONT> * @param d data for new matrix<a name="line.142"></a>
146 <FONT color="green">143</FONT> * @param copyArray if true, the input array will be copied, otherwise<a name="line.143"></a>
147 <FONT color="green">144</FONT> * it will be referenced<a name="line.144"></a>
148 <FONT color="green">145</FONT> * @throws IllegalArgumentException if &lt;code&gt;d&lt;/code&gt; is not rectangular<a name="line.145"></a>
149 <FONT color="green">146</FONT> * (not all rows have the same length) or empty<a name="line.146"></a>
150 <FONT color="green">147</FONT> * @throws NullPointerException if &lt;code&gt;d&lt;/code&gt; is null<a name="line.147"></a>
151 <FONT color="green">148</FONT> * @see #BigMatrixImpl(BigDecimal[][])<a name="line.148"></a>
152 <FONT color="green">149</FONT> */<a name="line.149"></a>
153 <FONT color="green">150</FONT> public BigMatrixImpl(BigDecimal[][] d, boolean copyArray) {<a name="line.150"></a>
154 <FONT color="green">151</FONT> if (copyArray) {<a name="line.151"></a>
155 <FONT color="green">152</FONT> copyIn(d);<a name="line.152"></a>
156 <FONT color="green">153</FONT> } else {<a name="line.153"></a>
157 <FONT color="green">154</FONT> if (d == null) {<a name="line.154"></a>
158 <FONT color="green">155</FONT> throw new NullPointerException();<a name="line.155"></a>
159 <FONT color="green">156</FONT> }<a name="line.156"></a>
160 <FONT color="green">157</FONT> final int nRows = d.length;<a name="line.157"></a>
161 <FONT color="green">158</FONT> if (nRows == 0) {<a name="line.158"></a>
162 <FONT color="green">159</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one row");<a name="line.159"></a>
163 <FONT color="green">160</FONT> }<a name="line.160"></a>
164 <FONT color="green">161</FONT> <a name="line.161"></a>
165 <FONT color="green">162</FONT> final int nCols = d[0].length;<a name="line.162"></a>
166 <FONT color="green">163</FONT> if (nCols == 0) {<a name="line.163"></a>
167 <FONT color="green">164</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one column");<a name="line.164"></a>
168 <FONT color="green">165</FONT> }<a name="line.165"></a>
169 <FONT color="green">166</FONT> for (int r = 1; r &lt; nRows; r++) {<a name="line.166"></a>
170 <FONT color="green">167</FONT> if (d[r].length != nCols) {<a name="line.167"></a>
171 <FONT color="green">168</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.168"></a>
172 <FONT color="green">169</FONT> "some rows have length {0} while others have length {1}",<a name="line.169"></a>
173 <FONT color="green">170</FONT> nCols, d[r].length);<a name="line.170"></a>
174 <FONT color="green">171</FONT> }<a name="line.171"></a>
175 <FONT color="green">172</FONT> }<a name="line.172"></a>
176 <FONT color="green">173</FONT> data = d;<a name="line.173"></a>
177 <FONT color="green">174</FONT> }<a name="line.174"></a>
178 <FONT color="green">175</FONT> lu = null;<a name="line.175"></a>
179 <FONT color="green">176</FONT> }<a name="line.176"></a>
180 <FONT color="green">177</FONT> <a name="line.177"></a>
181 <FONT color="green">178</FONT> /**<a name="line.178"></a>
182 <FONT color="green">179</FONT> * Create a new BigMatrix using &lt;code&gt;d&lt;/code&gt; as the underlying<a name="line.179"></a>
183 <FONT color="green">180</FONT> * data array.<a name="line.180"></a>
184 <FONT color="green">181</FONT> * &lt;p&gt;Since the underlying array will hold &lt;code&gt;BigDecimal&lt;/code&gt;<a name="line.181"></a>
185 <FONT color="green">182</FONT> * instances, it will be created.&lt;/p&gt;<a name="line.182"></a>
186 <FONT color="green">183</FONT> *<a name="line.183"></a>
187 <FONT color="green">184</FONT> * @param d data for new matrix<a name="line.184"></a>
188 <FONT color="green">185</FONT> * @throws IllegalArgumentException if &lt;code&gt;d&lt;/code&gt; is not rectangular<a name="line.185"></a>
189 <FONT color="green">186</FONT> * (not all rows have the same length) or empty<a name="line.186"></a>
190 <FONT color="green">187</FONT> * @throws NullPointerException if &lt;code&gt;d&lt;/code&gt; is null<a name="line.187"></a>
191 <FONT color="green">188</FONT> */<a name="line.188"></a>
192 <FONT color="green">189</FONT> public BigMatrixImpl(double[][] d) {<a name="line.189"></a>
193 <FONT color="green">190</FONT> final int nRows = d.length;<a name="line.190"></a>
194 <FONT color="green">191</FONT> if (nRows == 0) {<a name="line.191"></a>
195 <FONT color="green">192</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one row");<a name="line.192"></a>
196 <FONT color="green">193</FONT> }<a name="line.193"></a>
197 <FONT color="green">194</FONT> <a name="line.194"></a>
198 <FONT color="green">195</FONT> final int nCols = d[0].length;<a name="line.195"></a>
199 <FONT color="green">196</FONT> if (nCols == 0) {<a name="line.196"></a>
200 <FONT color="green">197</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one column");<a name="line.197"></a>
201 <FONT color="green">198</FONT> }<a name="line.198"></a>
202 <FONT color="green">199</FONT> for (int row = 1; row &lt; nRows; row++) {<a name="line.199"></a>
203 <FONT color="green">200</FONT> if (d[row].length != nCols) {<a name="line.200"></a>
204 <FONT color="green">201</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.201"></a>
205 <FONT color="green">202</FONT> "some rows have length {0} while others have length {1}",<a name="line.202"></a>
206 <FONT color="green">203</FONT> nCols, d[row].length);<a name="line.203"></a>
207 <FONT color="green">204</FONT> }<a name="line.204"></a>
208 <FONT color="green">205</FONT> }<a name="line.205"></a>
209 <FONT color="green">206</FONT> this.copyIn(d);<a name="line.206"></a>
210 <FONT color="green">207</FONT> lu = null;<a name="line.207"></a>
211 <FONT color="green">208</FONT> }<a name="line.208"></a>
212 <FONT color="green">209</FONT> <a name="line.209"></a>
213 <FONT color="green">210</FONT> /**<a name="line.210"></a>
214 <FONT color="green">211</FONT> * Create a new BigMatrix using the values represented by the strings in<a name="line.211"></a>
215 <FONT color="green">212</FONT> * &lt;code&gt;d&lt;/code&gt; as the underlying data array.<a name="line.212"></a>
216 <FONT color="green">213</FONT> *<a name="line.213"></a>
217 <FONT color="green">214</FONT> * @param d data for new matrix<a name="line.214"></a>
218 <FONT color="green">215</FONT> * @throws IllegalArgumentException if &lt;code&gt;d&lt;/code&gt; is not rectangular<a name="line.215"></a>
219 <FONT color="green">216</FONT> * (not all rows have the same length) or empty<a name="line.216"></a>
220 <FONT color="green">217</FONT> * @throws NullPointerException if &lt;code&gt;d&lt;/code&gt; is null<a name="line.217"></a>
221 <FONT color="green">218</FONT> */<a name="line.218"></a>
222 <FONT color="green">219</FONT> public BigMatrixImpl(String[][] d) {<a name="line.219"></a>
223 <FONT color="green">220</FONT> final int nRows = d.length;<a name="line.220"></a>
224 <FONT color="green">221</FONT> if (nRows == 0) {<a name="line.221"></a>
225 <FONT color="green">222</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one row");<a name="line.222"></a>
226 <FONT color="green">223</FONT> }<a name="line.223"></a>
227 <FONT color="green">224</FONT> <a name="line.224"></a>
228 <FONT color="green">225</FONT> final int nCols = d[0].length;<a name="line.225"></a>
229 <FONT color="green">226</FONT> if (nCols == 0) {<a name="line.226"></a>
230 <FONT color="green">227</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one column");<a name="line.227"></a>
231 <FONT color="green">228</FONT> }<a name="line.228"></a>
232 <FONT color="green">229</FONT> for (int row = 1; row &lt; nRows; row++) {<a name="line.229"></a>
233 <FONT color="green">230</FONT> if (d[row].length != nCols) {<a name="line.230"></a>
234 <FONT color="green">231</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.231"></a>
235 <FONT color="green">232</FONT> "some rows have length {0} while others have length {1}",<a name="line.232"></a>
236 <FONT color="green">233</FONT> nCols, d[row].length);<a name="line.233"></a>
237 <FONT color="green">234</FONT> }<a name="line.234"></a>
238 <FONT color="green">235</FONT> }<a name="line.235"></a>
239 <FONT color="green">236</FONT> this.copyIn(d);<a name="line.236"></a>
240 <FONT color="green">237</FONT> lu = null;<a name="line.237"></a>
241 <FONT color="green">238</FONT> }<a name="line.238"></a>
242 <FONT color="green">239</FONT> <a name="line.239"></a>
243 <FONT color="green">240</FONT> /**<a name="line.240"></a>
244 <FONT color="green">241</FONT> * Create a new (column) BigMatrix using &lt;code&gt;v&lt;/code&gt; as the<a name="line.241"></a>
245 <FONT color="green">242</FONT> * data for the unique column of the &lt;code&gt;v.length x 1&lt;/code&gt; matrix<a name="line.242"></a>
246 <FONT color="green">243</FONT> * created.<a name="line.243"></a>
247 <FONT color="green">244</FONT> * &lt;p&gt;<a name="line.244"></a>
248 <FONT color="green">245</FONT> * The input array is copied, not referenced.&lt;/p&gt;<a name="line.245"></a>
249 <FONT color="green">246</FONT> *<a name="line.246"></a>
250 <FONT color="green">247</FONT> * @param v column vector holding data for new matrix<a name="line.247"></a>
251 <FONT color="green">248</FONT> */<a name="line.248"></a>
252 <FONT color="green">249</FONT> public BigMatrixImpl(BigDecimal[] v) {<a name="line.249"></a>
253 <FONT color="green">250</FONT> final int nRows = v.length;<a name="line.250"></a>
254 <FONT color="green">251</FONT> data = new BigDecimal[nRows][1];<a name="line.251"></a>
255 <FONT color="green">252</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.252"></a>
256 <FONT color="green">253</FONT> data[row][0] = v[row];<a name="line.253"></a>
257 <FONT color="green">254</FONT> }<a name="line.254"></a>
258 <FONT color="green">255</FONT> }<a name="line.255"></a>
259 <FONT color="green">256</FONT> <a name="line.256"></a>
260 <FONT color="green">257</FONT> /**<a name="line.257"></a>
261 <FONT color="green">258</FONT> * Create a new BigMatrix which is a copy of this.<a name="line.258"></a>
262 <FONT color="green">259</FONT> *<a name="line.259"></a>
263 <FONT color="green">260</FONT> * @return the cloned matrix<a name="line.260"></a>
264 <FONT color="green">261</FONT> */<a name="line.261"></a>
265 <FONT color="green">262</FONT> public BigMatrix copy() {<a name="line.262"></a>
266 <FONT color="green">263</FONT> return new BigMatrixImpl(this.copyOut(), false);<a name="line.263"></a>
267 <FONT color="green">264</FONT> }<a name="line.264"></a>
268 <FONT color="green">265</FONT> <a name="line.265"></a>
269 <FONT color="green">266</FONT> /**<a name="line.266"></a>
270 <FONT color="green">267</FONT> * Compute the sum of this and &lt;code&gt;m&lt;/code&gt;.<a name="line.267"></a>
271 <FONT color="green">268</FONT> *<a name="line.268"></a>
272 <FONT color="green">269</FONT> * @param m matrix to be added<a name="line.269"></a>
273 <FONT color="green">270</FONT> * @return this + m<a name="line.270"></a>
274 <FONT color="green">271</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.271"></a>
275 <FONT color="green">272</FONT> */<a name="line.272"></a>
276 <FONT color="green">273</FONT> public BigMatrix add(BigMatrix m) throws IllegalArgumentException {<a name="line.273"></a>
277 <FONT color="green">274</FONT> try {<a name="line.274"></a>
278 <FONT color="green">275</FONT> return add((BigMatrixImpl) m);<a name="line.275"></a>
279 <FONT color="green">276</FONT> } catch (ClassCastException cce) {<a name="line.276"></a>
280 <FONT color="green">277</FONT> <a name="line.277"></a>
281 <FONT color="green">278</FONT> // safety check<a name="line.278"></a>
282 <FONT color="green">279</FONT> MatrixUtils.checkAdditionCompatible(this, m);<a name="line.279"></a>
283 <FONT color="green">280</FONT> <a name="line.280"></a>
284 <FONT color="green">281</FONT> final int rowCount = getRowDimension();<a name="line.281"></a>
285 <FONT color="green">282</FONT> final int columnCount = getColumnDimension();<a name="line.282"></a>
286 <FONT color="green">283</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.283"></a>
287 <FONT color="green">284</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.284"></a>
288 <FONT color="green">285</FONT> final BigDecimal[] dataRow = data[row];<a name="line.285"></a>
289 <FONT color="green">286</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.286"></a>
290 <FONT color="green">287</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.287"></a>
291 <FONT color="green">288</FONT> outDataRow[col] = dataRow[col].add(m.getEntry(row, col));<a name="line.288"></a>
292 <FONT color="green">289</FONT> }<a name="line.289"></a>
293 <FONT color="green">290</FONT> }<a name="line.290"></a>
294 <FONT color="green">291</FONT> return new BigMatrixImpl(outData, false);<a name="line.291"></a>
295 <FONT color="green">292</FONT> }<a name="line.292"></a>
296 <FONT color="green">293</FONT> }<a name="line.293"></a>
297 <FONT color="green">294</FONT> <a name="line.294"></a>
298 <FONT color="green">295</FONT> /**<a name="line.295"></a>
299 <FONT color="green">296</FONT> * Compute the sum of this and &lt;code&gt;m&lt;/code&gt;.<a name="line.296"></a>
300 <FONT color="green">297</FONT> *<a name="line.297"></a>
301 <FONT color="green">298</FONT> * @param m matrix to be added<a name="line.298"></a>
302 <FONT color="green">299</FONT> * @return this + m<a name="line.299"></a>
303 <FONT color="green">300</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.300"></a>
304 <FONT color="green">301</FONT> */<a name="line.301"></a>
305 <FONT color="green">302</FONT> public BigMatrixImpl add(BigMatrixImpl m) throws IllegalArgumentException {<a name="line.302"></a>
306 <FONT color="green">303</FONT> <a name="line.303"></a>
307 <FONT color="green">304</FONT> // safety check<a name="line.304"></a>
308 <FONT color="green">305</FONT> MatrixUtils.checkAdditionCompatible(this, m);<a name="line.305"></a>
309 <FONT color="green">306</FONT> <a name="line.306"></a>
310 <FONT color="green">307</FONT> final int rowCount = getRowDimension();<a name="line.307"></a>
311 <FONT color="green">308</FONT> final int columnCount = getColumnDimension();<a name="line.308"></a>
312 <FONT color="green">309</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.309"></a>
313 <FONT color="green">310</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.310"></a>
314 <FONT color="green">311</FONT> final BigDecimal[] dataRow = data[row];<a name="line.311"></a>
315 <FONT color="green">312</FONT> final BigDecimal[] mRow = m.data[row];<a name="line.312"></a>
316 <FONT color="green">313</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.313"></a>
317 <FONT color="green">314</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.314"></a>
318 <FONT color="green">315</FONT> outDataRow[col] = dataRow[col].add(mRow[col]);<a name="line.315"></a>
319 <FONT color="green">316</FONT> }<a name="line.316"></a>
320 <FONT color="green">317</FONT> }<a name="line.317"></a>
321 <FONT color="green">318</FONT> return new BigMatrixImpl(outData, false);<a name="line.318"></a>
322 <FONT color="green">319</FONT> }<a name="line.319"></a>
323 <FONT color="green">320</FONT> <a name="line.320"></a>
324 <FONT color="green">321</FONT> /**<a name="line.321"></a>
325 <FONT color="green">322</FONT> * Compute this minus &lt;code&gt;m&lt;/code&gt;.<a name="line.322"></a>
326 <FONT color="green">323</FONT> *<a name="line.323"></a>
327 <FONT color="green">324</FONT> * @param m matrix to be subtracted<a name="line.324"></a>
328 <FONT color="green">325</FONT> * @return this + m<a name="line.325"></a>
329 <FONT color="green">326</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.326"></a>
330 <FONT color="green">327</FONT> */<a name="line.327"></a>
331 <FONT color="green">328</FONT> public BigMatrix subtract(BigMatrix m) throws IllegalArgumentException {<a name="line.328"></a>
332 <FONT color="green">329</FONT> try {<a name="line.329"></a>
333 <FONT color="green">330</FONT> return subtract((BigMatrixImpl) m);<a name="line.330"></a>
334 <FONT color="green">331</FONT> } catch (ClassCastException cce) {<a name="line.331"></a>
335 <FONT color="green">332</FONT> <a name="line.332"></a>
336 <FONT color="green">333</FONT> // safety check<a name="line.333"></a>
337 <FONT color="green">334</FONT> MatrixUtils.checkSubtractionCompatible(this, m);<a name="line.334"></a>
338 <FONT color="green">335</FONT> <a name="line.335"></a>
339 <FONT color="green">336</FONT> final int rowCount = getRowDimension();<a name="line.336"></a>
340 <FONT color="green">337</FONT> final int columnCount = getColumnDimension();<a name="line.337"></a>
341 <FONT color="green">338</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.338"></a>
342 <FONT color="green">339</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.339"></a>
343 <FONT color="green">340</FONT> final BigDecimal[] dataRow = data[row];<a name="line.340"></a>
344 <FONT color="green">341</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.341"></a>
345 <FONT color="green">342</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.342"></a>
346 <FONT color="green">343</FONT> outDataRow[col] = dataRow[col].subtract(getEntry(row, col));<a name="line.343"></a>
347 <FONT color="green">344</FONT> }<a name="line.344"></a>
348 <FONT color="green">345</FONT> }<a name="line.345"></a>
349 <FONT color="green">346</FONT> return new BigMatrixImpl(outData, false);<a name="line.346"></a>
350 <FONT color="green">347</FONT> }<a name="line.347"></a>
351 <FONT color="green">348</FONT> }<a name="line.348"></a>
352 <FONT color="green">349</FONT> <a name="line.349"></a>
353 <FONT color="green">350</FONT> /**<a name="line.350"></a>
354 <FONT color="green">351</FONT> * Compute this minus &lt;code&gt;m&lt;/code&gt;.<a name="line.351"></a>
355 <FONT color="green">352</FONT> *<a name="line.352"></a>
356 <FONT color="green">353</FONT> * @param m matrix to be subtracted<a name="line.353"></a>
357 <FONT color="green">354</FONT> * @return this + m<a name="line.354"></a>
358 <FONT color="green">355</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.355"></a>
359 <FONT color="green">356</FONT> */<a name="line.356"></a>
360 <FONT color="green">357</FONT> public BigMatrixImpl subtract(BigMatrixImpl m) throws IllegalArgumentException {<a name="line.357"></a>
361 <FONT color="green">358</FONT> <a name="line.358"></a>
362 <FONT color="green">359</FONT> // safety check<a name="line.359"></a>
363 <FONT color="green">360</FONT> MatrixUtils.checkSubtractionCompatible(this, m);<a name="line.360"></a>
364 <FONT color="green">361</FONT> <a name="line.361"></a>
365 <FONT color="green">362</FONT> final int rowCount = getRowDimension();<a name="line.362"></a>
366 <FONT color="green">363</FONT> final int columnCount = getColumnDimension();<a name="line.363"></a>
367 <FONT color="green">364</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.364"></a>
368 <FONT color="green">365</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.365"></a>
369 <FONT color="green">366</FONT> final BigDecimal[] dataRow = data[row];<a name="line.366"></a>
370 <FONT color="green">367</FONT> final BigDecimal[] mRow = m.data[row];<a name="line.367"></a>
371 <FONT color="green">368</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.368"></a>
372 <FONT color="green">369</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.369"></a>
373 <FONT color="green">370</FONT> outDataRow[col] = dataRow[col].subtract(mRow[col]);<a name="line.370"></a>
374 <FONT color="green">371</FONT> }<a name="line.371"></a>
375 <FONT color="green">372</FONT> }<a name="line.372"></a>
376 <FONT color="green">373</FONT> return new BigMatrixImpl(outData, false);<a name="line.373"></a>
377 <FONT color="green">374</FONT> }<a name="line.374"></a>
378 <FONT color="green">375</FONT> <a name="line.375"></a>
379 <FONT color="green">376</FONT> /**<a name="line.376"></a>
380 <FONT color="green">377</FONT> * Returns the result of adding d to each entry of this.<a name="line.377"></a>
381 <FONT color="green">378</FONT> *<a name="line.378"></a>
382 <FONT color="green">379</FONT> * @param d value to be added to each entry<a name="line.379"></a>
383 <FONT color="green">380</FONT> * @return d + this<a name="line.380"></a>
384 <FONT color="green">381</FONT> */<a name="line.381"></a>
385 <FONT color="green">382</FONT> public BigMatrix scalarAdd(BigDecimal d) {<a name="line.382"></a>
386 <FONT color="green">383</FONT> final int rowCount = getRowDimension();<a name="line.383"></a>
387 <FONT color="green">384</FONT> final int columnCount = getColumnDimension();<a name="line.384"></a>
388 <FONT color="green">385</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.385"></a>
389 <FONT color="green">386</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.386"></a>
390 <FONT color="green">387</FONT> final BigDecimal[] dataRow = data[row];<a name="line.387"></a>
391 <FONT color="green">388</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.388"></a>
392 <FONT color="green">389</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.389"></a>
393 <FONT color="green">390</FONT> outDataRow[col] = dataRow[col].add(d);<a name="line.390"></a>
394 <FONT color="green">391</FONT> }<a name="line.391"></a>
395 <FONT color="green">392</FONT> }<a name="line.392"></a>
396 <FONT color="green">393</FONT> return new BigMatrixImpl(outData, false);<a name="line.393"></a>
397 <FONT color="green">394</FONT> }<a name="line.394"></a>
398 <FONT color="green">395</FONT> <a name="line.395"></a>
399 <FONT color="green">396</FONT> /**<a name="line.396"></a>
400 <FONT color="green">397</FONT> * Returns the result of multiplying each entry of this by &lt;code&gt;d&lt;/code&gt;<a name="line.397"></a>
401 <FONT color="green">398</FONT> * @param d value to multiply all entries by<a name="line.398"></a>
402 <FONT color="green">399</FONT> * @return d * this<a name="line.399"></a>
403 <FONT color="green">400</FONT> */<a name="line.400"></a>
404 <FONT color="green">401</FONT> public BigMatrix scalarMultiply(BigDecimal d) {<a name="line.401"></a>
405 <FONT color="green">402</FONT> final int rowCount = getRowDimension();<a name="line.402"></a>
406 <FONT color="green">403</FONT> final int columnCount = getColumnDimension();<a name="line.403"></a>
407 <FONT color="green">404</FONT> final BigDecimal[][] outData = new BigDecimal[rowCount][columnCount];<a name="line.404"></a>
408 <FONT color="green">405</FONT> for (int row = 0; row &lt; rowCount; row++) {<a name="line.405"></a>
409 <FONT color="green">406</FONT> final BigDecimal[] dataRow = data[row];<a name="line.406"></a>
410 <FONT color="green">407</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.407"></a>
411 <FONT color="green">408</FONT> for (int col = 0; col &lt; columnCount; col++) {<a name="line.408"></a>
412 <FONT color="green">409</FONT> outDataRow[col] = dataRow[col].multiply(d);<a name="line.409"></a>
413 <FONT color="green">410</FONT> }<a name="line.410"></a>
414 <FONT color="green">411</FONT> }<a name="line.411"></a>
415 <FONT color="green">412</FONT> return new BigMatrixImpl(outData, false);<a name="line.412"></a>
416 <FONT color="green">413</FONT> }<a name="line.413"></a>
417 <FONT color="green">414</FONT> <a name="line.414"></a>
418 <FONT color="green">415</FONT> /**<a name="line.415"></a>
419 <FONT color="green">416</FONT> * Returns the result of postmultiplying this by &lt;code&gt;m&lt;/code&gt;.<a name="line.416"></a>
420 <FONT color="green">417</FONT> * @param m matrix to postmultiply by<a name="line.417"></a>
421 <FONT color="green">418</FONT> * @return this*m<a name="line.418"></a>
422 <FONT color="green">419</FONT> * @throws IllegalArgumentException<a name="line.419"></a>
423 <FONT color="green">420</FONT> * if columnDimension(this) != rowDimension(m)<a name="line.420"></a>
424 <FONT color="green">421</FONT> */<a name="line.421"></a>
425 <FONT color="green">422</FONT> public BigMatrix multiply(BigMatrix m) throws IllegalArgumentException {<a name="line.422"></a>
426 <FONT color="green">423</FONT> try {<a name="line.423"></a>
427 <FONT color="green">424</FONT> return multiply((BigMatrixImpl) m);<a name="line.424"></a>
428 <FONT color="green">425</FONT> } catch (ClassCastException cce) {<a name="line.425"></a>
429 <FONT color="green">426</FONT> <a name="line.426"></a>
430 <FONT color="green">427</FONT> // safety check<a name="line.427"></a>
431 <FONT color="green">428</FONT> MatrixUtils.checkMultiplicationCompatible(this, m);<a name="line.428"></a>
432 <FONT color="green">429</FONT> <a name="line.429"></a>
433 <FONT color="green">430</FONT> final int nRows = this.getRowDimension();<a name="line.430"></a>
434 <FONT color="green">431</FONT> final int nCols = m.getColumnDimension();<a name="line.431"></a>
435 <FONT color="green">432</FONT> final int nSum = this.getColumnDimension();<a name="line.432"></a>
436 <FONT color="green">433</FONT> final BigDecimal[][] outData = new BigDecimal[nRows][nCols];<a name="line.433"></a>
437 <FONT color="green">434</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.434"></a>
438 <FONT color="green">435</FONT> final BigDecimal[] dataRow = data[row];<a name="line.435"></a>
439 <FONT color="green">436</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.436"></a>
440 <FONT color="green">437</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.437"></a>
441 <FONT color="green">438</FONT> BigDecimal sum = ZERO;<a name="line.438"></a>
442 <FONT color="green">439</FONT> for (int i = 0; i &lt; nSum; i++) {<a name="line.439"></a>
443 <FONT color="green">440</FONT> sum = sum.add(dataRow[i].multiply(m.getEntry(i, col)));<a name="line.440"></a>
444 <FONT color="green">441</FONT> }<a name="line.441"></a>
445 <FONT color="green">442</FONT> outDataRow[col] = sum;<a name="line.442"></a>
446 <FONT color="green">443</FONT> }<a name="line.443"></a>
447 <FONT color="green">444</FONT> }<a name="line.444"></a>
448 <FONT color="green">445</FONT> return new BigMatrixImpl(outData, false);<a name="line.445"></a>
449 <FONT color="green">446</FONT> }<a name="line.446"></a>
450 <FONT color="green">447</FONT> }<a name="line.447"></a>
451 <FONT color="green">448</FONT> <a name="line.448"></a>
452 <FONT color="green">449</FONT> /**<a name="line.449"></a>
453 <FONT color="green">450</FONT> * Returns the result of postmultiplying this by &lt;code&gt;m&lt;/code&gt;.<a name="line.450"></a>
454 <FONT color="green">451</FONT> * @param m matrix to postmultiply by<a name="line.451"></a>
455 <FONT color="green">452</FONT> * @return this*m<a name="line.452"></a>
456 <FONT color="green">453</FONT> * @throws IllegalArgumentException<a name="line.453"></a>
457 <FONT color="green">454</FONT> * if columnDimension(this) != rowDimension(m)<a name="line.454"></a>
458 <FONT color="green">455</FONT> */<a name="line.455"></a>
459 <FONT color="green">456</FONT> public BigMatrixImpl multiply(BigMatrixImpl m) throws IllegalArgumentException {<a name="line.456"></a>
460 <FONT color="green">457</FONT> <a name="line.457"></a>
461 <FONT color="green">458</FONT> // safety check<a name="line.458"></a>
462 <FONT color="green">459</FONT> MatrixUtils.checkMultiplicationCompatible(this, m);<a name="line.459"></a>
463 <FONT color="green">460</FONT> <a name="line.460"></a>
464 <FONT color="green">461</FONT> final int nRows = this.getRowDimension();<a name="line.461"></a>
465 <FONT color="green">462</FONT> final int nCols = m.getColumnDimension();<a name="line.462"></a>
466 <FONT color="green">463</FONT> final int nSum = this.getColumnDimension();<a name="line.463"></a>
467 <FONT color="green">464</FONT> final BigDecimal[][] outData = new BigDecimal[nRows][nCols];<a name="line.464"></a>
468 <FONT color="green">465</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.465"></a>
469 <FONT color="green">466</FONT> final BigDecimal[] dataRow = data[row];<a name="line.466"></a>
470 <FONT color="green">467</FONT> final BigDecimal[] outDataRow = outData[row];<a name="line.467"></a>
471 <FONT color="green">468</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.468"></a>
472 <FONT color="green">469</FONT> BigDecimal sum = ZERO;<a name="line.469"></a>
473 <FONT color="green">470</FONT> for (int i = 0; i &lt; nSum; i++) {<a name="line.470"></a>
474 <FONT color="green">471</FONT> sum = sum.add(dataRow[i].multiply(m.data[i][col]));<a name="line.471"></a>
475 <FONT color="green">472</FONT> }<a name="line.472"></a>
476 <FONT color="green">473</FONT> outDataRow[col] = sum;<a name="line.473"></a>
477 <FONT color="green">474</FONT> }<a name="line.474"></a>
478 <FONT color="green">475</FONT> }<a name="line.475"></a>
479 <FONT color="green">476</FONT> return new BigMatrixImpl(outData, false);<a name="line.476"></a>
480 <FONT color="green">477</FONT> }<a name="line.477"></a>
481 <FONT color="green">478</FONT> <a name="line.478"></a>
482 <FONT color="green">479</FONT> /**<a name="line.479"></a>
483 <FONT color="green">480</FONT> * Returns the result premultiplying this by &lt;code&gt;m&lt;/code&gt;.<a name="line.480"></a>
484 <FONT color="green">481</FONT> * @param m matrix to premultiply by<a name="line.481"></a>
485 <FONT color="green">482</FONT> * @return m * this<a name="line.482"></a>
486 <FONT color="green">483</FONT> * @throws IllegalArgumentException<a name="line.483"></a>
487 <FONT color="green">484</FONT> * if rowDimension(this) != columnDimension(m)<a name="line.484"></a>
488 <FONT color="green">485</FONT> */<a name="line.485"></a>
489 <FONT color="green">486</FONT> public BigMatrix preMultiply(BigMatrix m) throws IllegalArgumentException {<a name="line.486"></a>
490 <FONT color="green">487</FONT> return m.multiply(this);<a name="line.487"></a>
491 <FONT color="green">488</FONT> }<a name="line.488"></a>
492 <FONT color="green">489</FONT> <a name="line.489"></a>
493 <FONT color="green">490</FONT> /**<a name="line.490"></a>
494 <FONT color="green">491</FONT> * Returns matrix entries as a two-dimensional array.<a name="line.491"></a>
495 <FONT color="green">492</FONT> * &lt;p&gt;<a name="line.492"></a>
496 <FONT color="green">493</FONT> * Makes a fresh copy of the underlying data.&lt;/p&gt;<a name="line.493"></a>
497 <FONT color="green">494</FONT> *<a name="line.494"></a>
498 <FONT color="green">495</FONT> * @return 2-dimensional array of entries<a name="line.495"></a>
499 <FONT color="green">496</FONT> */<a name="line.496"></a>
500 <FONT color="green">497</FONT> public BigDecimal[][] getData() {<a name="line.497"></a>
501 <FONT color="green">498</FONT> return copyOut();<a name="line.498"></a>
502 <FONT color="green">499</FONT> }<a name="line.499"></a>
503 <FONT color="green">500</FONT> <a name="line.500"></a>
504 <FONT color="green">501</FONT> /**<a name="line.501"></a>
505 <FONT color="green">502</FONT> * Returns matrix entries as a two-dimensional array.<a name="line.502"></a>
506 <FONT color="green">503</FONT> * &lt;p&gt;<a name="line.503"></a>
507 <FONT color="green">504</FONT> * Makes a fresh copy of the underlying data converted to<a name="line.504"></a>
508 <FONT color="green">505</FONT> * &lt;code&gt;double&lt;/code&gt; values.&lt;/p&gt;<a name="line.505"></a>
509 <FONT color="green">506</FONT> *<a name="line.506"></a>
510 <FONT color="green">507</FONT> * @return 2-dimensional array of entries<a name="line.507"></a>
511 <FONT color="green">508</FONT> */<a name="line.508"></a>
512 <FONT color="green">509</FONT> public double[][] getDataAsDoubleArray() {<a name="line.509"></a>
513 <FONT color="green">510</FONT> final int nRows = getRowDimension();<a name="line.510"></a>
514 <FONT color="green">511</FONT> final int nCols = getColumnDimension();<a name="line.511"></a>
515 <FONT color="green">512</FONT> final double d[][] = new double[nRows][nCols];<a name="line.512"></a>
516 <FONT color="green">513</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.513"></a>
517 <FONT color="green">514</FONT> for (int j = 0; j &lt; nCols; j++) {<a name="line.514"></a>
518 <FONT color="green">515</FONT> d[i][j] = data[i][j].doubleValue();<a name="line.515"></a>
519 <FONT color="green">516</FONT> }<a name="line.516"></a>
520 <FONT color="green">517</FONT> }<a name="line.517"></a>
521 <FONT color="green">518</FONT> return d;<a name="line.518"></a>
522 <FONT color="green">519</FONT> }<a name="line.519"></a>
523 <FONT color="green">520</FONT> <a name="line.520"></a>
524 <FONT color="green">521</FONT> /**<a name="line.521"></a>
525 <FONT color="green">522</FONT> * Returns a reference to the underlying data array.<a name="line.522"></a>
526 <FONT color="green">523</FONT> * &lt;p&gt;<a name="line.523"></a>
527 <FONT color="green">524</FONT> * Does not make a fresh copy of the underlying data.&lt;/p&gt;<a name="line.524"></a>
528 <FONT color="green">525</FONT> *<a name="line.525"></a>
529 <FONT color="green">526</FONT> * @return 2-dimensional array of entries<a name="line.526"></a>
530 <FONT color="green">527</FONT> */<a name="line.527"></a>
531 <FONT color="green">528</FONT> public BigDecimal[][] getDataRef() {<a name="line.528"></a>
532 <FONT color="green">529</FONT> return data;<a name="line.529"></a>
533 <FONT color="green">530</FONT> }<a name="line.530"></a>
534 <FONT color="green">531</FONT> <a name="line.531"></a>
535 <FONT color="green">532</FONT> /***<a name="line.532"></a>
536 <FONT color="green">533</FONT> * Gets the rounding mode for division operations<a name="line.533"></a>
537 <FONT color="green">534</FONT> * The default is {@link java.math.BigDecimal#ROUND_HALF_UP}<a name="line.534"></a>
538 <FONT color="green">535</FONT> * @see BigDecimal<a name="line.535"></a>
539 <FONT color="green">536</FONT> * @return the rounding mode.<a name="line.536"></a>
540 <FONT color="green">537</FONT> */<a name="line.537"></a>
541 <FONT color="green">538</FONT> public int getRoundingMode() {<a name="line.538"></a>
542 <FONT color="green">539</FONT> return roundingMode;<a name="line.539"></a>
543 <FONT color="green">540</FONT> }<a name="line.540"></a>
544 <FONT color="green">541</FONT> <a name="line.541"></a>
545 <FONT color="green">542</FONT> /***<a name="line.542"></a>
546 <FONT color="green">543</FONT> * Sets the rounding mode for decimal divisions.<a name="line.543"></a>
547 <FONT color="green">544</FONT> * @see BigDecimal<a name="line.544"></a>
548 <FONT color="green">545</FONT> * @param roundingMode rounding mode for decimal divisions<a name="line.545"></a>
549 <FONT color="green">546</FONT> */<a name="line.546"></a>
550 <FONT color="green">547</FONT> public void setRoundingMode(int roundingMode) {<a name="line.547"></a>
551 <FONT color="green">548</FONT> this.roundingMode = roundingMode;<a name="line.548"></a>
552 <FONT color="green">549</FONT> }<a name="line.549"></a>
553 <FONT color="green">550</FONT> <a name="line.550"></a>
554 <FONT color="green">551</FONT> /***<a name="line.551"></a>
555 <FONT color="green">552</FONT> * Sets the scale for division operations.<a name="line.552"></a>
556 <FONT color="green">553</FONT> * The default is 64<a name="line.553"></a>
557 <FONT color="green">554</FONT> * @see BigDecimal<a name="line.554"></a>
558 <FONT color="green">555</FONT> * @return the scale<a name="line.555"></a>
559 <FONT color="green">556</FONT> */<a name="line.556"></a>
560 <FONT color="green">557</FONT> public int getScale() {<a name="line.557"></a>
561 <FONT color="green">558</FONT> return scale;<a name="line.558"></a>
562 <FONT color="green">559</FONT> }<a name="line.559"></a>
563 <FONT color="green">560</FONT> <a name="line.560"></a>
564 <FONT color="green">561</FONT> /***<a name="line.561"></a>
565 <FONT color="green">562</FONT> * Sets the scale for division operations.<a name="line.562"></a>
566 <FONT color="green">563</FONT> * @see BigDecimal<a name="line.563"></a>
567 <FONT color="green">564</FONT> * @param scale scale for division operations<a name="line.564"></a>
568 <FONT color="green">565</FONT> */<a name="line.565"></a>
569 <FONT color="green">566</FONT> public void setScale(int scale) {<a name="line.566"></a>
570 <FONT color="green">567</FONT> this.scale = scale;<a name="line.567"></a>
571 <FONT color="green">568</FONT> }<a name="line.568"></a>
572 <FONT color="green">569</FONT> <a name="line.569"></a>
573 <FONT color="green">570</FONT> /**<a name="line.570"></a>
574 <FONT color="green">571</FONT> * Returns the &lt;a href="http://mathworld.wolfram.com/MaximumAbsoluteRowSumNorm.html"&gt;<a name="line.571"></a>
575 <FONT color="green">572</FONT> * maximum absolute row sum norm&lt;/a&gt; of the matrix.<a name="line.572"></a>
576 <FONT color="green">573</FONT> *<a name="line.573"></a>
577 <FONT color="green">574</FONT> * @return norm<a name="line.574"></a>
578 <FONT color="green">575</FONT> */<a name="line.575"></a>
579 <FONT color="green">576</FONT> public BigDecimal getNorm() {<a name="line.576"></a>
580 <FONT color="green">577</FONT> BigDecimal maxColSum = ZERO;<a name="line.577"></a>
581 <FONT color="green">578</FONT> for (int col = 0; col &lt; this.getColumnDimension(); col++) {<a name="line.578"></a>
582 <FONT color="green">579</FONT> BigDecimal sum = ZERO;<a name="line.579"></a>
583 <FONT color="green">580</FONT> for (int row = 0; row &lt; this.getRowDimension(); row++) {<a name="line.580"></a>
584 <FONT color="green">581</FONT> sum = sum.add(data[row][col].abs());<a name="line.581"></a>
585 <FONT color="green">582</FONT> }<a name="line.582"></a>
586 <FONT color="green">583</FONT> maxColSum = maxColSum.max(sum);<a name="line.583"></a>
587 <FONT color="green">584</FONT> }<a name="line.584"></a>
588 <FONT color="green">585</FONT> return maxColSum;<a name="line.585"></a>
589 <FONT color="green">586</FONT> }<a name="line.586"></a>
590 <FONT color="green">587</FONT> <a name="line.587"></a>
591 <FONT color="green">588</FONT> /**<a name="line.588"></a>
592 <FONT color="green">589</FONT> * Gets a submatrix. Rows and columns are indicated<a name="line.589"></a>
593 <FONT color="green">590</FONT> * counting from 0 to n-1.<a name="line.590"></a>
594 <FONT color="green">591</FONT> *<a name="line.591"></a>
595 <FONT color="green">592</FONT> * @param startRow Initial row index<a name="line.592"></a>
596 <FONT color="green">593</FONT> * @param endRow Final row index<a name="line.593"></a>
597 <FONT color="green">594</FONT> * @param startColumn Initial column index<a name="line.594"></a>
598 <FONT color="green">595</FONT> * @param endColumn Final column index<a name="line.595"></a>
599 <FONT color="green">596</FONT> * @return The subMatrix containing the data of the<a name="line.596"></a>
600 <FONT color="green">597</FONT> * specified rows and columns<a name="line.597"></a>
601 <FONT color="green">598</FONT> * @exception MatrixIndexException if row or column selections are not valid<a name="line.598"></a>
602 <FONT color="green">599</FONT> */<a name="line.599"></a>
603 <FONT color="green">600</FONT> public BigMatrix getSubMatrix(int startRow, int endRow,<a name="line.600"></a>
604 <FONT color="green">601</FONT> int startColumn, int endColumn)<a name="line.601"></a>
605 <FONT color="green">602</FONT> throws MatrixIndexException {<a name="line.602"></a>
606 <FONT color="green">603</FONT> <a name="line.603"></a>
607 <FONT color="green">604</FONT> MatrixUtils.checkRowIndex(this, startRow);<a name="line.604"></a>
608 <FONT color="green">605</FONT> MatrixUtils.checkRowIndex(this, endRow);<a name="line.605"></a>
609 <FONT color="green">606</FONT> if (startRow &gt; endRow) {<a name="line.606"></a>
610 <FONT color="green">607</FONT> throw new MatrixIndexException("initial row {0} after final row {1}",<a name="line.607"></a>
611 <FONT color="green">608</FONT> startRow, endRow);<a name="line.608"></a>
612 <FONT color="green">609</FONT> }<a name="line.609"></a>
613 <FONT color="green">610</FONT> <a name="line.610"></a>
614 <FONT color="green">611</FONT> MatrixUtils.checkColumnIndex(this, startColumn);<a name="line.611"></a>
615 <FONT color="green">612</FONT> MatrixUtils.checkColumnIndex(this, endColumn);<a name="line.612"></a>
616 <FONT color="green">613</FONT> if (startColumn &gt; endColumn) {<a name="line.613"></a>
617 <FONT color="green">614</FONT> throw new MatrixIndexException("initial column {0} after final column {1}",<a name="line.614"></a>
618 <FONT color="green">615</FONT> startColumn, endColumn);<a name="line.615"></a>
619 <FONT color="green">616</FONT> }<a name="line.616"></a>
620 <FONT color="green">617</FONT> <a name="line.617"></a>
621 <FONT color="green">618</FONT> final BigDecimal[][] subMatrixData =<a name="line.618"></a>
622 <FONT color="green">619</FONT> new BigDecimal[endRow - startRow + 1][endColumn - startColumn + 1];<a name="line.619"></a>
623 <FONT color="green">620</FONT> for (int i = startRow; i &lt;= endRow; i++) {<a name="line.620"></a>
624 <FONT color="green">621</FONT> System.arraycopy(data[i], startColumn,<a name="line.621"></a>
625 <FONT color="green">622</FONT> subMatrixData[i - startRow], 0,<a name="line.622"></a>
626 <FONT color="green">623</FONT> endColumn - startColumn + 1);<a name="line.623"></a>
627 <FONT color="green">624</FONT> }<a name="line.624"></a>
628 <FONT color="green">625</FONT> <a name="line.625"></a>
629 <FONT color="green">626</FONT> return new BigMatrixImpl(subMatrixData, false);<a name="line.626"></a>
630 <FONT color="green">627</FONT> <a name="line.627"></a>
631 <FONT color="green">628</FONT> }<a name="line.628"></a>
632 <FONT color="green">629</FONT> <a name="line.629"></a>
633 <FONT color="green">630</FONT> /**<a name="line.630"></a>
634 <FONT color="green">631</FONT> * Gets a submatrix. Rows and columns are indicated<a name="line.631"></a>
635 <FONT color="green">632</FONT> * counting from 0 to n-1.<a name="line.632"></a>
636 <FONT color="green">633</FONT> *<a name="line.633"></a>
637 <FONT color="green">634</FONT> * @param selectedRows Array of row indices must be non-empty<a name="line.634"></a>
638 <FONT color="green">635</FONT> * @param selectedColumns Array of column indices must be non-empty<a name="line.635"></a>
639 <FONT color="green">636</FONT> * @return The subMatrix containing the data in the<a name="line.636"></a>
640 <FONT color="green">637</FONT> * specified rows and columns<a name="line.637"></a>
641 <FONT color="green">638</FONT> * @exception MatrixIndexException if supplied row or column index arrays<a name="line.638"></a>
642 <FONT color="green">639</FONT> * are not valid<a name="line.639"></a>
643 <FONT color="green">640</FONT> */<a name="line.640"></a>
644 <FONT color="green">641</FONT> public BigMatrix getSubMatrix(int[] selectedRows, int[] selectedColumns)<a name="line.641"></a>
645 <FONT color="green">642</FONT> throws MatrixIndexException {<a name="line.642"></a>
646 <FONT color="green">643</FONT> <a name="line.643"></a>
647 <FONT color="green">644</FONT> if (selectedRows.length * selectedColumns.length == 0) {<a name="line.644"></a>
648 <FONT color="green">645</FONT> if (selectedRows.length == 0) {<a name="line.645"></a>
649 <FONT color="green">646</FONT> throw new MatrixIndexException("empty selected row index array");<a name="line.646"></a>
650 <FONT color="green">647</FONT> }<a name="line.647"></a>
651 <FONT color="green">648</FONT> throw new MatrixIndexException("empty selected column index array");<a name="line.648"></a>
652 <FONT color="green">649</FONT> }<a name="line.649"></a>
653 <FONT color="green">650</FONT> <a name="line.650"></a>
654 <FONT color="green">651</FONT> final BigDecimal[][] subMatrixData =<a name="line.651"></a>
655 <FONT color="green">652</FONT> new BigDecimal[selectedRows.length][selectedColumns.length];<a name="line.652"></a>
656 <FONT color="green">653</FONT> try {<a name="line.653"></a>
657 <FONT color="green">654</FONT> for (int i = 0; i &lt; selectedRows.length; i++) {<a name="line.654"></a>
658 <FONT color="green">655</FONT> final BigDecimal[] subI = subMatrixData[i];<a name="line.655"></a>
659 <FONT color="green">656</FONT> final BigDecimal[] dataSelectedI = data[selectedRows[i]];<a name="line.656"></a>
660 <FONT color="green">657</FONT> for (int j = 0; j &lt; selectedColumns.length; j++) {<a name="line.657"></a>
661 <FONT color="green">658</FONT> subI[j] = dataSelectedI[selectedColumns[j]];<a name="line.658"></a>
662 <FONT color="green">659</FONT> }<a name="line.659"></a>
663 <FONT color="green">660</FONT> }<a name="line.660"></a>
664 <FONT color="green">661</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.661"></a>
665 <FONT color="green">662</FONT> // we redo the loop with checks enabled<a name="line.662"></a>
666 <FONT color="green">663</FONT> // in order to generate an appropriate message<a name="line.663"></a>
667 <FONT color="green">664</FONT> for (final int row : selectedRows) {<a name="line.664"></a>
668 <FONT color="green">665</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.665"></a>
669 <FONT color="green">666</FONT> }<a name="line.666"></a>
670 <FONT color="green">667</FONT> for (final int column : selectedColumns) {<a name="line.667"></a>
671 <FONT color="green">668</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.668"></a>
672 <FONT color="green">669</FONT> }<a name="line.669"></a>
673 <FONT color="green">670</FONT> }<a name="line.670"></a>
674 <FONT color="green">671</FONT> return new BigMatrixImpl(subMatrixData, false);<a name="line.671"></a>
675 <FONT color="green">672</FONT> }<a name="line.672"></a>
676 <FONT color="green">673</FONT> <a name="line.673"></a>
677 <FONT color="green">674</FONT> /**<a name="line.674"></a>
678 <FONT color="green">675</FONT> * Replace the submatrix starting at &lt;code&gt;row, column&lt;/code&gt; using data in<a name="line.675"></a>
679 <FONT color="green">676</FONT> * the input &lt;code&gt;subMatrix&lt;/code&gt; array. Indexes are 0-based.<a name="line.676"></a>
680 <FONT color="green">677</FONT> * &lt;p&gt;<a name="line.677"></a>
681 <FONT color="green">678</FONT> * Example:&lt;br&gt;<a name="line.678"></a>
682 <FONT color="green">679</FONT> * Starting with &lt;pre&gt;<a name="line.679"></a>
683 <FONT color="green">680</FONT> * 1 2 3 4<a name="line.680"></a>
684 <FONT color="green">681</FONT> * 5 6 7 8<a name="line.681"></a>
685 <FONT color="green">682</FONT> * 9 0 1 2<a name="line.682"></a>
686 <FONT color="green">683</FONT> * &lt;/pre&gt;<a name="line.683"></a>
687 <FONT color="green">684</FONT> * and &lt;code&gt;subMatrix = {{3, 4} {5,6}}&lt;/code&gt;, invoking<a name="line.684"></a>
688 <FONT color="green">685</FONT> * &lt;code&gt;setSubMatrix(subMatrix,1,1))&lt;/code&gt; will result in &lt;pre&gt;<a name="line.685"></a>
689 <FONT color="green">686</FONT> * 1 2 3 4<a name="line.686"></a>
690 <FONT color="green">687</FONT> * 5 3 4 8<a name="line.687"></a>
691 <FONT color="green">688</FONT> * 9 5 6 2<a name="line.688"></a>
692 <FONT color="green">689</FONT> * &lt;/pre&gt;&lt;/p&gt;<a name="line.689"></a>
693 <FONT color="green">690</FONT> *<a name="line.690"></a>
694 <FONT color="green">691</FONT> * @param subMatrix array containing the submatrix replacement data<a name="line.691"></a>
695 <FONT color="green">692</FONT> * @param row row coordinate of the top, left element to be replaced<a name="line.692"></a>
696 <FONT color="green">693</FONT> * @param column column coordinate of the top, left element to be replaced<a name="line.693"></a>
697 <FONT color="green">694</FONT> * @throws MatrixIndexException if subMatrix does not fit into this<a name="line.694"></a>
698 <FONT color="green">695</FONT> * matrix from element in (row, column)<a name="line.695"></a>
699 <FONT color="green">696</FONT> * @throws IllegalArgumentException if &lt;code&gt;subMatrix&lt;/code&gt; is not rectangular<a name="line.696"></a>
700 <FONT color="green">697</FONT> * (not all rows have the same length) or empty<a name="line.697"></a>
701 <FONT color="green">698</FONT> * @throws NullPointerException if &lt;code&gt;subMatrix&lt;/code&gt; is null<a name="line.698"></a>
702 <FONT color="green">699</FONT> * @since 1.1<a name="line.699"></a>
703 <FONT color="green">700</FONT> */<a name="line.700"></a>
704 <FONT color="green">701</FONT> public void setSubMatrix(BigDecimal[][] subMatrix, int row, int column)<a name="line.701"></a>
705 <FONT color="green">702</FONT> throws MatrixIndexException {<a name="line.702"></a>
706 <FONT color="green">703</FONT> <a name="line.703"></a>
707 <FONT color="green">704</FONT> final int nRows = subMatrix.length;<a name="line.704"></a>
708 <FONT color="green">705</FONT> if (nRows == 0) {<a name="line.705"></a>
709 <FONT color="green">706</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one row");<a name="line.706"></a>
710 <FONT color="green">707</FONT> }<a name="line.707"></a>
711 <FONT color="green">708</FONT> <a name="line.708"></a>
712 <FONT color="green">709</FONT> final int nCols = subMatrix[0].length;<a name="line.709"></a>
713 <FONT color="green">710</FONT> if (nCols == 0) {<a name="line.710"></a>
714 <FONT color="green">711</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one column");<a name="line.711"></a>
715 <FONT color="green">712</FONT> }<a name="line.712"></a>
716 <FONT color="green">713</FONT> <a name="line.713"></a>
717 <FONT color="green">714</FONT> for (int r = 1; r &lt; nRows; r++) {<a name="line.714"></a>
718 <FONT color="green">715</FONT> if (subMatrix[r].length != nCols) {<a name="line.715"></a>
719 <FONT color="green">716</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.716"></a>
720 <FONT color="green">717</FONT> "some rows have length {0} while others have length {1}",<a name="line.717"></a>
721 <FONT color="green">718</FONT> nCols, subMatrix[r].length);<a name="line.718"></a>
722 <FONT color="green">719</FONT> }<a name="line.719"></a>
723 <FONT color="green">720</FONT> }<a name="line.720"></a>
724 <FONT color="green">721</FONT> <a name="line.721"></a>
725 <FONT color="green">722</FONT> if (data == null) {<a name="line.722"></a>
726 <FONT color="green">723</FONT> if (row &gt; 0) {<a name="line.723"></a>
727 <FONT color="green">724</FONT> throw MathRuntimeException.createIllegalStateException(<a name="line.724"></a>
728 <FONT color="green">725</FONT> "first {0} rows are not initialized yet",<a name="line.725"></a>
729 <FONT color="green">726</FONT> row);<a name="line.726"></a>
730 <FONT color="green">727</FONT> }<a name="line.727"></a>
731 <FONT color="green">728</FONT> if (column &gt; 0) {<a name="line.728"></a>
732 <FONT color="green">729</FONT> throw MathRuntimeException.createIllegalStateException(<a name="line.729"></a>
733 <FONT color="green">730</FONT> "first {0} columns are not initialized yet",<a name="line.730"></a>
734 <FONT color="green">731</FONT> column);<a name="line.731"></a>
735 <FONT color="green">732</FONT> }<a name="line.732"></a>
736 <FONT color="green">733</FONT> data = new BigDecimal[nRows][nCols];<a name="line.733"></a>
737 <FONT color="green">734</FONT> System.arraycopy(subMatrix, 0, data, 0, subMatrix.length);<a name="line.734"></a>
738 <FONT color="green">735</FONT> } else {<a name="line.735"></a>
739 <FONT color="green">736</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.736"></a>
740 <FONT color="green">737</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.737"></a>
741 <FONT color="green">738</FONT> MatrixUtils.checkRowIndex(this, nRows + row - 1);<a name="line.738"></a>
742 <FONT color="green">739</FONT> MatrixUtils.checkColumnIndex(this, nCols + column - 1);<a name="line.739"></a>
743 <FONT color="green">740</FONT> }<a name="line.740"></a>
744 <FONT color="green">741</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.741"></a>
745 <FONT color="green">742</FONT> System.arraycopy(subMatrix[i], 0, data[row + i], column, nCols);<a name="line.742"></a>
746 <FONT color="green">743</FONT> }<a name="line.743"></a>
747 <FONT color="green">744</FONT> <a name="line.744"></a>
748 <FONT color="green">745</FONT> lu = null;<a name="line.745"></a>
749 <FONT color="green">746</FONT> <a name="line.746"></a>
750 <FONT color="green">747</FONT> }<a name="line.747"></a>
751 <FONT color="green">748</FONT> <a name="line.748"></a>
752 <FONT color="green">749</FONT> /**<a name="line.749"></a>
753 <FONT color="green">750</FONT> * Returns the entries in row number &lt;code&gt;row&lt;/code&gt;<a name="line.750"></a>
754 <FONT color="green">751</FONT> * as a row matrix. Row indices start at 0.<a name="line.751"></a>
755 <FONT color="green">752</FONT> *<a name="line.752"></a>
756 <FONT color="green">753</FONT> * @param row the row to be fetched<a name="line.753"></a>
757 <FONT color="green">754</FONT> * @return row matrix<a name="line.754"></a>
758 <FONT color="green">755</FONT> * @throws MatrixIndexException if the specified row index is invalid<a name="line.755"></a>
759 <FONT color="green">756</FONT> */<a name="line.756"></a>
760 <FONT color="green">757</FONT> public BigMatrix getRowMatrix(int row) throws MatrixIndexException {<a name="line.757"></a>
761 <FONT color="green">758</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.758"></a>
762 <FONT color="green">759</FONT> final int ncols = this.getColumnDimension();<a name="line.759"></a>
763 <FONT color="green">760</FONT> final BigDecimal[][] out = new BigDecimal[1][ncols];<a name="line.760"></a>
764 <FONT color="green">761</FONT> System.arraycopy(data[row], 0, out[0], 0, ncols);<a name="line.761"></a>
765 <FONT color="green">762</FONT> return new BigMatrixImpl(out, false);<a name="line.762"></a>
766 <FONT color="green">763</FONT> }<a name="line.763"></a>
767 <FONT color="green">764</FONT> <a name="line.764"></a>
768 <FONT color="green">765</FONT> /**<a name="line.765"></a>
769 <FONT color="green">766</FONT> * Returns the entries in column number &lt;code&gt;column&lt;/code&gt;<a name="line.766"></a>
770 <FONT color="green">767</FONT> * as a column matrix. Column indices start at 0.<a name="line.767"></a>
771 <FONT color="green">768</FONT> *<a name="line.768"></a>
772 <FONT color="green">769</FONT> * @param column the column to be fetched<a name="line.769"></a>
773 <FONT color="green">770</FONT> * @return column matrix<a name="line.770"></a>
774 <FONT color="green">771</FONT> * @throws MatrixIndexException if the specified column index is invalid<a name="line.771"></a>
775 <FONT color="green">772</FONT> */<a name="line.772"></a>
776 <FONT color="green">773</FONT> public BigMatrix getColumnMatrix(int column) throws MatrixIndexException {<a name="line.773"></a>
777 <FONT color="green">774</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.774"></a>
778 <FONT color="green">775</FONT> final int nRows = this.getRowDimension();<a name="line.775"></a>
779 <FONT color="green">776</FONT> final BigDecimal[][] out = new BigDecimal[nRows][1];<a name="line.776"></a>
780 <FONT color="green">777</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.777"></a>
781 <FONT color="green">778</FONT> out[row][0] = data[row][column];<a name="line.778"></a>
782 <FONT color="green">779</FONT> }<a name="line.779"></a>
783 <FONT color="green">780</FONT> return new BigMatrixImpl(out, false);<a name="line.780"></a>
784 <FONT color="green">781</FONT> }<a name="line.781"></a>
785 <FONT color="green">782</FONT> <a name="line.782"></a>
786 <FONT color="green">783</FONT> /**<a name="line.783"></a>
787 <FONT color="green">784</FONT> * Returns the entries in row number &lt;code&gt;row&lt;/code&gt; as an array.<a name="line.784"></a>
788 <FONT color="green">785</FONT> * &lt;p&gt;<a name="line.785"></a>
789 <FONT color="green">786</FONT> * Row indices start at 0. A &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown<a name="line.786"></a>
790 <FONT color="green">787</FONT> * unless &lt;code&gt;0 &lt;= row &lt; rowDimension.&lt;/code&gt;&lt;/p&gt;<a name="line.787"></a>
791 <FONT color="green">788</FONT> *<a name="line.788"></a>
792 <FONT color="green">789</FONT> * @param row the row to be fetched<a name="line.789"></a>
793 <FONT color="green">790</FONT> * @return array of entries in the row<a name="line.790"></a>
794 <FONT color="green">791</FONT> * @throws MatrixIndexException if the specified row index is not valid<a name="line.791"></a>
795 <FONT color="green">792</FONT> */<a name="line.792"></a>
796 <FONT color="green">793</FONT> public BigDecimal[] getRow(int row) throws MatrixIndexException {<a name="line.793"></a>
797 <FONT color="green">794</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.794"></a>
798 <FONT color="green">795</FONT> final int ncols = this.getColumnDimension();<a name="line.795"></a>
799 <FONT color="green">796</FONT> final BigDecimal[] out = new BigDecimal[ncols];<a name="line.796"></a>
800 <FONT color="green">797</FONT> System.arraycopy(data[row], 0, out, 0, ncols);<a name="line.797"></a>
801 <FONT color="green">798</FONT> return out;<a name="line.798"></a>
802 <FONT color="green">799</FONT> }<a name="line.799"></a>
803 <FONT color="green">800</FONT> <a name="line.800"></a>
804 <FONT color="green">801</FONT> /**<a name="line.801"></a>
805 <FONT color="green">802</FONT> * Returns the entries in row number &lt;code&gt;row&lt;/code&gt; as an array<a name="line.802"></a>
806 <FONT color="green">803</FONT> * of double values.<a name="line.803"></a>
807 <FONT color="green">804</FONT> * &lt;p&gt;<a name="line.804"></a>
808 <FONT color="green">805</FONT> * Row indices start at 0. A &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown<a name="line.805"></a>
809 <FONT color="green">806</FONT> * unless &lt;code&gt;0 &lt;= row &lt; rowDimension.&lt;/code&gt;&lt;/p&gt;<a name="line.806"></a>
810 <FONT color="green">807</FONT> *<a name="line.807"></a>
811 <FONT color="green">808</FONT> * @param row the row to be fetched<a name="line.808"></a>
812 <FONT color="green">809</FONT> * @return array of entries in the row<a name="line.809"></a>
813 <FONT color="green">810</FONT> * @throws MatrixIndexException if the specified row index is not valid<a name="line.810"></a>
814 <FONT color="green">811</FONT> */<a name="line.811"></a>
815 <FONT color="green">812</FONT> public double[] getRowAsDoubleArray(int row) throws MatrixIndexException {<a name="line.812"></a>
816 <FONT color="green">813</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.813"></a>
817 <FONT color="green">814</FONT> final int ncols = this.getColumnDimension();<a name="line.814"></a>
818 <FONT color="green">815</FONT> final double[] out = new double[ncols];<a name="line.815"></a>
819 <FONT color="green">816</FONT> for (int i=0;i&lt;ncols;i++) {<a name="line.816"></a>
820 <FONT color="green">817</FONT> out[i] = data[row][i].doubleValue();<a name="line.817"></a>
821 <FONT color="green">818</FONT> }<a name="line.818"></a>
822 <FONT color="green">819</FONT> return out;<a name="line.819"></a>
823 <FONT color="green">820</FONT> }<a name="line.820"></a>
824 <FONT color="green">821</FONT> <a name="line.821"></a>
825 <FONT color="green">822</FONT> /**<a name="line.822"></a>
826 <FONT color="green">823</FONT> * Returns the entries in column number &lt;code&gt;col&lt;/code&gt; as an array.<a name="line.823"></a>
827 <FONT color="green">824</FONT> * &lt;p&gt;<a name="line.824"></a>
828 <FONT color="green">825</FONT> * Column indices start at 0. A &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown<a name="line.825"></a>
829 <FONT color="green">826</FONT> * unless &lt;code&gt;0 &lt;= column &lt; columnDimension.&lt;/code&gt;&lt;/p&gt;<a name="line.826"></a>
830 <FONT color="green">827</FONT> *<a name="line.827"></a>
831 <FONT color="green">828</FONT> * @param col the column to be fetched<a name="line.828"></a>
832 <FONT color="green">829</FONT> * @return array of entries in the column<a name="line.829"></a>
833 <FONT color="green">830</FONT> * @throws MatrixIndexException if the specified column index is not valid<a name="line.830"></a>
834 <FONT color="green">831</FONT> */<a name="line.831"></a>
835 <FONT color="green">832</FONT> public BigDecimal[] getColumn(int col) throws MatrixIndexException {<a name="line.832"></a>
836 <FONT color="green">833</FONT> MatrixUtils.checkColumnIndex(this, col);<a name="line.833"></a>
837 <FONT color="green">834</FONT> final int nRows = this.getRowDimension();<a name="line.834"></a>
838 <FONT color="green">835</FONT> final BigDecimal[] out = new BigDecimal[nRows];<a name="line.835"></a>
839 <FONT color="green">836</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.836"></a>
840 <FONT color="green">837</FONT> out[i] = data[i][col];<a name="line.837"></a>
841 <FONT color="green">838</FONT> }<a name="line.838"></a>
842 <FONT color="green">839</FONT> return out;<a name="line.839"></a>
843 <FONT color="green">840</FONT> }<a name="line.840"></a>
844 <FONT color="green">841</FONT> <a name="line.841"></a>
845 <FONT color="green">842</FONT> /**<a name="line.842"></a>
846 <FONT color="green">843</FONT> * Returns the entries in column number &lt;code&gt;col&lt;/code&gt; as an array<a name="line.843"></a>
847 <FONT color="green">844</FONT> * of double values.<a name="line.844"></a>
848 <FONT color="green">845</FONT> * &lt;p&gt;<a name="line.845"></a>
849 <FONT color="green">846</FONT> * Column indices start at 0. A &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown<a name="line.846"></a>
850 <FONT color="green">847</FONT> * unless &lt;code&gt;0 &lt;= column &lt; columnDimension.&lt;/code&gt;&lt;/p&gt;<a name="line.847"></a>
851 <FONT color="green">848</FONT> *<a name="line.848"></a>
852 <FONT color="green">849</FONT> * @param col the column to be fetched<a name="line.849"></a>
853 <FONT color="green">850</FONT> * @return array of entries in the column<a name="line.850"></a>
854 <FONT color="green">851</FONT> * @throws MatrixIndexException if the specified column index is not valid<a name="line.851"></a>
855 <FONT color="green">852</FONT> */<a name="line.852"></a>
856 <FONT color="green">853</FONT> public double[] getColumnAsDoubleArray(int col) throws MatrixIndexException {<a name="line.853"></a>
857 <FONT color="green">854</FONT> MatrixUtils.checkColumnIndex(this, col);<a name="line.854"></a>
858 <FONT color="green">855</FONT> final int nrows = this.getRowDimension();<a name="line.855"></a>
859 <FONT color="green">856</FONT> final double[] out = new double[nrows];<a name="line.856"></a>
860 <FONT color="green">857</FONT> for (int i=0;i&lt;nrows;i++) {<a name="line.857"></a>
861 <FONT color="green">858</FONT> out[i] = data[i][col].doubleValue();<a name="line.858"></a>
862 <FONT color="green">859</FONT> }<a name="line.859"></a>
863 <FONT color="green">860</FONT> return out;<a name="line.860"></a>
864 <FONT color="green">861</FONT> }<a name="line.861"></a>
865 <FONT color="green">862</FONT> <a name="line.862"></a>
866 <FONT color="green">863</FONT> /**<a name="line.863"></a>
867 <FONT color="green">864</FONT> * Returns the entry in the specified row and column.<a name="line.864"></a>
868 <FONT color="green">865</FONT> * &lt;p&gt;<a name="line.865"></a>
869 <FONT color="green">866</FONT> * Row and column indices start at 0 and must satisfy<a name="line.866"></a>
870 <FONT color="green">867</FONT> * &lt;ul&gt;<a name="line.867"></a>
871 <FONT color="green">868</FONT> * &lt;li&gt;&lt;code&gt;0 &lt;= row &lt; rowDimension&lt;/code&gt;&lt;/li&gt;<a name="line.868"></a>
872 <FONT color="green">869</FONT> * &lt;li&gt;&lt;code&gt; 0 &lt;= column &lt; columnDimension&lt;/code&gt;&lt;/li&gt;<a name="line.869"></a>
873 <FONT color="green">870</FONT> * &lt;/ul&gt;<a name="line.870"></a>
874 <FONT color="green">871</FONT> * otherwise a &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown.&lt;/p&gt;<a name="line.871"></a>
875 <FONT color="green">872</FONT> *<a name="line.872"></a>
876 <FONT color="green">873</FONT> * @param row row location of entry to be fetched<a name="line.873"></a>
877 <FONT color="green">874</FONT> * @param column column location of entry to be fetched<a name="line.874"></a>
878 <FONT color="green">875</FONT> * @return matrix entry in row,column<a name="line.875"></a>
879 <FONT color="green">876</FONT> * @throws MatrixIndexException if the row or column index is not valid<a name="line.876"></a>
880 <FONT color="green">877</FONT> */<a name="line.877"></a>
881 <FONT color="green">878</FONT> public BigDecimal getEntry(int row, int column)<a name="line.878"></a>
882 <FONT color="green">879</FONT> throws MatrixIndexException {<a name="line.879"></a>
883 <FONT color="green">880</FONT> try {<a name="line.880"></a>
884 <FONT color="green">881</FONT> return data[row][column];<a name="line.881"></a>
885 <FONT color="green">882</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.882"></a>
886 <FONT color="green">883</FONT> throw new MatrixIndexException(<a name="line.883"></a>
887 <FONT color="green">884</FONT> "no entry at indices ({0}, {1}) in a {2}x{3} matrix",<a name="line.884"></a>
888 <FONT color="green">885</FONT> row, column, getRowDimension(), getColumnDimension());<a name="line.885"></a>
889 <FONT color="green">886</FONT> }<a name="line.886"></a>
890 <FONT color="green">887</FONT> }<a name="line.887"></a>
891 <FONT color="green">888</FONT> <a name="line.888"></a>
892 <FONT color="green">889</FONT> /**<a name="line.889"></a>
893 <FONT color="green">890</FONT> * Returns the entry in the specified row and column as a double.<a name="line.890"></a>
894 <FONT color="green">891</FONT> * &lt;p&gt;<a name="line.891"></a>
895 <FONT color="green">892</FONT> * Row and column indices start at 0 and must satisfy<a name="line.892"></a>
896 <FONT color="green">893</FONT> * &lt;ul&gt;<a name="line.893"></a>
897 <FONT color="green">894</FONT> * &lt;li&gt;&lt;code&gt;0 &lt;= row &lt; rowDimension&lt;/code&gt;&lt;/li&gt;<a name="line.894"></a>
898 <FONT color="green">895</FONT> * &lt;li&gt;&lt;code&gt; 0 &lt;= column &lt; columnDimension&lt;/code&gt;&lt;/li&gt;<a name="line.895"></a>
899 <FONT color="green">896</FONT> * &lt;/ul&gt;<a name="line.896"></a>
900 <FONT color="green">897</FONT> * otherwise a &lt;code&gt;MatrixIndexException&lt;/code&gt; is thrown.&lt;/p&gt;<a name="line.897"></a>
901 <FONT color="green">898</FONT> *<a name="line.898"></a>
902 <FONT color="green">899</FONT> * @param row row location of entry to be fetched<a name="line.899"></a>
903 <FONT color="green">900</FONT> * @param column column location of entry to be fetched<a name="line.900"></a>
904 <FONT color="green">901</FONT> * @return matrix entry in row,column<a name="line.901"></a>
905 <FONT color="green">902</FONT> * @throws MatrixIndexException if the row<a name="line.902"></a>
906 <FONT color="green">903</FONT> * or column index is not valid<a name="line.903"></a>
907 <FONT color="green">904</FONT> */<a name="line.904"></a>
908 <FONT color="green">905</FONT> public double getEntryAsDouble(int row, int column) throws MatrixIndexException {<a name="line.905"></a>
909 <FONT color="green">906</FONT> return getEntry(row,column).doubleValue();<a name="line.906"></a>
910 <FONT color="green">907</FONT> }<a name="line.907"></a>
911 <FONT color="green">908</FONT> <a name="line.908"></a>
912 <FONT color="green">909</FONT> /**<a name="line.909"></a>
913 <FONT color="green">910</FONT> * Returns the transpose matrix.<a name="line.910"></a>
914 <FONT color="green">911</FONT> *<a name="line.911"></a>
915 <FONT color="green">912</FONT> * @return transpose matrix<a name="line.912"></a>
916 <FONT color="green">913</FONT> */<a name="line.913"></a>
917 <FONT color="green">914</FONT> public BigMatrix transpose() {<a name="line.914"></a>
918 <FONT color="green">915</FONT> final int nRows = this.getRowDimension();<a name="line.915"></a>
919 <FONT color="green">916</FONT> final int nCols = this.getColumnDimension();<a name="line.916"></a>
920 <FONT color="green">917</FONT> final BigDecimal[][] outData = new BigDecimal[nCols][nRows];<a name="line.917"></a>
921 <FONT color="green">918</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.918"></a>
922 <FONT color="green">919</FONT> final BigDecimal[] dataRow = data[row];<a name="line.919"></a>
923 <FONT color="green">920</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.920"></a>
924 <FONT color="green">921</FONT> outData[col][row] = dataRow[col];<a name="line.921"></a>
925 <FONT color="green">922</FONT> }<a name="line.922"></a>
926 <FONT color="green">923</FONT> }<a name="line.923"></a>
927 <FONT color="green">924</FONT> return new BigMatrixImpl(outData, false);<a name="line.924"></a>
928 <FONT color="green">925</FONT> }<a name="line.925"></a>
929 <FONT color="green">926</FONT> <a name="line.926"></a>
930 <FONT color="green">927</FONT> /**<a name="line.927"></a>
931 <FONT color="green">928</FONT> * Returns the inverse matrix if this matrix is invertible.<a name="line.928"></a>
932 <FONT color="green">929</FONT> *<a name="line.929"></a>
933 <FONT color="green">930</FONT> * @return inverse matrix<a name="line.930"></a>
934 <FONT color="green">931</FONT> * @throws InvalidMatrixException if this is not invertible<a name="line.931"></a>
935 <FONT color="green">932</FONT> */<a name="line.932"></a>
936 <FONT color="green">933</FONT> public BigMatrix inverse() throws InvalidMatrixException {<a name="line.933"></a>
937 <FONT color="green">934</FONT> return solve(MatrixUtils.createBigIdentityMatrix(getRowDimension()));<a name="line.934"></a>
938 <FONT color="green">935</FONT> }<a name="line.935"></a>
939 <FONT color="green">936</FONT> <a name="line.936"></a>
940 <FONT color="green">937</FONT> /**<a name="line.937"></a>
941 <FONT color="green">938</FONT> * Returns the determinant of this matrix.<a name="line.938"></a>
942 <FONT color="green">939</FONT> *<a name="line.939"></a>
943 <FONT color="green">940</FONT> * @return determinant<a name="line.940"></a>
944 <FONT color="green">941</FONT> * @throws InvalidMatrixException if matrix is not square<a name="line.941"></a>
945 <FONT color="green">942</FONT> */<a name="line.942"></a>
946 <FONT color="green">943</FONT> public BigDecimal getDeterminant() throws InvalidMatrixException {<a name="line.943"></a>
947 <FONT color="green">944</FONT> if (!isSquare()) {<a name="line.944"></a>
948 <FONT color="green">945</FONT> throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());<a name="line.945"></a>
949 <FONT color="green">946</FONT> }<a name="line.946"></a>
950 <FONT color="green">947</FONT> if (isSingular()) { // note: this has side effect of attempting LU decomp if lu == null<a name="line.947"></a>
951 <FONT color="green">948</FONT> return ZERO;<a name="line.948"></a>
952 <FONT color="green">949</FONT> } else {<a name="line.949"></a>
953 <FONT color="green">950</FONT> BigDecimal det = (parity == 1) ? ONE : ONE.negate();<a name="line.950"></a>
954 <FONT color="green">951</FONT> for (int i = 0; i &lt; getRowDimension(); i++) {<a name="line.951"></a>
955 <FONT color="green">952</FONT> det = det.multiply(lu[i][i]);<a name="line.952"></a>
956 <FONT color="green">953</FONT> }<a name="line.953"></a>
957 <FONT color="green">954</FONT> return det;<a name="line.954"></a>
958 <FONT color="green">955</FONT> }<a name="line.955"></a>
959 <FONT color="green">956</FONT> }<a name="line.956"></a>
960 <FONT color="green">957</FONT> <a name="line.957"></a>
961 <FONT color="green">958</FONT> /**<a name="line.958"></a>
962 <FONT color="green">959</FONT> * Is this a square matrix?<a name="line.959"></a>
963 <FONT color="green">960</FONT> * @return true if the matrix is square (rowDimension = columnDimension)<a name="line.960"></a>
964 <FONT color="green">961</FONT> */<a name="line.961"></a>
965 <FONT color="green">962</FONT> public boolean isSquare() {<a name="line.962"></a>
966 <FONT color="green">963</FONT> return getColumnDimension() == getRowDimension();<a name="line.963"></a>
967 <FONT color="green">964</FONT> }<a name="line.964"></a>
968 <FONT color="green">965</FONT> <a name="line.965"></a>
969 <FONT color="green">966</FONT> /**<a name="line.966"></a>
970 <FONT color="green">967</FONT> * Is this a singular matrix?<a name="line.967"></a>
971 <FONT color="green">968</FONT> * @return true if the matrix is singular<a name="line.968"></a>
972 <FONT color="green">969</FONT> */<a name="line.969"></a>
973 <FONT color="green">970</FONT> public boolean isSingular() {<a name="line.970"></a>
974 <FONT color="green">971</FONT> if (lu == null) {<a name="line.971"></a>
975 <FONT color="green">972</FONT> try {<a name="line.972"></a>
976 <FONT color="green">973</FONT> luDecompose();<a name="line.973"></a>
977 <FONT color="green">974</FONT> return false;<a name="line.974"></a>
978 <FONT color="green">975</FONT> } catch (InvalidMatrixException ex) {<a name="line.975"></a>
979 <FONT color="green">976</FONT> return true;<a name="line.976"></a>
980 <FONT color="green">977</FONT> }<a name="line.977"></a>
981 <FONT color="green">978</FONT> } else { // LU decomp must have been successfully performed<a name="line.978"></a>
982 <FONT color="green">979</FONT> return false; // so the matrix is not singular<a name="line.979"></a>
983 <FONT color="green">980</FONT> }<a name="line.980"></a>
984 <FONT color="green">981</FONT> }<a name="line.981"></a>
985 <FONT color="green">982</FONT> <a name="line.982"></a>
986 <FONT color="green">983</FONT> /**<a name="line.983"></a>
987 <FONT color="green">984</FONT> * Returns the number of rows in the matrix.<a name="line.984"></a>
988 <FONT color="green">985</FONT> *<a name="line.985"></a>
989 <FONT color="green">986</FONT> * @return rowDimension<a name="line.986"></a>
990 <FONT color="green">987</FONT> */<a name="line.987"></a>
991 <FONT color="green">988</FONT> public int getRowDimension() {<a name="line.988"></a>
992 <FONT color="green">989</FONT> return data.length;<a name="line.989"></a>
993 <FONT color="green">990</FONT> }<a name="line.990"></a>
994 <FONT color="green">991</FONT> <a name="line.991"></a>
995 <FONT color="green">992</FONT> /**<a name="line.992"></a>
996 <FONT color="green">993</FONT> * Returns the number of columns in the matrix.<a name="line.993"></a>
997 <FONT color="green">994</FONT> *<a name="line.994"></a>
998 <FONT color="green">995</FONT> * @return columnDimension<a name="line.995"></a>
999 <FONT color="green">996</FONT> */<a name="line.996"></a>
1000 <FONT color="green">997</FONT> public int getColumnDimension() {<a name="line.997"></a>
1001 <FONT color="green">998</FONT> return data[0].length;<a name="line.998"></a>
1002 <FONT color="green">999</FONT> }<a name="line.999"></a>
1003 <FONT color="green">1000</FONT> <a name="line.1000"></a>
1004 <FONT color="green">1001</FONT> /**<a name="line.1001"></a>
1005 <FONT color="green">1002</FONT> * Returns the &lt;a href="http://mathworld.wolfram.com/MatrixTrace.html"&gt;<a name="line.1002"></a>
1006 <FONT color="green">1003</FONT> * trace&lt;/a&gt; of the matrix (the sum of the elements on the main diagonal).<a name="line.1003"></a>
1007 <FONT color="green">1004</FONT> *<a name="line.1004"></a>
1008 <FONT color="green">1005</FONT> * @return trace<a name="line.1005"></a>
1009 <FONT color="green">1006</FONT> *<a name="line.1006"></a>
1010 <FONT color="green">1007</FONT> * @throws IllegalArgumentException if this matrix is not square.<a name="line.1007"></a>
1011 <FONT color="green">1008</FONT> */<a name="line.1008"></a>
1012 <FONT color="green">1009</FONT> public BigDecimal getTrace() throws IllegalArgumentException {<a name="line.1009"></a>
1013 <FONT color="green">1010</FONT> if (!isSquare()) {<a name="line.1010"></a>
1014 <FONT color="green">1011</FONT> throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());<a name="line.1011"></a>
1015 <FONT color="green">1012</FONT> }<a name="line.1012"></a>
1016 <FONT color="green">1013</FONT> BigDecimal trace = data[0][0];<a name="line.1013"></a>
1017 <FONT color="green">1014</FONT> for (int i = 1; i &lt; this.getRowDimension(); i++) {<a name="line.1014"></a>
1018 <FONT color="green">1015</FONT> trace = trace.add(data[i][i]);<a name="line.1015"></a>
1019 <FONT color="green">1016</FONT> }<a name="line.1016"></a>
1020 <FONT color="green">1017</FONT> return trace;<a name="line.1017"></a>
1021 <FONT color="green">1018</FONT> }<a name="line.1018"></a>
1022 <FONT color="green">1019</FONT> <a name="line.1019"></a>
1023 <FONT color="green">1020</FONT> /**<a name="line.1020"></a>
1024 <FONT color="green">1021</FONT> * Returns the result of multiplying this by the vector &lt;code&gt;v&lt;/code&gt;.<a name="line.1021"></a>
1025 <FONT color="green">1022</FONT> *<a name="line.1022"></a>
1026 <FONT color="green">1023</FONT> * @param v the vector to operate on<a name="line.1023"></a>
1027 <FONT color="green">1024</FONT> * @return this*v<a name="line.1024"></a>
1028 <FONT color="green">1025</FONT> * @throws IllegalArgumentException if columnDimension != v.size()<a name="line.1025"></a>
1029 <FONT color="green">1026</FONT> */<a name="line.1026"></a>
1030 <FONT color="green">1027</FONT> public BigDecimal[] operate(BigDecimal[] v) throws IllegalArgumentException {<a name="line.1027"></a>
1031 <FONT color="green">1028</FONT> if (v.length != getColumnDimension()) {<a name="line.1028"></a>
1032 <FONT color="green">1029</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1029"></a>
1033 <FONT color="green">1030</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.1030"></a>
1034 <FONT color="green">1031</FONT> v.length, getColumnDimension() );<a name="line.1031"></a>
1035 <FONT color="green">1032</FONT> }<a name="line.1032"></a>
1036 <FONT color="green">1033</FONT> final int nRows = this.getRowDimension();<a name="line.1033"></a>
1037 <FONT color="green">1034</FONT> final int nCols = this.getColumnDimension();<a name="line.1034"></a>
1038 <FONT color="green">1035</FONT> final BigDecimal[] out = new BigDecimal[nRows];<a name="line.1035"></a>
1039 <FONT color="green">1036</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.1036"></a>
1040 <FONT color="green">1037</FONT> BigDecimal sum = ZERO;<a name="line.1037"></a>
1041 <FONT color="green">1038</FONT> for (int i = 0; i &lt; nCols; i++) {<a name="line.1038"></a>
1042 <FONT color="green">1039</FONT> sum = sum.add(data[row][i].multiply(v[i]));<a name="line.1039"></a>
1043 <FONT color="green">1040</FONT> }<a name="line.1040"></a>
1044 <FONT color="green">1041</FONT> out[row] = sum;<a name="line.1041"></a>
1045 <FONT color="green">1042</FONT> }<a name="line.1042"></a>
1046 <FONT color="green">1043</FONT> return out;<a name="line.1043"></a>
1047 <FONT color="green">1044</FONT> }<a name="line.1044"></a>
1048 <FONT color="green">1045</FONT> <a name="line.1045"></a>
1049 <FONT color="green">1046</FONT> /**<a name="line.1046"></a>
1050 <FONT color="green">1047</FONT> * Returns the result of multiplying this by the vector &lt;code&gt;v&lt;/code&gt;.<a name="line.1047"></a>
1051 <FONT color="green">1048</FONT> *<a name="line.1048"></a>
1052 <FONT color="green">1049</FONT> * @param v the vector to operate on<a name="line.1049"></a>
1053 <FONT color="green">1050</FONT> * @return this*v<a name="line.1050"></a>
1054 <FONT color="green">1051</FONT> * @throws IllegalArgumentException if columnDimension != v.size()<a name="line.1051"></a>
1055 <FONT color="green">1052</FONT> */<a name="line.1052"></a>
1056 <FONT color="green">1053</FONT> public BigDecimal[] operate(double[] v) throws IllegalArgumentException {<a name="line.1053"></a>
1057 <FONT color="green">1054</FONT> final BigDecimal bd[] = new BigDecimal[v.length];<a name="line.1054"></a>
1058 <FONT color="green">1055</FONT> for (int i = 0; i &lt; bd.length; i++) {<a name="line.1055"></a>
1059 <FONT color="green">1056</FONT> bd[i] = new BigDecimal(v[i]);<a name="line.1056"></a>
1060 <FONT color="green">1057</FONT> }<a name="line.1057"></a>
1061 <FONT color="green">1058</FONT> return operate(bd);<a name="line.1058"></a>
1062 <FONT color="green">1059</FONT> }<a name="line.1059"></a>
1063 <FONT color="green">1060</FONT> <a name="line.1060"></a>
1064 <FONT color="green">1061</FONT> /**<a name="line.1061"></a>
1065 <FONT color="green">1062</FONT> * Returns the (row) vector result of premultiplying this by the vector &lt;code&gt;v&lt;/code&gt;.<a name="line.1062"></a>
1066 <FONT color="green">1063</FONT> *<a name="line.1063"></a>
1067 <FONT color="green">1064</FONT> * @param v the row vector to premultiply by<a name="line.1064"></a>
1068 <FONT color="green">1065</FONT> * @return v*this<a name="line.1065"></a>
1069 <FONT color="green">1066</FONT> * @throws IllegalArgumentException if rowDimension != v.size()<a name="line.1066"></a>
1070 <FONT color="green">1067</FONT> */<a name="line.1067"></a>
1071 <FONT color="green">1068</FONT> public BigDecimal[] preMultiply(BigDecimal[] v) throws IllegalArgumentException {<a name="line.1068"></a>
1072 <FONT color="green">1069</FONT> final int nRows = this.getRowDimension();<a name="line.1069"></a>
1073 <FONT color="green">1070</FONT> if (v.length != nRows) {<a name="line.1070"></a>
1074 <FONT color="green">1071</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1071"></a>
1075 <FONT color="green">1072</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.1072"></a>
1076 <FONT color="green">1073</FONT> v.length, nRows );<a name="line.1073"></a>
1077 <FONT color="green">1074</FONT> }<a name="line.1074"></a>
1078 <FONT color="green">1075</FONT> final int nCols = this.getColumnDimension();<a name="line.1075"></a>
1079 <FONT color="green">1076</FONT> final BigDecimal[] out = new BigDecimal[nCols];<a name="line.1076"></a>
1080 <FONT color="green">1077</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.1077"></a>
1081 <FONT color="green">1078</FONT> BigDecimal sum = ZERO;<a name="line.1078"></a>
1082 <FONT color="green">1079</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.1079"></a>
1083 <FONT color="green">1080</FONT> sum = sum.add(data[i][col].multiply(v[i]));<a name="line.1080"></a>
1084 <FONT color="green">1081</FONT> }<a name="line.1081"></a>
1085 <FONT color="green">1082</FONT> out[col] = sum;<a name="line.1082"></a>
1086 <FONT color="green">1083</FONT> }<a name="line.1083"></a>
1087 <FONT color="green">1084</FONT> return out;<a name="line.1084"></a>
1088 <FONT color="green">1085</FONT> }<a name="line.1085"></a>
1089 <FONT color="green">1086</FONT> <a name="line.1086"></a>
1090 <FONT color="green">1087</FONT> /**<a name="line.1087"></a>
1091 <FONT color="green">1088</FONT> * Returns a matrix of (column) solution vectors for linear systems with<a name="line.1088"></a>
1092 <FONT color="green">1089</FONT> * coefficient matrix = this and constant vectors = columns of<a name="line.1089"></a>
1093 <FONT color="green">1090</FONT> * &lt;code&gt;b&lt;/code&gt;.<a name="line.1090"></a>
1094 <FONT color="green">1091</FONT> *<a name="line.1091"></a>
1095 <FONT color="green">1092</FONT> * @param b array of constants forming RHS of linear systems to<a name="line.1092"></a>
1096 <FONT color="green">1093</FONT> * to solve<a name="line.1093"></a>
1097 <FONT color="green">1094</FONT> * @return solution array<a name="line.1094"></a>
1098 <FONT color="green">1095</FONT> * @throws IllegalArgumentException if this.rowDimension != row dimension<a name="line.1095"></a>
1099 <FONT color="green">1096</FONT> * @throws InvalidMatrixException if this matrix is not square or is singular<a name="line.1096"></a>
1100 <FONT color="green">1097</FONT> */<a name="line.1097"></a>
1101 <FONT color="green">1098</FONT> public BigDecimal[] solve(BigDecimal[] b) throws IllegalArgumentException, InvalidMatrixException {<a name="line.1098"></a>
1102 <FONT color="green">1099</FONT> final int nRows = this.getRowDimension();<a name="line.1099"></a>
1103 <FONT color="green">1100</FONT> if (b.length != nRows) {<a name="line.1100"></a>
1104 <FONT color="green">1101</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1101"></a>
1105 <FONT color="green">1102</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.1102"></a>
1106 <FONT color="green">1103</FONT> b.length, nRows);<a name="line.1103"></a>
1107 <FONT color="green">1104</FONT> }<a name="line.1104"></a>
1108 <FONT color="green">1105</FONT> final BigMatrix bMatrix = new BigMatrixImpl(b);<a name="line.1105"></a>
1109 <FONT color="green">1106</FONT> final BigDecimal[][] solution = ((BigMatrixImpl) (solve(bMatrix))).getDataRef();<a name="line.1106"></a>
1110 <FONT color="green">1107</FONT> final BigDecimal[] out = new BigDecimal[nRows];<a name="line.1107"></a>
1111 <FONT color="green">1108</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.1108"></a>
1112 <FONT color="green">1109</FONT> out[row] = solution[row][0];<a name="line.1109"></a>
1113 <FONT color="green">1110</FONT> }<a name="line.1110"></a>
1114 <FONT color="green">1111</FONT> return out;<a name="line.1111"></a>
1115 <FONT color="green">1112</FONT> }<a name="line.1112"></a>
1116 <FONT color="green">1113</FONT> <a name="line.1113"></a>
1117 <FONT color="green">1114</FONT> /**<a name="line.1114"></a>
1118 <FONT color="green">1115</FONT> * Returns a matrix of (column) solution vectors for linear systems with<a name="line.1115"></a>
1119 <FONT color="green">1116</FONT> * coefficient matrix = this and constant vectors = columns of<a name="line.1116"></a>
1120 <FONT color="green">1117</FONT> * &lt;code&gt;b&lt;/code&gt;.<a name="line.1117"></a>
1121 <FONT color="green">1118</FONT> *<a name="line.1118"></a>
1122 <FONT color="green">1119</FONT> * @param b array of constants forming RHS of linear systems to<a name="line.1119"></a>
1123 <FONT color="green">1120</FONT> * to solve<a name="line.1120"></a>
1124 <FONT color="green">1121</FONT> * @return solution array<a name="line.1121"></a>
1125 <FONT color="green">1122</FONT> * @throws IllegalArgumentException if this.rowDimension != row dimension<a name="line.1122"></a>
1126 <FONT color="green">1123</FONT> * @throws InvalidMatrixException if this matrix is not square or is singular<a name="line.1123"></a>
1127 <FONT color="green">1124</FONT> */<a name="line.1124"></a>
1128 <FONT color="green">1125</FONT> public BigDecimal[] solve(double[] b) throws IllegalArgumentException, InvalidMatrixException {<a name="line.1125"></a>
1129 <FONT color="green">1126</FONT> final BigDecimal bd[] = new BigDecimal[b.length];<a name="line.1126"></a>
1130 <FONT color="green">1127</FONT> for (int i = 0; i &lt; bd.length; i++) {<a name="line.1127"></a>
1131 <FONT color="green">1128</FONT> bd[i] = new BigDecimal(b[i]);<a name="line.1128"></a>
1132 <FONT color="green">1129</FONT> }<a name="line.1129"></a>
1133 <FONT color="green">1130</FONT> return solve(bd);<a name="line.1130"></a>
1134 <FONT color="green">1131</FONT> }<a name="line.1131"></a>
1135 <FONT color="green">1132</FONT> <a name="line.1132"></a>
1136 <FONT color="green">1133</FONT> /**<a name="line.1133"></a>
1137 <FONT color="green">1134</FONT> * Returns a matrix of (column) solution vectors for linear systems with<a name="line.1134"></a>
1138 <FONT color="green">1135</FONT> * coefficient matrix = this and constant vectors = columns of<a name="line.1135"></a>
1139 <FONT color="green">1136</FONT> * &lt;code&gt;b&lt;/code&gt;.<a name="line.1136"></a>
1140 <FONT color="green">1137</FONT> *<a name="line.1137"></a>
1141 <FONT color="green">1138</FONT> * @param b matrix of constant vectors forming RHS of linear systems to<a name="line.1138"></a>
1142 <FONT color="green">1139</FONT> * to solve<a name="line.1139"></a>
1143 <FONT color="green">1140</FONT> * @return matrix of solution vectors<a name="line.1140"></a>
1144 <FONT color="green">1141</FONT> * @throws IllegalArgumentException if this.rowDimension != row dimension<a name="line.1141"></a>
1145 <FONT color="green">1142</FONT> * @throws InvalidMatrixException if this matrix is not square or is singular<a name="line.1142"></a>
1146 <FONT color="green">1143</FONT> */<a name="line.1143"></a>
1147 <FONT color="green">1144</FONT> public BigMatrix solve(BigMatrix b) throws IllegalArgumentException, InvalidMatrixException {<a name="line.1144"></a>
1148 <FONT color="green">1145</FONT> if (b.getRowDimension() != getRowDimension()) {<a name="line.1145"></a>
1149 <FONT color="green">1146</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1146"></a>
1150 <FONT color="green">1147</FONT> "dimensions mismatch: got {0}x{1} but expected {2}x{3}",<a name="line.1147"></a>
1151 <FONT color="green">1148</FONT> b.getRowDimension(), b.getColumnDimension(), getRowDimension(), "n");<a name="line.1148"></a>
1152 <FONT color="green">1149</FONT> }<a name="line.1149"></a>
1153 <FONT color="green">1150</FONT> if (!isSquare()) {<a name="line.1150"></a>
1154 <FONT color="green">1151</FONT> throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());<a name="line.1151"></a>
1155 <FONT color="green">1152</FONT> }<a name="line.1152"></a>
1156 <FONT color="green">1153</FONT> if (this.isSingular()) { // side effect: compute LU decomp<a name="line.1153"></a>
1157 <FONT color="green">1154</FONT> throw new SingularMatrixException();<a name="line.1154"></a>
1158 <FONT color="green">1155</FONT> }<a name="line.1155"></a>
1159 <FONT color="green">1156</FONT> <a name="line.1156"></a>
1160 <FONT color="green">1157</FONT> final int nCol = this.getColumnDimension();<a name="line.1157"></a>
1161 <FONT color="green">1158</FONT> final int nColB = b.getColumnDimension();<a name="line.1158"></a>
1162 <FONT color="green">1159</FONT> final int nRowB = b.getRowDimension();<a name="line.1159"></a>
1163 <FONT color="green">1160</FONT> <a name="line.1160"></a>
1164 <FONT color="green">1161</FONT> // Apply permutations to b<a name="line.1161"></a>
1165 <FONT color="green">1162</FONT> final BigDecimal[][] bp = new BigDecimal[nRowB][nColB];<a name="line.1162"></a>
1166 <FONT color="green">1163</FONT> for (int row = 0; row &lt; nRowB; row++) {<a name="line.1163"></a>
1167 <FONT color="green">1164</FONT> final BigDecimal[] bpRow = bp[row];<a name="line.1164"></a>
1168 <FONT color="green">1165</FONT> for (int col = 0; col &lt; nColB; col++) {<a name="line.1165"></a>
1169 <FONT color="green">1166</FONT> bpRow[col] = b.getEntry(permutation[row], col);<a name="line.1166"></a>
1170 <FONT color="green">1167</FONT> }<a name="line.1167"></a>
1171 <FONT color="green">1168</FONT> }<a name="line.1168"></a>
1172 <FONT color="green">1169</FONT> <a name="line.1169"></a>
1173 <FONT color="green">1170</FONT> // Solve LY = b<a name="line.1170"></a>
1174 <FONT color="green">1171</FONT> for (int col = 0; col &lt; nCol; col++) {<a name="line.1171"></a>
1175 <FONT color="green">1172</FONT> for (int i = col + 1; i &lt; nCol; i++) {<a name="line.1172"></a>
1176 <FONT color="green">1173</FONT> final BigDecimal[] bpI = bp[i];<a name="line.1173"></a>
1177 <FONT color="green">1174</FONT> final BigDecimal[] luI = lu[i];<a name="line.1174"></a>
1178 <FONT color="green">1175</FONT> for (int j = 0; j &lt; nColB; j++) {<a name="line.1175"></a>
1179 <FONT color="green">1176</FONT> bpI[j] = bpI[j].subtract(bp[col][j].multiply(luI[col]));<a name="line.1176"></a>
1180 <FONT color="green">1177</FONT> }<a name="line.1177"></a>
1181 <FONT color="green">1178</FONT> }<a name="line.1178"></a>
1182 <FONT color="green">1179</FONT> }<a name="line.1179"></a>
1183 <FONT color="green">1180</FONT> <a name="line.1180"></a>
1184 <FONT color="green">1181</FONT> // Solve UX = Y<a name="line.1181"></a>
1185 <FONT color="green">1182</FONT> for (int col = nCol - 1; col &gt;= 0; col--) {<a name="line.1182"></a>
1186 <FONT color="green">1183</FONT> final BigDecimal[] bpCol = bp[col];<a name="line.1183"></a>
1187 <FONT color="green">1184</FONT> final BigDecimal luDiag = lu[col][col];<a name="line.1184"></a>
1188 <FONT color="green">1185</FONT> for (int j = 0; j &lt; nColB; j++) {<a name="line.1185"></a>
1189 <FONT color="green">1186</FONT> bpCol[j] = bpCol[j].divide(luDiag, scale, roundingMode);<a name="line.1186"></a>
1190 <FONT color="green">1187</FONT> }<a name="line.1187"></a>
1191 <FONT color="green">1188</FONT> for (int i = 0; i &lt; col; i++) {<a name="line.1188"></a>
1192 <FONT color="green">1189</FONT> final BigDecimal[] bpI = bp[i];<a name="line.1189"></a>
1193 <FONT color="green">1190</FONT> final BigDecimal[] luI = lu[i];<a name="line.1190"></a>
1194 <FONT color="green">1191</FONT> for (int j = 0; j &lt; nColB; j++) {<a name="line.1191"></a>
1195 <FONT color="green">1192</FONT> bpI[j] = bpI[j].subtract(bp[col][j].multiply(luI[col]));<a name="line.1192"></a>
1196 <FONT color="green">1193</FONT> }<a name="line.1193"></a>
1197 <FONT color="green">1194</FONT> }<a name="line.1194"></a>
1198 <FONT color="green">1195</FONT> }<a name="line.1195"></a>
1199 <FONT color="green">1196</FONT> <a name="line.1196"></a>
1200 <FONT color="green">1197</FONT> return new BigMatrixImpl(bp, false);<a name="line.1197"></a>
1201 <FONT color="green">1198</FONT> <a name="line.1198"></a>
1202 <FONT color="green">1199</FONT> }<a name="line.1199"></a>
1203 <FONT color="green">1200</FONT> <a name="line.1200"></a>
1204 <FONT color="green">1201</FONT> /**<a name="line.1201"></a>
1205 <FONT color="green">1202</FONT> * Computes a new<a name="line.1202"></a>
1206 <FONT color="green">1203</FONT> * &lt;a href="http://www.math.gatech.edu/~bourbaki/math2601/Web-notes/2num.pdf"&gt;<a name="line.1203"></a>
1207 <FONT color="green">1204</FONT> * LU decompostion&lt;/a&gt; for this matrix, storing the result for use by other methods.<a name="line.1204"></a>
1208 <FONT color="green">1205</FONT> * &lt;p&gt;<a name="line.1205"></a>
1209 <FONT color="green">1206</FONT> * &lt;strong&gt;Implementation Note&lt;/strong&gt;:&lt;br&gt;<a name="line.1206"></a>
1210 <FONT color="green">1207</FONT> * Uses &lt;a href="http://www.damtp.cam.ac.uk/user/fdl/people/sd/lectures/nummeth98/linear.htm"&gt;<a name="line.1207"></a>
1211 <FONT color="green">1208</FONT> * Crout's algortithm&lt;/a&gt;, with partial pivoting.&lt;/p&gt;<a name="line.1208"></a>
1212 <FONT color="green">1209</FONT> * &lt;p&gt;<a name="line.1209"></a>
1213 <FONT color="green">1210</FONT> * &lt;strong&gt;Usage Note&lt;/strong&gt;:&lt;br&gt;<a name="line.1210"></a>
1214 <FONT color="green">1211</FONT> * This method should rarely be invoked directly. Its only use is<a name="line.1211"></a>
1215 <FONT color="green">1212</FONT> * to force recomputation of the LU decomposition when changes have been<a name="line.1212"></a>
1216 <FONT color="green">1213</FONT> * made to the underlying data using direct array references. Changes<a name="line.1213"></a>
1217 <FONT color="green">1214</FONT> * made using setXxx methods will trigger recomputation when needed<a name="line.1214"></a>
1218 <FONT color="green">1215</FONT> * automatically.&lt;/p&gt;<a name="line.1215"></a>
1219 <FONT color="green">1216</FONT> *<a name="line.1216"></a>
1220 <FONT color="green">1217</FONT> * @throws InvalidMatrixException if the matrix is non-square or singular.<a name="line.1217"></a>
1221 <FONT color="green">1218</FONT> */<a name="line.1218"></a>
1222 <FONT color="green">1219</FONT> public void luDecompose() throws InvalidMatrixException {<a name="line.1219"></a>
1223 <FONT color="green">1220</FONT> <a name="line.1220"></a>
1224 <FONT color="green">1221</FONT> final int nRows = this.getRowDimension();<a name="line.1221"></a>
1225 <FONT color="green">1222</FONT> final int nCols = this.getColumnDimension();<a name="line.1222"></a>
1226 <FONT color="green">1223</FONT> if (nRows != nCols) {<a name="line.1223"></a>
1227 <FONT color="green">1224</FONT> throw new NonSquareMatrixException(getRowDimension(), getColumnDimension());<a name="line.1224"></a>
1228 <FONT color="green">1225</FONT> }<a name="line.1225"></a>
1229 <FONT color="green">1226</FONT> lu = this.getData();<a name="line.1226"></a>
1230 <FONT color="green">1227</FONT> <a name="line.1227"></a>
1231 <FONT color="green">1228</FONT> // Initialize permutation array and parity<a name="line.1228"></a>
1232 <FONT color="green">1229</FONT> permutation = new int[nRows];<a name="line.1229"></a>
1233 <FONT color="green">1230</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.1230"></a>
1234 <FONT color="green">1231</FONT> permutation[row] = row;<a name="line.1231"></a>
1235 <FONT color="green">1232</FONT> }<a name="line.1232"></a>
1236 <FONT color="green">1233</FONT> parity = 1;<a name="line.1233"></a>
1237 <FONT color="green">1234</FONT> <a name="line.1234"></a>
1238 <FONT color="green">1235</FONT> // Loop over columns<a name="line.1235"></a>
1239 <FONT color="green">1236</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.1236"></a>
1240 <FONT color="green">1237</FONT> <a name="line.1237"></a>
1241 <FONT color="green">1238</FONT> BigDecimal sum = ZERO;<a name="line.1238"></a>
1242 <FONT color="green">1239</FONT> <a name="line.1239"></a>
1243 <FONT color="green">1240</FONT> // upper<a name="line.1240"></a>
1244 <FONT color="green">1241</FONT> for (int row = 0; row &lt; col; row++) {<a name="line.1241"></a>
1245 <FONT color="green">1242</FONT> final BigDecimal[] luRow = lu[row];<a name="line.1242"></a>
1246 <FONT color="green">1243</FONT> sum = luRow[col];<a name="line.1243"></a>
1247 <FONT color="green">1244</FONT> for (int i = 0; i &lt; row; i++) {<a name="line.1244"></a>
1248 <FONT color="green">1245</FONT> sum = sum.subtract(luRow[i].multiply(lu[i][col]));<a name="line.1245"></a>
1249 <FONT color="green">1246</FONT> }<a name="line.1246"></a>
1250 <FONT color="green">1247</FONT> luRow[col] = sum;<a name="line.1247"></a>
1251 <FONT color="green">1248</FONT> }<a name="line.1248"></a>
1252 <FONT color="green">1249</FONT> <a name="line.1249"></a>
1253 <FONT color="green">1250</FONT> // lower<a name="line.1250"></a>
1254 <FONT color="green">1251</FONT> int max = col; // permutation row<a name="line.1251"></a>
1255 <FONT color="green">1252</FONT> BigDecimal largest = ZERO;<a name="line.1252"></a>
1256 <FONT color="green">1253</FONT> for (int row = col; row &lt; nRows; row++) {<a name="line.1253"></a>
1257 <FONT color="green">1254</FONT> final BigDecimal[] luRow = lu[row];<a name="line.1254"></a>
1258 <FONT color="green">1255</FONT> sum = luRow[col];<a name="line.1255"></a>
1259 <FONT color="green">1256</FONT> for (int i = 0; i &lt; col; i++) {<a name="line.1256"></a>
1260 <FONT color="green">1257</FONT> sum = sum.subtract(luRow[i].multiply(lu[i][col]));<a name="line.1257"></a>
1261 <FONT color="green">1258</FONT> }<a name="line.1258"></a>
1262 <FONT color="green">1259</FONT> luRow[col] = sum;<a name="line.1259"></a>
1263 <FONT color="green">1260</FONT> <a name="line.1260"></a>
1264 <FONT color="green">1261</FONT> // maintain best permutation choice<a name="line.1261"></a>
1265 <FONT color="green">1262</FONT> if (sum.abs().compareTo(largest) == 1) {<a name="line.1262"></a>
1266 <FONT color="green">1263</FONT> largest = sum.abs();<a name="line.1263"></a>
1267 <FONT color="green">1264</FONT> max = row;<a name="line.1264"></a>
1268 <FONT color="green">1265</FONT> }<a name="line.1265"></a>
1269 <FONT color="green">1266</FONT> }<a name="line.1266"></a>
1270 <FONT color="green">1267</FONT> <a name="line.1267"></a>
1271 <FONT color="green">1268</FONT> // Singularity check<a name="line.1268"></a>
1272 <FONT color="green">1269</FONT> if (lu[max][col].abs().compareTo(TOO_SMALL) &lt;= 0) {<a name="line.1269"></a>
1273 <FONT color="green">1270</FONT> lu = null;<a name="line.1270"></a>
1274 <FONT color="green">1271</FONT> throw new SingularMatrixException();<a name="line.1271"></a>
1275 <FONT color="green">1272</FONT> }<a name="line.1272"></a>
1276 <FONT color="green">1273</FONT> <a name="line.1273"></a>
1277 <FONT color="green">1274</FONT> // Pivot if necessary<a name="line.1274"></a>
1278 <FONT color="green">1275</FONT> if (max != col) {<a name="line.1275"></a>
1279 <FONT color="green">1276</FONT> BigDecimal tmp = ZERO;<a name="line.1276"></a>
1280 <FONT color="green">1277</FONT> for (int i = 0; i &lt; nCols; i++) {<a name="line.1277"></a>
1281 <FONT color="green">1278</FONT> tmp = lu[max][i];<a name="line.1278"></a>
1282 <FONT color="green">1279</FONT> lu[max][i] = lu[col][i];<a name="line.1279"></a>
1283 <FONT color="green">1280</FONT> lu[col][i] = tmp;<a name="line.1280"></a>
1284 <FONT color="green">1281</FONT> }<a name="line.1281"></a>
1285 <FONT color="green">1282</FONT> int temp = permutation[max];<a name="line.1282"></a>
1286 <FONT color="green">1283</FONT> permutation[max] = permutation[col];<a name="line.1283"></a>
1287 <FONT color="green">1284</FONT> permutation[col] = temp;<a name="line.1284"></a>
1288 <FONT color="green">1285</FONT> parity = -parity;<a name="line.1285"></a>
1289 <FONT color="green">1286</FONT> }<a name="line.1286"></a>
1290 <FONT color="green">1287</FONT> <a name="line.1287"></a>
1291 <FONT color="green">1288</FONT> // Divide the lower elements by the "winning" diagonal elt.<a name="line.1288"></a>
1292 <FONT color="green">1289</FONT> final BigDecimal luDiag = lu[col][col];<a name="line.1289"></a>
1293 <FONT color="green">1290</FONT> for (int row = col + 1; row &lt; nRows; row++) {<a name="line.1290"></a>
1294 <FONT color="green">1291</FONT> final BigDecimal[] luRow = lu[row];<a name="line.1291"></a>
1295 <FONT color="green">1292</FONT> luRow[col] = luRow[col].divide(luDiag, scale, roundingMode);<a name="line.1292"></a>
1296 <FONT color="green">1293</FONT> }<a name="line.1293"></a>
1297 <FONT color="green">1294</FONT> <a name="line.1294"></a>
1298 <FONT color="green">1295</FONT> }<a name="line.1295"></a>
1299 <FONT color="green">1296</FONT> <a name="line.1296"></a>
1300 <FONT color="green">1297</FONT> }<a name="line.1297"></a>
1301 <FONT color="green">1298</FONT> <a name="line.1298"></a>
1302 <FONT color="green">1299</FONT> /**<a name="line.1299"></a>
1303 <FONT color="green">1300</FONT> * Get a string representation for this matrix.<a name="line.1300"></a>
1304 <FONT color="green">1301</FONT> * @return a string representation for this matrix<a name="line.1301"></a>
1305 <FONT color="green">1302</FONT> */<a name="line.1302"></a>
1306 <FONT color="green">1303</FONT> @Override<a name="line.1303"></a>
1307 <FONT color="green">1304</FONT> public String toString() {<a name="line.1304"></a>
1308 <FONT color="green">1305</FONT> StringBuffer res = new StringBuffer();<a name="line.1305"></a>
1309 <FONT color="green">1306</FONT> res.append("BigMatrixImpl{");<a name="line.1306"></a>
1310 <FONT color="green">1307</FONT> if (data != null) {<a name="line.1307"></a>
1311 <FONT color="green">1308</FONT> for (int i = 0; i &lt; data.length; i++) {<a name="line.1308"></a>
1312 <FONT color="green">1309</FONT> if (i &gt; 0) {<a name="line.1309"></a>
1313 <FONT color="green">1310</FONT> res.append(",");<a name="line.1310"></a>
1314 <FONT color="green">1311</FONT> }<a name="line.1311"></a>
1315 <FONT color="green">1312</FONT> res.append("{");<a name="line.1312"></a>
1316 <FONT color="green">1313</FONT> for (int j = 0; j &lt; data[0].length; j++) {<a name="line.1313"></a>
1317 <FONT color="green">1314</FONT> if (j &gt; 0) {<a name="line.1314"></a>
1318 <FONT color="green">1315</FONT> res.append(",");<a name="line.1315"></a>
1319 <FONT color="green">1316</FONT> }<a name="line.1316"></a>
1320 <FONT color="green">1317</FONT> res.append(data[i][j]);<a name="line.1317"></a>
1321 <FONT color="green">1318</FONT> }<a name="line.1318"></a>
1322 <FONT color="green">1319</FONT> res.append("}");<a name="line.1319"></a>
1323 <FONT color="green">1320</FONT> }<a name="line.1320"></a>
1324 <FONT color="green">1321</FONT> }<a name="line.1321"></a>
1325 <FONT color="green">1322</FONT> res.append("}");<a name="line.1322"></a>
1326 <FONT color="green">1323</FONT> return res.toString();<a name="line.1323"></a>
1327 <FONT color="green">1324</FONT> }<a name="line.1324"></a>
1328 <FONT color="green">1325</FONT> <a name="line.1325"></a>
1329 <FONT color="green">1326</FONT> /**<a name="line.1326"></a>
1330 <FONT color="green">1327</FONT> * Returns true iff &lt;code&gt;object&lt;/code&gt; is a<a name="line.1327"></a>
1331 <FONT color="green">1328</FONT> * &lt;code&gt;BigMatrixImpl&lt;/code&gt; instance with the same dimensions as this<a name="line.1328"></a>
1332 <FONT color="green">1329</FONT> * and all corresponding matrix entries are equal. BigDecimal.equals<a name="line.1329"></a>
1333 <FONT color="green">1330</FONT> * is used to compare corresponding entries.<a name="line.1330"></a>
1334 <FONT color="green">1331</FONT> *<a name="line.1331"></a>
1335 <FONT color="green">1332</FONT> * @param object the object to test equality against.<a name="line.1332"></a>
1336 <FONT color="green">1333</FONT> * @return true if object equals this<a name="line.1333"></a>
1337 <FONT color="green">1334</FONT> */<a name="line.1334"></a>
1338 <FONT color="green">1335</FONT> @Override<a name="line.1335"></a>
1339 <FONT color="green">1336</FONT> public boolean equals(Object object) {<a name="line.1336"></a>
1340 <FONT color="green">1337</FONT> if (object == this ) {<a name="line.1337"></a>
1341 <FONT color="green">1338</FONT> return true;<a name="line.1338"></a>
1342 <FONT color="green">1339</FONT> }<a name="line.1339"></a>
1343 <FONT color="green">1340</FONT> if (object instanceof BigMatrixImpl == false) {<a name="line.1340"></a>
1344 <FONT color="green">1341</FONT> return false;<a name="line.1341"></a>
1345 <FONT color="green">1342</FONT> }<a name="line.1342"></a>
1346 <FONT color="green">1343</FONT> final BigMatrix m = (BigMatrix) object;<a name="line.1343"></a>
1347 <FONT color="green">1344</FONT> final int nRows = getRowDimension();<a name="line.1344"></a>
1348 <FONT color="green">1345</FONT> final int nCols = getColumnDimension();<a name="line.1345"></a>
1349 <FONT color="green">1346</FONT> if (m.getColumnDimension() != nCols || m.getRowDimension() != nRows) {<a name="line.1346"></a>
1350 <FONT color="green">1347</FONT> return false;<a name="line.1347"></a>
1351 <FONT color="green">1348</FONT> }<a name="line.1348"></a>
1352 <FONT color="green">1349</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.1349"></a>
1353 <FONT color="green">1350</FONT> final BigDecimal[] dataRow = data[row];<a name="line.1350"></a>
1354 <FONT color="green">1351</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.1351"></a>
1355 <FONT color="green">1352</FONT> if (!dataRow[col].equals(m.getEntry(row, col))) {<a name="line.1352"></a>
1356 <FONT color="green">1353</FONT> return false;<a name="line.1353"></a>
1357 <FONT color="green">1354</FONT> }<a name="line.1354"></a>
1358 <FONT color="green">1355</FONT> }<a name="line.1355"></a>
1359 <FONT color="green">1356</FONT> }<a name="line.1356"></a>
1360 <FONT color="green">1357</FONT> return true;<a name="line.1357"></a>
1361 <FONT color="green">1358</FONT> }<a name="line.1358"></a>
1362 <FONT color="green">1359</FONT> <a name="line.1359"></a>
1363 <FONT color="green">1360</FONT> /**<a name="line.1360"></a>
1364 <FONT color="green">1361</FONT> * Computes a hashcode for the matrix.<a name="line.1361"></a>
1365 <FONT color="green">1362</FONT> *<a name="line.1362"></a>
1366 <FONT color="green">1363</FONT> * @return hashcode for matrix<a name="line.1363"></a>
1367 <FONT color="green">1364</FONT> */<a name="line.1364"></a>
1368 <FONT color="green">1365</FONT> @Override<a name="line.1365"></a>
1369 <FONT color="green">1366</FONT> public int hashCode() {<a name="line.1366"></a>
1370 <FONT color="green">1367</FONT> int ret = 7;<a name="line.1367"></a>
1371 <FONT color="green">1368</FONT> final int nRows = getRowDimension();<a name="line.1368"></a>
1372 <FONT color="green">1369</FONT> final int nCols = getColumnDimension();<a name="line.1369"></a>
1373 <FONT color="green">1370</FONT> ret = ret * 31 + nRows;<a name="line.1370"></a>
1374 <FONT color="green">1371</FONT> ret = ret * 31 + nCols;<a name="line.1371"></a>
1375 <FONT color="green">1372</FONT> for (int row = 0; row &lt; nRows; row++) {<a name="line.1372"></a>
1376 <FONT color="green">1373</FONT> final BigDecimal[] dataRow = data[row];<a name="line.1373"></a>
1377 <FONT color="green">1374</FONT> for (int col = 0; col &lt; nCols; col++) {<a name="line.1374"></a>
1378 <FONT color="green">1375</FONT> ret = ret * 31 + (11 * (row+1) + 17 * (col+1)) *<a name="line.1375"></a>
1379 <FONT color="green">1376</FONT> dataRow[col].hashCode();<a name="line.1376"></a>
1380 <FONT color="green">1377</FONT> }<a name="line.1377"></a>
1381 <FONT color="green">1378</FONT> }<a name="line.1378"></a>
1382 <FONT color="green">1379</FONT> return ret;<a name="line.1379"></a>
1383 <FONT color="green">1380</FONT> }<a name="line.1380"></a>
1384 <FONT color="green">1381</FONT> <a name="line.1381"></a>
1385 <FONT color="green">1382</FONT> //------------------------ Protected methods<a name="line.1382"></a>
1386 <FONT color="green">1383</FONT> <a name="line.1383"></a>
1387 <FONT color="green">1384</FONT> /**<a name="line.1384"></a>
1388 <FONT color="green">1385</FONT> * Returns the LU decomposition as a BigMatrix.<a name="line.1385"></a>
1389 <FONT color="green">1386</FONT> * Returns a fresh copy of the cached LU matrix if this has been computed;<a name="line.1386"></a>
1390 <FONT color="green">1387</FONT> * otherwise the composition is computed and cached for use by other methods.<a name="line.1387"></a>
1391 <FONT color="green">1388</FONT> * Since a copy is returned in either case, changes to the returned matrix do not<a name="line.1388"></a>
1392 <FONT color="green">1389</FONT> * affect the LU decomposition property.<a name="line.1389"></a>
1393 <FONT color="green">1390</FONT> * &lt;p&gt;<a name="line.1390"></a>
1394 <FONT color="green">1391</FONT> * The matrix returned is a compact representation of the LU decomposition.<a name="line.1391"></a>
1395 <FONT color="green">1392</FONT> * Elements below the main diagonal correspond to entries of the "L" matrix;<a name="line.1392"></a>
1396 <FONT color="green">1393</FONT> * elements on and above the main diagonal correspond to entries of the "U"<a name="line.1393"></a>
1397 <FONT color="green">1394</FONT> * matrix.&lt;/p&gt;<a name="line.1394"></a>
1398 <FONT color="green">1395</FONT> * &lt;p&gt;<a name="line.1395"></a>
1399 <FONT color="green">1396</FONT> * Example: &lt;pre&gt;<a name="line.1396"></a>
1400 <FONT color="green">1397</FONT> *<a name="line.1397"></a>
1401 <FONT color="green">1398</FONT> * Returned matrix L U<a name="line.1398"></a>
1402 <FONT color="green">1399</FONT> * 2 3 1 1 0 0 2 3 1<a name="line.1399"></a>
1403 <FONT color="green">1400</FONT> * 5 4 6 5 1 0 0 4 6<a name="line.1400"></a>
1404 <FONT color="green">1401</FONT> * 1 7 8 1 7 1 0 0 8<a name="line.1401"></a>
1405 <FONT color="green">1402</FONT> * &lt;/pre&gt;<a name="line.1402"></a>
1406 <FONT color="green">1403</FONT> *<a name="line.1403"></a>
1407 <FONT color="green">1404</FONT> * The L and U matrices satisfy the matrix equation LU = permuteRows(this), &lt;br&gt;<a name="line.1404"></a>
1408 <FONT color="green">1405</FONT> * where permuteRows reorders the rows of the matrix to follow the order determined<a name="line.1405"></a>
1409 <FONT color="green">1406</FONT> * by the &lt;a href=#getPermutation()&gt;permutation&lt;/a&gt; property.&lt;/p&gt;<a name="line.1406"></a>
1410 <FONT color="green">1407</FONT> *<a name="line.1407"></a>
1411 <FONT color="green">1408</FONT> * @return LU decomposition matrix<a name="line.1408"></a>
1412 <FONT color="green">1409</FONT> * @throws InvalidMatrixException if the matrix is non-square or singular.<a name="line.1409"></a>
1413 <FONT color="green">1410</FONT> */<a name="line.1410"></a>
1414 <FONT color="green">1411</FONT> protected BigMatrix getLUMatrix() throws InvalidMatrixException {<a name="line.1411"></a>
1415 <FONT color="green">1412</FONT> if (lu == null) {<a name="line.1412"></a>
1416 <FONT color="green">1413</FONT> luDecompose();<a name="line.1413"></a>
1417 <FONT color="green">1414</FONT> }<a name="line.1414"></a>
1418 <FONT color="green">1415</FONT> return new BigMatrixImpl(lu);<a name="line.1415"></a>
1419 <FONT color="green">1416</FONT> }<a name="line.1416"></a>
1420 <FONT color="green">1417</FONT> <a name="line.1417"></a>
1421 <FONT color="green">1418</FONT> /**<a name="line.1418"></a>
1422 <FONT color="green">1419</FONT> * Returns the permutation associated with the lu decomposition.<a name="line.1419"></a>
1423 <FONT color="green">1420</FONT> * The entries of the array represent a permutation of the numbers 0, ... , nRows - 1.<a name="line.1420"></a>
1424 <FONT color="green">1421</FONT> * &lt;p&gt;<a name="line.1421"></a>
1425 <FONT color="green">1422</FONT> * Example:<a name="line.1422"></a>
1426 <FONT color="green">1423</FONT> * permutation = [1, 2, 0] means current 2nd row is first, current third row is second<a name="line.1423"></a>
1427 <FONT color="green">1424</FONT> * and current first row is last.&lt;/p&gt;<a name="line.1424"></a>
1428 <FONT color="green">1425</FONT> * &lt;p&gt;<a name="line.1425"></a>
1429 <FONT color="green">1426</FONT> * Returns a fresh copy of the array.&lt;/p&gt;<a name="line.1426"></a>
1430 <FONT color="green">1427</FONT> *<a name="line.1427"></a>
1431 <FONT color="green">1428</FONT> * @return the permutation<a name="line.1428"></a>
1432 <FONT color="green">1429</FONT> */<a name="line.1429"></a>
1433 <FONT color="green">1430</FONT> protected int[] getPermutation() {<a name="line.1430"></a>
1434 <FONT color="green">1431</FONT> final int[] out = new int[permutation.length];<a name="line.1431"></a>
1435 <FONT color="green">1432</FONT> System.arraycopy(permutation, 0, out, 0, permutation.length);<a name="line.1432"></a>
1436 <FONT color="green">1433</FONT> return out;<a name="line.1433"></a>
1437 <FONT color="green">1434</FONT> }<a name="line.1434"></a>
1438 <FONT color="green">1435</FONT> <a name="line.1435"></a>
1439 <FONT color="green">1436</FONT> //------------------------ Private methods<a name="line.1436"></a>
1440 <FONT color="green">1437</FONT> <a name="line.1437"></a>
1441 <FONT color="green">1438</FONT> /**<a name="line.1438"></a>
1442 <FONT color="green">1439</FONT> * Returns a fresh copy of the underlying data array.<a name="line.1439"></a>
1443 <FONT color="green">1440</FONT> *<a name="line.1440"></a>
1444 <FONT color="green">1441</FONT> * @return a copy of the underlying data array.<a name="line.1441"></a>
1445 <FONT color="green">1442</FONT> */<a name="line.1442"></a>
1446 <FONT color="green">1443</FONT> private BigDecimal[][] copyOut() {<a name="line.1443"></a>
1447 <FONT color="green">1444</FONT> final int nRows = this.getRowDimension();<a name="line.1444"></a>
1448 <FONT color="green">1445</FONT> final BigDecimal[][] out = new BigDecimal[nRows][this.getColumnDimension()];<a name="line.1445"></a>
1449 <FONT color="green">1446</FONT> // can't copy 2-d array in one shot, otherwise get row references<a name="line.1446"></a>
1450 <FONT color="green">1447</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.1447"></a>
1451 <FONT color="green">1448</FONT> System.arraycopy(data[i], 0, out[i], 0, data[i].length);<a name="line.1448"></a>
1452 <FONT color="green">1449</FONT> }<a name="line.1449"></a>
1453 <FONT color="green">1450</FONT> return out;<a name="line.1450"></a>
1454 <FONT color="green">1451</FONT> }<a name="line.1451"></a>
1455 <FONT color="green">1452</FONT> <a name="line.1452"></a>
1456 <FONT color="green">1453</FONT> /**<a name="line.1453"></a>
1457 <FONT color="green">1454</FONT> * Replaces data with a fresh copy of the input array.<a name="line.1454"></a>
1458 <FONT color="green">1455</FONT> * &lt;p&gt;<a name="line.1455"></a>
1459 <FONT color="green">1456</FONT> * Verifies that the input array is rectangular and non-empty.&lt;/p&gt;<a name="line.1456"></a>
1460 <FONT color="green">1457</FONT> *<a name="line.1457"></a>
1461 <FONT color="green">1458</FONT> * @param in data to copy in<a name="line.1458"></a>
1462 <FONT color="green">1459</FONT> * @throws IllegalArgumentException if input array is emtpy or not<a name="line.1459"></a>
1463 <FONT color="green">1460</FONT> * rectangular<a name="line.1460"></a>
1464 <FONT color="green">1461</FONT> * @throws NullPointerException if input array is null<a name="line.1461"></a>
1465 <FONT color="green">1462</FONT> */<a name="line.1462"></a>
1466 <FONT color="green">1463</FONT> private void copyIn(BigDecimal[][] in) {<a name="line.1463"></a>
1467 <FONT color="green">1464</FONT> setSubMatrix(in,0,0);<a name="line.1464"></a>
1468 <FONT color="green">1465</FONT> }<a name="line.1465"></a>
1469 <FONT color="green">1466</FONT> <a name="line.1466"></a>
1470 <FONT color="green">1467</FONT> /**<a name="line.1467"></a>
1471 <FONT color="green">1468</FONT> * Replaces data with a fresh copy of the input array.<a name="line.1468"></a>
1472 <FONT color="green">1469</FONT> *<a name="line.1469"></a>
1473 <FONT color="green">1470</FONT> * @param in data to copy in<a name="line.1470"></a>
1474 <FONT color="green">1471</FONT> */<a name="line.1471"></a>
1475 <FONT color="green">1472</FONT> private void copyIn(double[][] in) {<a name="line.1472"></a>
1476 <FONT color="green">1473</FONT> final int nRows = in.length;<a name="line.1473"></a>
1477 <FONT color="green">1474</FONT> final int nCols = in[0].length;<a name="line.1474"></a>
1478 <FONT color="green">1475</FONT> data = new BigDecimal[nRows][nCols];<a name="line.1475"></a>
1479 <FONT color="green">1476</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.1476"></a>
1480 <FONT color="green">1477</FONT> final BigDecimal[] dataI = data[i];<a name="line.1477"></a>
1481 <FONT color="green">1478</FONT> final double[] inI = in[i];<a name="line.1478"></a>
1482 <FONT color="green">1479</FONT> for (int j = 0; j &lt; nCols; j++) {<a name="line.1479"></a>
1483 <FONT color="green">1480</FONT> dataI[j] = new BigDecimal(inI[j]);<a name="line.1480"></a>
1484 <FONT color="green">1481</FONT> }<a name="line.1481"></a>
1485 <FONT color="green">1482</FONT> }<a name="line.1482"></a>
1486 <FONT color="green">1483</FONT> lu = null;<a name="line.1483"></a>
1487 <FONT color="green">1484</FONT> }<a name="line.1484"></a>
1488 <FONT color="green">1485</FONT> <a name="line.1485"></a>
1489 <FONT color="green">1486</FONT> /**<a name="line.1486"></a>
1490 <FONT color="green">1487</FONT> * Replaces data with BigDecimals represented by the strings in the input<a name="line.1487"></a>
1491 <FONT color="green">1488</FONT> * array.<a name="line.1488"></a>
1492 <FONT color="green">1489</FONT> *<a name="line.1489"></a>
1493 <FONT color="green">1490</FONT> * @param in data to copy in<a name="line.1490"></a>
1494 <FONT color="green">1491</FONT> */<a name="line.1491"></a>
1495 <FONT color="green">1492</FONT> private void copyIn(String[][] in) {<a name="line.1492"></a>
1496 <FONT color="green">1493</FONT> final int nRows = in.length;<a name="line.1493"></a>
1497 <FONT color="green">1494</FONT> final int nCols = in[0].length;<a name="line.1494"></a>
1498 <FONT color="green">1495</FONT> data = new BigDecimal[nRows][nCols];<a name="line.1495"></a>
1499 <FONT color="green">1496</FONT> for (int i = 0; i &lt; nRows; i++) {<a name="line.1496"></a>
1500 <FONT color="green">1497</FONT> final BigDecimal[] dataI = data[i];<a name="line.1497"></a>
1501 <FONT color="green">1498</FONT> final String[] inI = in[i];<a name="line.1498"></a>
1502 <FONT color="green">1499</FONT> for (int j = 0; j &lt; nCols; j++) {<a name="line.1499"></a>
1503 <FONT color="green">1500</FONT> dataI[j] = new BigDecimal(inI[j]);<a name="line.1500"></a>
1504 <FONT color="green">1501</FONT> }<a name="line.1501"></a>
1505 <FONT color="green">1502</FONT> }<a name="line.1502"></a>
1506 <FONT color="green">1503</FONT> lu = null;<a name="line.1503"></a>
1507 <FONT color="green">1504</FONT> }<a name="line.1504"></a>
1508 <FONT color="green">1505</FONT> <a name="line.1505"></a>
1509 <FONT color="green">1506</FONT> }<a name="line.1506"></a>
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570 </PRE>
1571 </BODY>
1572 </HTML>