comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/SparseFieldMatrix.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> package org.apache.commons.math.linear;<a name="line.17"></a>
21 <FONT color="green">018</FONT> <a name="line.18"></a>
22 <FONT color="green">019</FONT> import org.apache.commons.math.Field;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import org.apache.commons.math.FieldElement;<a name="line.20"></a>
24 <FONT color="green">021</FONT> import org.apache.commons.math.util.OpenIntToFieldHashMap;<a name="line.21"></a>
25 <FONT color="green">022</FONT> <a name="line.22"></a>
26 <FONT color="green">023</FONT> /**<a name="line.23"></a>
27 <FONT color="green">024</FONT> * Sparse matrix implementation based on an open addressed map.<a name="line.24"></a>
28 <FONT color="green">025</FONT> *<a name="line.25"></a>
29 <FONT color="green">026</FONT> * @param &lt;T&gt; the type of the field elements<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 SparseFieldMatrix&lt;T extends FieldElement&lt;T&gt;&gt; extends AbstractFieldMatrix&lt;T&gt; {<a name="line.30"></a>
34 <FONT color="green">031</FONT> /**<a name="line.31"></a>
35 <FONT color="green">032</FONT> * Serial id<a name="line.32"></a>
36 <FONT color="green">033</FONT> */<a name="line.33"></a>
37 <FONT color="green">034</FONT> private static final long serialVersionUID = 9078068119297757342L;<a name="line.34"></a>
38 <FONT color="green">035</FONT> /** Storage for (sparse) matrix elements. */<a name="line.35"></a>
39 <FONT color="green">036</FONT> private final OpenIntToFieldHashMap&lt;T&gt; entries;<a name="line.36"></a>
40 <FONT color="green">037</FONT> /**<a name="line.37"></a>
41 <FONT color="green">038</FONT> * row dimension<a name="line.38"></a>
42 <FONT color="green">039</FONT> */<a name="line.39"></a>
43 <FONT color="green">040</FONT> private final int rows;<a name="line.40"></a>
44 <FONT color="green">041</FONT> /**<a name="line.41"></a>
45 <FONT color="green">042</FONT> * column dimension<a name="line.42"></a>
46 <FONT color="green">043</FONT> */<a name="line.43"></a>
47 <FONT color="green">044</FONT> private final int columns;<a name="line.44"></a>
48 <FONT color="green">045</FONT> <a name="line.45"></a>
49 <FONT color="green">046</FONT> <a name="line.46"></a>
50 <FONT color="green">047</FONT> /**<a name="line.47"></a>
51 <FONT color="green">048</FONT> * Creates a matrix with no data.<a name="line.48"></a>
52 <FONT color="green">049</FONT> * @param field field to which the elements belong<a name="line.49"></a>
53 <FONT color="green">050</FONT> */<a name="line.50"></a>
54 <FONT color="green">051</FONT> public SparseFieldMatrix(final Field&lt;T&gt; field) {<a name="line.51"></a>
55 <FONT color="green">052</FONT> super(field);<a name="line.52"></a>
56 <FONT color="green">053</FONT> rows = 0;<a name="line.53"></a>
57 <FONT color="green">054</FONT> columns= 0;<a name="line.54"></a>
58 <FONT color="green">055</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(field);<a name="line.55"></a>
59 <FONT color="green">056</FONT> }<a name="line.56"></a>
60 <FONT color="green">057</FONT> <a name="line.57"></a>
61 <FONT color="green">058</FONT> /**<a name="line.58"></a>
62 <FONT color="green">059</FONT> * Create a new SparseFieldMatrix&lt;T&gt; with the supplied row and column dimensions.<a name="line.59"></a>
63 <FONT color="green">060</FONT> *<a name="line.60"></a>
64 <FONT color="green">061</FONT> * @param field field to which the elements belong<a name="line.61"></a>
65 <FONT color="green">062</FONT> * @param rowDimension the number of rows in the new matrix<a name="line.62"></a>
66 <FONT color="green">063</FONT> * @param columnDimension the number of columns in the new matrix<a name="line.63"></a>
67 <FONT color="green">064</FONT> * @throws IllegalArgumentException if row or column dimension is not positive<a name="line.64"></a>
68 <FONT color="green">065</FONT> */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public SparseFieldMatrix(final Field&lt;T&gt; field,<a name="line.66"></a>
70 <FONT color="green">067</FONT> final int rowDimension, final int columnDimension)<a name="line.67"></a>
71 <FONT color="green">068</FONT> throws IllegalArgumentException {<a name="line.68"></a>
72 <FONT color="green">069</FONT> super(field, rowDimension, columnDimension);<a name="line.69"></a>
73 <FONT color="green">070</FONT> this.rows = rowDimension;<a name="line.70"></a>
74 <FONT color="green">071</FONT> this.columns = columnDimension;<a name="line.71"></a>
75 <FONT color="green">072</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(field);<a name="line.72"></a>
76 <FONT color="green">073</FONT> }<a name="line.73"></a>
77 <FONT color="green">074</FONT> <a name="line.74"></a>
78 <FONT color="green">075</FONT> /**<a name="line.75"></a>
79 <FONT color="green">076</FONT> * Copy constructor.<a name="line.76"></a>
80 <FONT color="green">077</FONT> * @param other The instance to copy<a name="line.77"></a>
81 <FONT color="green">078</FONT> */<a name="line.78"></a>
82 <FONT color="green">079</FONT> public SparseFieldMatrix(SparseFieldMatrix&lt;T&gt; other) {<a name="line.79"></a>
83 <FONT color="green">080</FONT> super(other.getField(), other.getRowDimension(), other.getColumnDimension());<a name="line.80"></a>
84 <FONT color="green">081</FONT> rows = other.getRowDimension();<a name="line.81"></a>
85 <FONT color="green">082</FONT> columns = other.getColumnDimension();<a name="line.82"></a>
86 <FONT color="green">083</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(other.entries);<a name="line.83"></a>
87 <FONT color="green">084</FONT> }<a name="line.84"></a>
88 <FONT color="green">085</FONT> <a name="line.85"></a>
89 <FONT color="green">086</FONT> /**<a name="line.86"></a>
90 <FONT color="green">087</FONT> * Generic copy constructor.<a name="line.87"></a>
91 <FONT color="green">088</FONT> * @param other The instance to copy<a name="line.88"></a>
92 <FONT color="green">089</FONT> */<a name="line.89"></a>
93 <FONT color="green">090</FONT> public SparseFieldMatrix(FieldMatrix&lt;T&gt; other){<a name="line.90"></a>
94 <FONT color="green">091</FONT> super(other.getField(), other.getRowDimension(), other.getColumnDimension());<a name="line.91"></a>
95 <FONT color="green">092</FONT> rows = other.getRowDimension();<a name="line.92"></a>
96 <FONT color="green">093</FONT> columns = other.getColumnDimension();<a name="line.93"></a>
97 <FONT color="green">094</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(getField());<a name="line.94"></a>
98 <FONT color="green">095</FONT> for (int i = 0; i &lt; rows; i++) {<a name="line.95"></a>
99 <FONT color="green">096</FONT> for (int j = 0; j &lt; columns; j++) {<a name="line.96"></a>
100 <FONT color="green">097</FONT> setEntry(i, j, other.getEntry(i, j));<a name="line.97"></a>
101 <FONT color="green">098</FONT> }<a name="line.98"></a>
102 <FONT color="green">099</FONT> }<a name="line.99"></a>
103 <FONT color="green">100</FONT> }<a name="line.100"></a>
104 <FONT color="green">101</FONT> <a name="line.101"></a>
105 <FONT color="green">102</FONT> /** {@inheritDoc} */<a name="line.102"></a>
106 <FONT color="green">103</FONT> @Override<a name="line.103"></a>
107 <FONT color="green">104</FONT> public void addToEntry(int row, int column, T increment)<a name="line.104"></a>
108 <FONT color="green">105</FONT> throws MatrixIndexException {<a name="line.105"></a>
109 <FONT color="green">106</FONT> checkRowIndex(row);<a name="line.106"></a>
110 <FONT color="green">107</FONT> checkColumnIndex(column);<a name="line.107"></a>
111 <FONT color="green">108</FONT> final int key = computeKey(row, column);<a name="line.108"></a>
112 <FONT color="green">109</FONT> final T value = entries.get(key).add(increment);<a name="line.109"></a>
113 <FONT color="green">110</FONT> if (getField().getZero().equals(value)) {<a name="line.110"></a>
114 <FONT color="green">111</FONT> entries.remove(key);<a name="line.111"></a>
115 <FONT color="green">112</FONT> } else {<a name="line.112"></a>
116 <FONT color="green">113</FONT> entries.put(key, 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> }<a name="line.116"></a>
120 <FONT color="green">117</FONT> <a name="line.117"></a>
121 <FONT color="green">118</FONT> /** {@inheritDoc} */<a name="line.118"></a>
122 <FONT color="green">119</FONT> @Override<a name="line.119"></a>
123 <FONT color="green">120</FONT> public FieldMatrix&lt;T&gt; copy() {<a name="line.120"></a>
124 <FONT color="green">121</FONT> return new SparseFieldMatrix&lt;T&gt;(this);<a name="line.121"></a>
125 <FONT color="green">122</FONT> }<a name="line.122"></a>
126 <FONT color="green">123</FONT> <a name="line.123"></a>
127 <FONT color="green">124</FONT> /** {@inheritDoc} */<a name="line.124"></a>
128 <FONT color="green">125</FONT> @Override<a name="line.125"></a>
129 <FONT color="green">126</FONT> public FieldMatrix&lt;T&gt; createMatrix(int rowDimension, int columnDimension)<a name="line.126"></a>
130 <FONT color="green">127</FONT> throws IllegalArgumentException {<a name="line.127"></a>
131 <FONT color="green">128</FONT> return new SparseFieldMatrix&lt;T&gt;(getField(), rowDimension, columnDimension);<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> /** {@inheritDoc} */<a name="line.131"></a>
135 <FONT color="green">132</FONT> @Override<a name="line.132"></a>
136 <FONT color="green">133</FONT> public int getColumnDimension() {<a name="line.133"></a>
137 <FONT color="green">134</FONT> return columns;<a name="line.134"></a>
138 <FONT color="green">135</FONT> }<a name="line.135"></a>
139 <FONT color="green">136</FONT> <a name="line.136"></a>
140 <FONT color="green">137</FONT> /** {@inheritDoc} */<a name="line.137"></a>
141 <FONT color="green">138</FONT> @Override<a name="line.138"></a>
142 <FONT color="green">139</FONT> public T getEntry(int row, int column) throws MatrixIndexException {<a name="line.139"></a>
143 <FONT color="green">140</FONT> checkRowIndex(row);<a name="line.140"></a>
144 <FONT color="green">141</FONT> checkColumnIndex(column);<a name="line.141"></a>
145 <FONT color="green">142</FONT> return entries.get(computeKey(row, column));<a name="line.142"></a>
146 <FONT color="green">143</FONT> }<a name="line.143"></a>
147 <FONT color="green">144</FONT> <a name="line.144"></a>
148 <FONT color="green">145</FONT> /** {@inheritDoc} */<a name="line.145"></a>
149 <FONT color="green">146</FONT> @Override<a name="line.146"></a>
150 <FONT color="green">147</FONT> public int getRowDimension() {<a name="line.147"></a>
151 <FONT color="green">148</FONT> return rows;<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> /** {@inheritDoc} */<a name="line.151"></a>
155 <FONT color="green">152</FONT> @Override<a name="line.152"></a>
156 <FONT color="green">153</FONT> public void multiplyEntry(int row, int column, T factor)<a name="line.153"></a>
157 <FONT color="green">154</FONT> throws MatrixIndexException {<a name="line.154"></a>
158 <FONT color="green">155</FONT> checkRowIndex(row);<a name="line.155"></a>
159 <FONT color="green">156</FONT> checkColumnIndex(column);<a name="line.156"></a>
160 <FONT color="green">157</FONT> final int key = computeKey(row, column);<a name="line.157"></a>
161 <FONT color="green">158</FONT> final T value = entries.get(key).multiply(factor);<a name="line.158"></a>
162 <FONT color="green">159</FONT> if (getField().getZero().equals(value)) {<a name="line.159"></a>
163 <FONT color="green">160</FONT> entries.remove(key);<a name="line.160"></a>
164 <FONT color="green">161</FONT> } else {<a name="line.161"></a>
165 <FONT color="green">162</FONT> entries.put(key, value);<a name="line.162"></a>
166 <FONT color="green">163</FONT> }<a name="line.163"></a>
167 <FONT color="green">164</FONT> <a name="line.164"></a>
168 <FONT color="green">165</FONT> }<a name="line.165"></a>
169 <FONT color="green">166</FONT> <a name="line.166"></a>
170 <FONT color="green">167</FONT> /** {@inheritDoc} */<a name="line.167"></a>
171 <FONT color="green">168</FONT> @Override<a name="line.168"></a>
172 <FONT color="green">169</FONT> public void setEntry(int row, int column, T value)<a name="line.169"></a>
173 <FONT color="green">170</FONT> throws MatrixIndexException {<a name="line.170"></a>
174 <FONT color="green">171</FONT> checkRowIndex(row);<a name="line.171"></a>
175 <FONT color="green">172</FONT> checkColumnIndex(column);<a name="line.172"></a>
176 <FONT color="green">173</FONT> if (getField().getZero().equals(value)) {<a name="line.173"></a>
177 <FONT color="green">174</FONT> entries.remove(computeKey(row, column));<a name="line.174"></a>
178 <FONT color="green">175</FONT> } else {<a name="line.175"></a>
179 <FONT color="green">176</FONT> entries.put(computeKey(row, column), value);<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> }<a name="line.179"></a>
183 <FONT color="green">180</FONT> /**<a name="line.180"></a>
184 <FONT color="green">181</FONT> * Compute the key to access a matrix element<a name="line.181"></a>
185 <FONT color="green">182</FONT> * @param row row index of the matrix element<a name="line.182"></a>
186 <FONT color="green">183</FONT> * @param column column index of the matrix element<a name="line.183"></a>
187 <FONT color="green">184</FONT> * @return key within the map to access the matrix element<a name="line.184"></a>
188 <FONT color="green">185</FONT> */<a name="line.185"></a>
189 <FONT color="green">186</FONT> private int computeKey(int row, int column) {<a name="line.186"></a>
190 <FONT color="green">187</FONT> return row * columns + column;<a name="line.187"></a>
191 <FONT color="green">188</FONT> }<a name="line.188"></a>
192 <FONT color="green">189</FONT> <a name="line.189"></a>
193 <FONT color="green">190</FONT> }<a name="line.190"></a>
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254 </PRE>
255 </BODY>
256 </HTML>