comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/OpenMapRealMatrix.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> <a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.io.Serializable;<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.util.OpenIntToDoubleHashMap;<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> * Sparse matrix implementation based on an open addressed map.<a name="line.25"></a>
29 <FONT color="green">026</FONT> *<a name="line.26"></a>
30 <FONT color="green">027</FONT> * @version $Revision: 811685 $ $Date: 2009-09-05 13:36:48 -0400 (Sat, 05 Sep 2009) $<a name="line.27"></a>
31 <FONT color="green">028</FONT> * @since 2.0<a name="line.28"></a>
32 <FONT color="green">029</FONT> */<a name="line.29"></a>
33 <FONT color="green">030</FONT> public class OpenMapRealMatrix extends AbstractRealMatrix implements SparseRealMatrix, Serializable {<a name="line.30"></a>
34 <FONT color="green">031</FONT> <a name="line.31"></a>
35 <FONT color="green">032</FONT> /** Serializable version identifier. */<a name="line.32"></a>
36 <FONT color="green">033</FONT> private static final long serialVersionUID = -5962461716457143437L;<a name="line.33"></a>
37 <FONT color="green">034</FONT> <a name="line.34"></a>
38 <FONT color="green">035</FONT> /** Number of rows of the matrix. */<a name="line.35"></a>
39 <FONT color="green">036</FONT> private final int rows;<a name="line.36"></a>
40 <FONT color="green">037</FONT> <a name="line.37"></a>
41 <FONT color="green">038</FONT> /** Number of columns of the matrix. */<a name="line.38"></a>
42 <FONT color="green">039</FONT> private final int columns;<a name="line.39"></a>
43 <FONT color="green">040</FONT> <a name="line.40"></a>
44 <FONT color="green">041</FONT> /** Storage for (sparse) matrix elements. */<a name="line.41"></a>
45 <FONT color="green">042</FONT> private final OpenIntToDoubleHashMap entries;<a name="line.42"></a>
46 <FONT color="green">043</FONT> <a name="line.43"></a>
47 <FONT color="green">044</FONT> /**<a name="line.44"></a>
48 <FONT color="green">045</FONT> * Build a sparse matrix with the supplied row and column dimensions.<a name="line.45"></a>
49 <FONT color="green">046</FONT> * @param rowDimension number of rows of the matrix<a name="line.46"></a>
50 <FONT color="green">047</FONT> * @param columnDimension number of columns of the matrix<a name="line.47"></a>
51 <FONT color="green">048</FONT> */<a name="line.48"></a>
52 <FONT color="green">049</FONT> public OpenMapRealMatrix(int rowDimension, int columnDimension) {<a name="line.49"></a>
53 <FONT color="green">050</FONT> super(rowDimension, columnDimension);<a name="line.50"></a>
54 <FONT color="green">051</FONT> this.rows = rowDimension;<a name="line.51"></a>
55 <FONT color="green">052</FONT> this.columns = columnDimension;<a name="line.52"></a>
56 <FONT color="green">053</FONT> this.entries = new OpenIntToDoubleHashMap(0.0);<a name="line.53"></a>
57 <FONT color="green">054</FONT> }<a name="line.54"></a>
58 <FONT color="green">055</FONT> <a name="line.55"></a>
59 <FONT color="green">056</FONT> /**<a name="line.56"></a>
60 <FONT color="green">057</FONT> * Build a matrix by copying another one.<a name="line.57"></a>
61 <FONT color="green">058</FONT> * @param matrix matrix to copy<a name="line.58"></a>
62 <FONT color="green">059</FONT> */<a name="line.59"></a>
63 <FONT color="green">060</FONT> public OpenMapRealMatrix(OpenMapRealMatrix matrix) {<a name="line.60"></a>
64 <FONT color="green">061</FONT> this.rows = matrix.rows;<a name="line.61"></a>
65 <FONT color="green">062</FONT> this.columns = matrix.columns;<a name="line.62"></a>
66 <FONT color="green">063</FONT> this.entries = new OpenIntToDoubleHashMap(matrix.entries);<a name="line.63"></a>
67 <FONT color="green">064</FONT> }<a name="line.64"></a>
68 <FONT color="green">065</FONT> <a name="line.65"></a>
69 <FONT color="green">066</FONT> /** {@inheritDoc} */<a name="line.66"></a>
70 <FONT color="green">067</FONT> @Override<a name="line.67"></a>
71 <FONT color="green">068</FONT> public OpenMapRealMatrix copy() {<a name="line.68"></a>
72 <FONT color="green">069</FONT> return new OpenMapRealMatrix(this);<a name="line.69"></a>
73 <FONT color="green">070</FONT> }<a name="line.70"></a>
74 <FONT color="green">071</FONT> <a name="line.71"></a>
75 <FONT color="green">072</FONT> /** {@inheritDoc} */<a name="line.72"></a>
76 <FONT color="green">073</FONT> @Override<a name="line.73"></a>
77 <FONT color="green">074</FONT> public OpenMapRealMatrix createMatrix(int rowDimension, int columnDimension)<a name="line.74"></a>
78 <FONT color="green">075</FONT> throws IllegalArgumentException {<a name="line.75"></a>
79 <FONT color="green">076</FONT> return new OpenMapRealMatrix(rowDimension, columnDimension);<a name="line.76"></a>
80 <FONT color="green">077</FONT> }<a name="line.77"></a>
81 <FONT color="green">078</FONT> <a name="line.78"></a>
82 <FONT color="green">079</FONT> /** {@inheritDoc} */<a name="line.79"></a>
83 <FONT color="green">080</FONT> @Override<a name="line.80"></a>
84 <FONT color="green">081</FONT> public int getColumnDimension() {<a name="line.81"></a>
85 <FONT color="green">082</FONT> return columns;<a name="line.82"></a>
86 <FONT color="green">083</FONT> }<a name="line.83"></a>
87 <FONT color="green">084</FONT> <a name="line.84"></a>
88 <FONT color="green">085</FONT> /** {@inheritDoc} */<a name="line.85"></a>
89 <FONT color="green">086</FONT> @Override<a name="line.86"></a>
90 <FONT color="green">087</FONT> public OpenMapRealMatrix add(final RealMatrix m)<a name="line.87"></a>
91 <FONT color="green">088</FONT> throws IllegalArgumentException {<a name="line.88"></a>
92 <FONT color="green">089</FONT> try {<a name="line.89"></a>
93 <FONT color="green">090</FONT> return add((OpenMapRealMatrix) m);<a name="line.90"></a>
94 <FONT color="green">091</FONT> } catch (ClassCastException cce) {<a name="line.91"></a>
95 <FONT color="green">092</FONT> return (OpenMapRealMatrix) super.add(m);<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> /**<a name="line.96"></a>
100 <FONT color="green">097</FONT> * Compute the sum of this and &lt;code&gt;m&lt;/code&gt;.<a name="line.97"></a>
101 <FONT color="green">098</FONT> *<a name="line.98"></a>
102 <FONT color="green">099</FONT> * @param m matrix to be added<a name="line.99"></a>
103 <FONT color="green">100</FONT> * @return this + m<a name="line.100"></a>
104 <FONT color="green">101</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.101"></a>
105 <FONT color="green">102</FONT> */<a name="line.102"></a>
106 <FONT color="green">103</FONT> public OpenMapRealMatrix add(OpenMapRealMatrix m) throws IllegalArgumentException {<a name="line.103"></a>
107 <FONT color="green">104</FONT> <a name="line.104"></a>
108 <FONT color="green">105</FONT> // safety check<a name="line.105"></a>
109 <FONT color="green">106</FONT> MatrixUtils.checkAdditionCompatible(this, m);<a name="line.106"></a>
110 <FONT color="green">107</FONT> <a name="line.107"></a>
111 <FONT color="green">108</FONT> final OpenMapRealMatrix out = new OpenMapRealMatrix(this);<a name="line.108"></a>
112 <FONT color="green">109</FONT> for (OpenIntToDoubleHashMap.Iterator iterator = m.entries.iterator(); iterator.hasNext();) {<a name="line.109"></a>
113 <FONT color="green">110</FONT> iterator.advance();<a name="line.110"></a>
114 <FONT color="green">111</FONT> final int row = iterator.key() / columns;<a name="line.111"></a>
115 <FONT color="green">112</FONT> final int col = iterator.key() - row * columns;<a name="line.112"></a>
116 <FONT color="green">113</FONT> out.setEntry(row, col, getEntry(row, col) + iterator.value());<a name="line.113"></a>
117 <FONT color="green">114</FONT> }<a name="line.114"></a>
118 <FONT color="green">115</FONT> <a name="line.115"></a>
119 <FONT color="green">116</FONT> return out;<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> <a name="line.119"></a>
123 <FONT color="green">120</FONT> /** {@inheritDoc} */<a name="line.120"></a>
124 <FONT color="green">121</FONT> @Override<a name="line.121"></a>
125 <FONT color="green">122</FONT> public OpenMapRealMatrix subtract(final RealMatrix m)<a name="line.122"></a>
126 <FONT color="green">123</FONT> throws IllegalArgumentException {<a name="line.123"></a>
127 <FONT color="green">124</FONT> try {<a name="line.124"></a>
128 <FONT color="green">125</FONT> return subtract((OpenMapRealMatrix) m);<a name="line.125"></a>
129 <FONT color="green">126</FONT> } catch (ClassCastException cce) {<a name="line.126"></a>
130 <FONT color="green">127</FONT> return (OpenMapRealMatrix) super.subtract(m);<a name="line.127"></a>
131 <FONT color="green">128</FONT> }<a name="line.128"></a>
132 <FONT color="green">129</FONT> }<a name="line.129"></a>
133 <FONT color="green">130</FONT> <a name="line.130"></a>
134 <FONT color="green">131</FONT> /**<a name="line.131"></a>
135 <FONT color="green">132</FONT> * Compute this minus &lt;code&gt;m&lt;/code&gt;.<a name="line.132"></a>
136 <FONT color="green">133</FONT> *<a name="line.133"></a>
137 <FONT color="green">134</FONT> * @param m matrix to be subtracted<a name="line.134"></a>
138 <FONT color="green">135</FONT> * @return this - m<a name="line.135"></a>
139 <FONT color="green">136</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.136"></a>
140 <FONT color="green">137</FONT> */<a name="line.137"></a>
141 <FONT color="green">138</FONT> public OpenMapRealMatrix subtract(OpenMapRealMatrix m) throws IllegalArgumentException {<a name="line.138"></a>
142 <FONT color="green">139</FONT> <a name="line.139"></a>
143 <FONT color="green">140</FONT> // safety check<a name="line.140"></a>
144 <FONT color="green">141</FONT> MatrixUtils.checkAdditionCompatible(this, m);<a name="line.141"></a>
145 <FONT color="green">142</FONT> <a name="line.142"></a>
146 <FONT color="green">143</FONT> final OpenMapRealMatrix out = new OpenMapRealMatrix(this);<a name="line.143"></a>
147 <FONT color="green">144</FONT> for (OpenIntToDoubleHashMap.Iterator iterator = m.entries.iterator(); iterator.hasNext();) {<a name="line.144"></a>
148 <FONT color="green">145</FONT> iterator.advance();<a name="line.145"></a>
149 <FONT color="green">146</FONT> final int row = iterator.key() / columns;<a name="line.146"></a>
150 <FONT color="green">147</FONT> final int col = iterator.key() - row * columns;<a name="line.147"></a>
151 <FONT color="green">148</FONT> out.setEntry(row, col, getEntry(row, col) - iterator.value());<a name="line.148"></a>
152 <FONT color="green">149</FONT> }<a name="line.149"></a>
153 <FONT color="green">150</FONT> <a name="line.150"></a>
154 <FONT color="green">151</FONT> return out;<a name="line.151"></a>
155 <FONT color="green">152</FONT> <a name="line.152"></a>
156 <FONT color="green">153</FONT> }<a name="line.153"></a>
157 <FONT color="green">154</FONT> <a name="line.154"></a>
158 <FONT color="green">155</FONT> /** {@inheritDoc} */<a name="line.155"></a>
159 <FONT color="green">156</FONT> @Override<a name="line.156"></a>
160 <FONT color="green">157</FONT> public RealMatrix multiply(final RealMatrix m)<a name="line.157"></a>
161 <FONT color="green">158</FONT> throws IllegalArgumentException {<a name="line.158"></a>
162 <FONT color="green">159</FONT> try {<a name="line.159"></a>
163 <FONT color="green">160</FONT> return multiply((OpenMapRealMatrix) m);<a name="line.160"></a>
164 <FONT color="green">161</FONT> } catch (ClassCastException cce) {<a name="line.161"></a>
165 <FONT color="green">162</FONT> <a name="line.162"></a>
166 <FONT color="green">163</FONT> // safety check<a name="line.163"></a>
167 <FONT color="green">164</FONT> MatrixUtils.checkMultiplicationCompatible(this, m);<a name="line.164"></a>
168 <FONT color="green">165</FONT> <a name="line.165"></a>
169 <FONT color="green">166</FONT> final int outCols = m.getColumnDimension();<a name="line.166"></a>
170 <FONT color="green">167</FONT> final BlockRealMatrix out = new BlockRealMatrix(rows, outCols);<a name="line.167"></a>
171 <FONT color="green">168</FONT> for (OpenIntToDoubleHashMap.Iterator iterator = entries.iterator(); iterator.hasNext();) {<a name="line.168"></a>
172 <FONT color="green">169</FONT> iterator.advance();<a name="line.169"></a>
173 <FONT color="green">170</FONT> final double value = iterator.value();<a name="line.170"></a>
174 <FONT color="green">171</FONT> final int key = iterator.key();<a name="line.171"></a>
175 <FONT color="green">172</FONT> final int i = key / columns;<a name="line.172"></a>
176 <FONT color="green">173</FONT> final int k = key % columns;<a name="line.173"></a>
177 <FONT color="green">174</FONT> for (int j = 0; j &lt; outCols; ++j) {<a name="line.174"></a>
178 <FONT color="green">175</FONT> out.addToEntry(i, j, value * m.getEntry(k, j));<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> return out;<a name="line.179"></a>
183 <FONT color="green">180</FONT> <a name="line.180"></a>
184 <FONT color="green">181</FONT> }<a name="line.181"></a>
185 <FONT color="green">182</FONT> }<a name="line.182"></a>
186 <FONT color="green">183</FONT> <a name="line.183"></a>
187 <FONT color="green">184</FONT> /**<a name="line.184"></a>
188 <FONT color="green">185</FONT> * Returns the result of postmultiplying this by m.<a name="line.185"></a>
189 <FONT color="green">186</FONT> *<a name="line.186"></a>
190 <FONT color="green">187</FONT> * @param m matrix to postmultiply by<a name="line.187"></a>
191 <FONT color="green">188</FONT> * @return this * m<a name="line.188"></a>
192 <FONT color="green">189</FONT> * @throws IllegalArgumentException<a name="line.189"></a>
193 <FONT color="green">190</FONT> * if columnDimension(this) != rowDimension(m)<a name="line.190"></a>
194 <FONT color="green">191</FONT> */<a name="line.191"></a>
195 <FONT color="green">192</FONT> public OpenMapRealMatrix multiply(OpenMapRealMatrix m) throws IllegalArgumentException {<a name="line.192"></a>
196 <FONT color="green">193</FONT> <a name="line.193"></a>
197 <FONT color="green">194</FONT> // safety check<a name="line.194"></a>
198 <FONT color="green">195</FONT> MatrixUtils.checkMultiplicationCompatible(this, m);<a name="line.195"></a>
199 <FONT color="green">196</FONT> <a name="line.196"></a>
200 <FONT color="green">197</FONT> final int outCols = m.getColumnDimension();<a name="line.197"></a>
201 <FONT color="green">198</FONT> OpenMapRealMatrix out = new OpenMapRealMatrix(rows, outCols);<a name="line.198"></a>
202 <FONT color="green">199</FONT> for (OpenIntToDoubleHashMap.Iterator iterator = entries.iterator(); iterator.hasNext();) {<a name="line.199"></a>
203 <FONT color="green">200</FONT> iterator.advance();<a name="line.200"></a>
204 <FONT color="green">201</FONT> final double value = iterator.value();<a name="line.201"></a>
205 <FONT color="green">202</FONT> final int key = iterator.key();<a name="line.202"></a>
206 <FONT color="green">203</FONT> final int i = key / columns;<a name="line.203"></a>
207 <FONT color="green">204</FONT> final int k = key % columns;<a name="line.204"></a>
208 <FONT color="green">205</FONT> for (int j = 0; j &lt; outCols; ++j) {<a name="line.205"></a>
209 <FONT color="green">206</FONT> final int rightKey = m.computeKey(k, j);<a name="line.206"></a>
210 <FONT color="green">207</FONT> if (m.entries.containsKey(rightKey)) {<a name="line.207"></a>
211 <FONT color="green">208</FONT> final int outKey = out.computeKey(i, j);<a name="line.208"></a>
212 <FONT color="green">209</FONT> final double outValue =<a name="line.209"></a>
213 <FONT color="green">210</FONT> out.entries.get(outKey) + value * m.entries.get(rightKey);<a name="line.210"></a>
214 <FONT color="green">211</FONT> if (outValue == 0.0) {<a name="line.211"></a>
215 <FONT color="green">212</FONT> out.entries.remove(outKey);<a name="line.212"></a>
216 <FONT color="green">213</FONT> } else {<a name="line.213"></a>
217 <FONT color="green">214</FONT> out.entries.put(outKey, outValue);<a name="line.214"></a>
218 <FONT color="green">215</FONT> }<a name="line.215"></a>
219 <FONT color="green">216</FONT> }<a name="line.216"></a>
220 <FONT color="green">217</FONT> }<a name="line.217"></a>
221 <FONT color="green">218</FONT> }<a name="line.218"></a>
222 <FONT color="green">219</FONT> <a name="line.219"></a>
223 <FONT color="green">220</FONT> return out;<a name="line.220"></a>
224 <FONT color="green">221</FONT> <a name="line.221"></a>
225 <FONT color="green">222</FONT> }<a name="line.222"></a>
226 <FONT color="green">223</FONT> <a name="line.223"></a>
227 <FONT color="green">224</FONT> /** {@inheritDoc} */<a name="line.224"></a>
228 <FONT color="green">225</FONT> @Override<a name="line.225"></a>
229 <FONT color="green">226</FONT> public double getEntry(int row, int column) throws MatrixIndexException {<a name="line.226"></a>
230 <FONT color="green">227</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.227"></a>
231 <FONT color="green">228</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.228"></a>
232 <FONT color="green">229</FONT> return entries.get(computeKey(row, column));<a name="line.229"></a>
233 <FONT color="green">230</FONT> }<a name="line.230"></a>
234 <FONT color="green">231</FONT> <a name="line.231"></a>
235 <FONT color="green">232</FONT> /** {@inheritDoc} */<a name="line.232"></a>
236 <FONT color="green">233</FONT> @Override<a name="line.233"></a>
237 <FONT color="green">234</FONT> public int getRowDimension() {<a name="line.234"></a>
238 <FONT color="green">235</FONT> return rows;<a name="line.235"></a>
239 <FONT color="green">236</FONT> }<a name="line.236"></a>
240 <FONT color="green">237</FONT> <a name="line.237"></a>
241 <FONT color="green">238</FONT> /** {@inheritDoc} */<a name="line.238"></a>
242 <FONT color="green">239</FONT> @Override<a name="line.239"></a>
243 <FONT color="green">240</FONT> public void setEntry(int row, int column, double value)<a name="line.240"></a>
244 <FONT color="green">241</FONT> throws MatrixIndexException {<a name="line.241"></a>
245 <FONT color="green">242</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.242"></a>
246 <FONT color="green">243</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.243"></a>
247 <FONT color="green">244</FONT> if (value == 0.0) {<a name="line.244"></a>
248 <FONT color="green">245</FONT> entries.remove(computeKey(row, column));<a name="line.245"></a>
249 <FONT color="green">246</FONT> } else {<a name="line.246"></a>
250 <FONT color="green">247</FONT> entries.put(computeKey(row, column), value);<a name="line.247"></a>
251 <FONT color="green">248</FONT> }<a name="line.248"></a>
252 <FONT color="green">249</FONT> }<a name="line.249"></a>
253 <FONT color="green">250</FONT> <a name="line.250"></a>
254 <FONT color="green">251</FONT> /** {@inheritDoc} */<a name="line.251"></a>
255 <FONT color="green">252</FONT> @Override<a name="line.252"></a>
256 <FONT color="green">253</FONT> public void addToEntry(int row, int column, double increment)<a name="line.253"></a>
257 <FONT color="green">254</FONT> throws MatrixIndexException {<a name="line.254"></a>
258 <FONT color="green">255</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.255"></a>
259 <FONT color="green">256</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.256"></a>
260 <FONT color="green">257</FONT> final int key = computeKey(row, column);<a name="line.257"></a>
261 <FONT color="green">258</FONT> final double value = entries.get(key) + increment;<a name="line.258"></a>
262 <FONT color="green">259</FONT> if (value == 0.0) {<a name="line.259"></a>
263 <FONT color="green">260</FONT> entries.remove(key);<a name="line.260"></a>
264 <FONT color="green">261</FONT> } else {<a name="line.261"></a>
265 <FONT color="green">262</FONT> entries.put(key, value);<a name="line.262"></a>
266 <FONT color="green">263</FONT> }<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> /** {@inheritDoc} */<a name="line.266"></a>
270 <FONT color="green">267</FONT> @Override<a name="line.267"></a>
271 <FONT color="green">268</FONT> public void multiplyEntry(int row, int column, double factor)<a name="line.268"></a>
272 <FONT color="green">269</FONT> throws MatrixIndexException {<a name="line.269"></a>
273 <FONT color="green">270</FONT> MatrixUtils.checkRowIndex(this, row);<a name="line.270"></a>
274 <FONT color="green">271</FONT> MatrixUtils.checkColumnIndex(this, column);<a name="line.271"></a>
275 <FONT color="green">272</FONT> final int key = computeKey(row, column);<a name="line.272"></a>
276 <FONT color="green">273</FONT> final double value = entries.get(key) * factor;<a name="line.273"></a>
277 <FONT color="green">274</FONT> if (value == 0.0) {<a name="line.274"></a>
278 <FONT color="green">275</FONT> entries.remove(key);<a name="line.275"></a>
279 <FONT color="green">276</FONT> } else {<a name="line.276"></a>
280 <FONT color="green">277</FONT> entries.put(key, value);<a name="line.277"></a>
281 <FONT color="green">278</FONT> }<a name="line.278"></a>
282 <FONT color="green">279</FONT> }<a name="line.279"></a>
283 <FONT color="green">280</FONT> <a name="line.280"></a>
284 <FONT color="green">281</FONT> /**<a name="line.281"></a>
285 <FONT color="green">282</FONT> * Compute the key to access a matrix element<a name="line.282"></a>
286 <FONT color="green">283</FONT> * @param row row index of the matrix element<a name="line.283"></a>
287 <FONT color="green">284</FONT> * @param column column index of the matrix element<a name="line.284"></a>
288 <FONT color="green">285</FONT> * @return key within the map to access the matrix element<a name="line.285"></a>
289 <FONT color="green">286</FONT> */<a name="line.286"></a>
290 <FONT color="green">287</FONT> private int computeKey(int row, int column) {<a name="line.287"></a>
291 <FONT color="green">288</FONT> return row * columns + column;<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> <a name="line.291"></a>
295 <FONT color="green">292</FONT> }<a name="line.292"></a>
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356 </PRE>
357 </BODY>
358 </HTML>