comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/SparseFieldVector.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 java.io.Serializable;<a name="line.19"></a>
23 <FONT color="green">020</FONT> import java.lang.reflect.Array;<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.Field;<a name="line.22"></a>
26 <FONT color="green">023</FONT> import org.apache.commons.math.FieldElement;<a name="line.23"></a>
27 <FONT color="green">024</FONT> import org.apache.commons.math.MathRuntimeException;<a name="line.24"></a>
28 <FONT color="green">025</FONT> import org.apache.commons.math.util.OpenIntToFieldHashMap;<a name="line.25"></a>
29 <FONT color="green">026</FONT> <a name="line.26"></a>
30 <FONT color="green">027</FONT> /**<a name="line.27"></a>
31 <FONT color="green">028</FONT> * This class implements the {@link FieldVector} interface with a {@link OpenIntToFieldHashMap} backing store.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * @param &lt;T&gt; the type of the field elements<a name="line.29"></a>
33 <FONT color="green">030</FONT> * @version $Revision: 922714 $ $Date: 2010-03-13 20:35:14 -0500 (Sat, 13 Mar 2010) $<a name="line.30"></a>
34 <FONT color="green">031</FONT> * @since 2.0<a name="line.31"></a>
35 <FONT color="green">032</FONT> */<a name="line.32"></a>
36 <FONT color="green">033</FONT> public class SparseFieldVector&lt;T extends FieldElement&lt;T&gt;&gt; implements FieldVector&lt;T&gt;, Serializable {<a name="line.33"></a>
37 <FONT color="green">034</FONT> <a name="line.34"></a>
38 <FONT color="green">035</FONT> /**<a name="line.35"></a>
39 <FONT color="green">036</FONT> * Serial version id<a name="line.36"></a>
40 <FONT color="green">037</FONT> */<a name="line.37"></a>
41 <FONT color="green">038</FONT> private static final long serialVersionUID = 7841233292190413362L;<a name="line.38"></a>
42 <FONT color="green">039</FONT> /** Field to which the elements belong. */<a name="line.39"></a>
43 <FONT color="green">040</FONT> private final Field&lt;T&gt; field;<a name="line.40"></a>
44 <FONT color="green">041</FONT> /** Entries of the vector. */<a name="line.41"></a>
45 <FONT color="green">042</FONT> private final OpenIntToFieldHashMap&lt;T&gt; entries;<a name="line.42"></a>
46 <FONT color="green">043</FONT> /** Dimension of the vector. */<a name="line.43"></a>
47 <FONT color="green">044</FONT> private final int virtualSize;<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> * Build a 0-length vector.<a name="line.47"></a>
51 <FONT color="green">048</FONT> * &lt;p&gt;Zero-length vectors may be used to initialize construction of vectors<a name="line.48"></a>
52 <FONT color="green">049</FONT> * by data gathering. We start with zero-length and use either the {@link<a name="line.49"></a>
53 <FONT color="green">050</FONT> * #SparseFieldVector(SparseFieldVector, int)} constructor<a name="line.50"></a>
54 <FONT color="green">051</FONT> * or one of the &lt;code&gt;append&lt;/code&gt; method ({@link #append(FieldElement)},<a name="line.51"></a>
55 <FONT color="green">052</FONT> * {@link #append(FieldElement[])}, {@link #append(FieldVector)},<a name="line.52"></a>
56 <FONT color="green">053</FONT> * {@link #append(SparseFieldVector)}) to gather data into this vector.&lt;/p&gt;<a name="line.53"></a>
57 <FONT color="green">054</FONT> * @param field field to which the elements belong<a name="line.54"></a>
58 <FONT color="green">055</FONT> */<a name="line.55"></a>
59 <FONT color="green">056</FONT> public SparseFieldVector(Field&lt;T&gt; field) {<a name="line.56"></a>
60 <FONT color="green">057</FONT> this(field, 0);<a name="line.57"></a>
61 <FONT color="green">058</FONT> }<a name="line.58"></a>
62 <FONT color="green">059</FONT> <a name="line.59"></a>
63 <FONT color="green">060</FONT> <a name="line.60"></a>
64 <FONT color="green">061</FONT> /**<a name="line.61"></a>
65 <FONT color="green">062</FONT> * Construct a (dimension)-length vector of zeros.<a name="line.62"></a>
66 <FONT color="green">063</FONT> * @param field field to which the elements belong<a name="line.63"></a>
67 <FONT color="green">064</FONT> * @param dimension Size of the vector<a name="line.64"></a>
68 <FONT color="green">065</FONT> */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public SparseFieldVector(Field&lt;T&gt; field, int dimension) {<a name="line.66"></a>
70 <FONT color="green">067</FONT> this.field = field;<a name="line.67"></a>
71 <FONT color="green">068</FONT> virtualSize = dimension;<a name="line.68"></a>
72 <FONT color="green">069</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(field);<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> /**<a name="line.72"></a>
76 <FONT color="green">073</FONT> * Build a resized vector, for use with append.<a name="line.73"></a>
77 <FONT color="green">074</FONT> * @param v The original vector<a name="line.74"></a>
78 <FONT color="green">075</FONT> * @param resize The amount to resize it<a name="line.75"></a>
79 <FONT color="green">076</FONT> */<a name="line.76"></a>
80 <FONT color="green">077</FONT> protected SparseFieldVector(SparseFieldVector&lt;T&gt; v, int resize) {<a name="line.77"></a>
81 <FONT color="green">078</FONT> field = v.field;<a name="line.78"></a>
82 <FONT color="green">079</FONT> virtualSize = v.getDimension() + resize;<a name="line.79"></a>
83 <FONT color="green">080</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(v.entries);<a name="line.80"></a>
84 <FONT color="green">081</FONT> }<a name="line.81"></a>
85 <FONT color="green">082</FONT> <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> * Build a vector with known the sparseness (for advanced use only).<a name="line.85"></a>
89 <FONT color="green">086</FONT> * @param field field to which the elements belong<a name="line.86"></a>
90 <FONT color="green">087</FONT> * @param dimension The size of the vector<a name="line.87"></a>
91 <FONT color="green">088</FONT> * @param expectedSize The expected number of non-zero entries<a name="line.88"></a>
92 <FONT color="green">089</FONT> */<a name="line.89"></a>
93 <FONT color="green">090</FONT> public SparseFieldVector(Field&lt;T&gt; field, int dimension, int expectedSize) {<a name="line.90"></a>
94 <FONT color="green">091</FONT> this.field = field;<a name="line.91"></a>
95 <FONT color="green">092</FONT> virtualSize = dimension;<a name="line.92"></a>
96 <FONT color="green">093</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(field,expectedSize);<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> * Create from a Field array.<a name="line.97"></a>
101 <FONT color="green">098</FONT> * Only non-zero entries will be stored<a name="line.98"></a>
102 <FONT color="green">099</FONT> * @param field field to which the elements belong<a name="line.99"></a>
103 <FONT color="green">100</FONT> * @param values The set of values to create from<a name="line.100"></a>
104 <FONT color="green">101</FONT> */<a name="line.101"></a>
105 <FONT color="green">102</FONT> public SparseFieldVector(Field&lt;T&gt; field, T[] values) {<a name="line.102"></a>
106 <FONT color="green">103</FONT> this.field = field;<a name="line.103"></a>
107 <FONT color="green">104</FONT> virtualSize = values.length;<a name="line.104"></a>
108 <FONT color="green">105</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(field);<a name="line.105"></a>
109 <FONT color="green">106</FONT> for (int key = 0; key &lt; values.length; key++) {<a name="line.106"></a>
110 <FONT color="green">107</FONT> T value = values[key];<a name="line.107"></a>
111 <FONT color="green">108</FONT> entries.put(key, value);<a name="line.108"></a>
112 <FONT color="green">109</FONT> }<a name="line.109"></a>
113 <FONT color="green">110</FONT> }<a name="line.110"></a>
114 <FONT color="green">111</FONT> <a name="line.111"></a>
115 <FONT color="green">112</FONT> <a name="line.112"></a>
116 <FONT color="green">113</FONT> <a name="line.113"></a>
117 <FONT color="green">114</FONT> /**<a name="line.114"></a>
118 <FONT color="green">115</FONT> * Copy constructor.<a name="line.115"></a>
119 <FONT color="green">116</FONT> * @param v The instance to copy from<a name="line.116"></a>
120 <FONT color="green">117</FONT> */<a name="line.117"></a>
121 <FONT color="green">118</FONT> public SparseFieldVector(SparseFieldVector&lt;T&gt; v) {<a name="line.118"></a>
122 <FONT color="green">119</FONT> field = v.field;<a name="line.119"></a>
123 <FONT color="green">120</FONT> virtualSize = v.getDimension();<a name="line.120"></a>
124 <FONT color="green">121</FONT> entries = new OpenIntToFieldHashMap&lt;T&gt;(v.getEntries());<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> /**<a name="line.124"></a>
128 <FONT color="green">125</FONT> * Get the entries of this instance.<a name="line.125"></a>
129 <FONT color="green">126</FONT> * @return entries of this instance<a name="line.126"></a>
130 <FONT color="green">127</FONT> */<a name="line.127"></a>
131 <FONT color="green">128</FONT> private OpenIntToFieldHashMap&lt;T&gt; getEntries() {<a name="line.128"></a>
132 <FONT color="green">129</FONT> return entries;<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> /**<a name="line.132"></a>
136 <FONT color="green">133</FONT> * Optimized method to add sparse vectors.<a name="line.133"></a>
137 <FONT color="green">134</FONT> * @param v vector to add<a name="line.134"></a>
138 <FONT color="green">135</FONT> * @return The sum of &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;<a name="line.135"></a>
139 <FONT color="green">136</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.136"></a>
140 <FONT color="green">137</FONT> */<a name="line.137"></a>
141 <FONT color="green">138</FONT> public FieldVector&lt;T&gt; add(SparseFieldVector&lt;T&gt; v) throws IllegalArgumentException {<a name="line.138"></a>
142 <FONT color="green">139</FONT> checkVectorDimensions(v.getDimension());<a name="line.139"></a>
143 <FONT color="green">140</FONT> SparseFieldVector&lt;T&gt; res = (SparseFieldVector&lt;T&gt;)copy();<a name="line.140"></a>
144 <FONT color="green">141</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = v.getEntries().iterator();<a name="line.141"></a>
145 <FONT color="green">142</FONT> while (iter.hasNext()) {<a name="line.142"></a>
146 <FONT color="green">143</FONT> iter.advance();<a name="line.143"></a>
147 <FONT color="green">144</FONT> int key = iter.key();<a name="line.144"></a>
148 <FONT color="green">145</FONT> T value = iter.value();<a name="line.145"></a>
149 <FONT color="green">146</FONT> if (entries.containsKey(key)) {<a name="line.146"></a>
150 <FONT color="green">147</FONT> res.setEntry(key, entries.get(key).add(value));<a name="line.147"></a>
151 <FONT color="green">148</FONT> } else {<a name="line.148"></a>
152 <FONT color="green">149</FONT> res.setEntry(key, value);<a name="line.149"></a>
153 <FONT color="green">150</FONT> }<a name="line.150"></a>
154 <FONT color="green">151</FONT> }<a name="line.151"></a>
155 <FONT color="green">152</FONT> return res;<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> <a name="line.155"></a>
159 <FONT color="green">156</FONT> <a name="line.156"></a>
160 <FONT color="green">157</FONT> /** {@inheritDoc} */<a name="line.157"></a>
161 <FONT color="green">158</FONT> public FieldVector&lt;T&gt; add(T[] v) throws IllegalArgumentException {<a name="line.158"></a>
162 <FONT color="green">159</FONT> checkVectorDimensions(v.length);<a name="line.159"></a>
163 <FONT color="green">160</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(field,getDimension());<a name="line.160"></a>
164 <FONT color="green">161</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.161"></a>
165 <FONT color="green">162</FONT> res.setEntry(i, v[i].add(getEntry(i)));<a name="line.162"></a>
166 <FONT color="green">163</FONT> }<a name="line.163"></a>
167 <FONT color="green">164</FONT> return res;<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> /**<a name="line.167"></a>
171 <FONT color="green">168</FONT> * Construct a vector by appending a vector to this vector.<a name="line.168"></a>
172 <FONT color="green">169</FONT> * @param v vector to append to this one.<a name="line.169"></a>
173 <FONT color="green">170</FONT> * @return a new vector<a name="line.170"></a>
174 <FONT color="green">171</FONT> */<a name="line.171"></a>
175 <FONT color="green">172</FONT> public FieldVector&lt;T&gt; append(SparseFieldVector&lt;T&gt; v) {<a name="line.172"></a>
176 <FONT color="green">173</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this, v.getDimension());<a name="line.173"></a>
177 <FONT color="green">174</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = v.entries.iterator();<a name="line.174"></a>
178 <FONT color="green">175</FONT> while (iter.hasNext()) {<a name="line.175"></a>
179 <FONT color="green">176</FONT> iter.advance();<a name="line.176"></a>
180 <FONT color="green">177</FONT> res.setEntry(iter.key() + virtualSize, iter.value());<a name="line.177"></a>
181 <FONT color="green">178</FONT> }<a name="line.178"></a>
182 <FONT color="green">179</FONT> return res;<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> /** {@inheritDoc} */<a name="line.182"></a>
186 <FONT color="green">183</FONT> public FieldVector&lt;T&gt; append(FieldVector&lt;T&gt; v) {<a name="line.183"></a>
187 <FONT color="green">184</FONT> if (v instanceof SparseFieldVector&lt;?&gt;) {<a name="line.184"></a>
188 <FONT color="green">185</FONT> return append((SparseFieldVector&lt;T&gt;) v);<a name="line.185"></a>
189 <FONT color="green">186</FONT> } else {<a name="line.186"></a>
190 <FONT color="green">187</FONT> return append(v.toArray());<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 <FONT color="green">191</FONT> /** {@inheritDoc} */<a name="line.191"></a>
195 <FONT color="green">192</FONT> public FieldVector&lt;T&gt; append(T d) {<a name="line.192"></a>
196 <FONT color="green">193</FONT> FieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this, 1);<a name="line.193"></a>
197 <FONT color="green">194</FONT> res.setEntry(virtualSize, d);<a name="line.194"></a>
198 <FONT color="green">195</FONT> return res;<a name="line.195"></a>
199 <FONT color="green">196</FONT> }<a name="line.196"></a>
200 <FONT color="green">197</FONT> <a name="line.197"></a>
201 <FONT color="green">198</FONT> /** {@inheritDoc} */<a name="line.198"></a>
202 <FONT color="green">199</FONT> public FieldVector&lt;T&gt; append(T[] a) {<a name="line.199"></a>
203 <FONT color="green">200</FONT> FieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this, a.length);<a name="line.200"></a>
204 <FONT color="green">201</FONT> for (int i = 0; i &lt; a.length; i++) {<a name="line.201"></a>
205 <FONT color="green">202</FONT> res.setEntry(i + virtualSize, a[i]);<a name="line.202"></a>
206 <FONT color="green">203</FONT> }<a name="line.203"></a>
207 <FONT color="green">204</FONT> return res;<a name="line.204"></a>
208 <FONT color="green">205</FONT> }<a name="line.205"></a>
209 <FONT color="green">206</FONT> <a name="line.206"></a>
210 <FONT color="green">207</FONT> /** {@inheritDoc} */<a name="line.207"></a>
211 <FONT color="green">208</FONT> public FieldVector&lt;T&gt; copy() {<a name="line.208"></a>
212 <FONT color="green">209</FONT> return new SparseFieldVector&lt;T&gt;(this);<a name="line.209"></a>
213 <FONT color="green">210</FONT> }<a name="line.210"></a>
214 <FONT color="green">211</FONT> <a name="line.211"></a>
215 <FONT color="green">212</FONT> /** {@inheritDoc} */<a name="line.212"></a>
216 <FONT color="green">213</FONT> public T dotProduct(FieldVector&lt;T&gt; v) throws IllegalArgumentException {<a name="line.213"></a>
217 <FONT color="green">214</FONT> checkVectorDimensions(v.getDimension());<a name="line.214"></a>
218 <FONT color="green">215</FONT> T res = field.getZero();<a name="line.215"></a>
219 <FONT color="green">216</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.216"></a>
220 <FONT color="green">217</FONT> while (iter.hasNext()) {<a name="line.217"></a>
221 <FONT color="green">218</FONT> iter.advance();<a name="line.218"></a>
222 <FONT color="green">219</FONT> res = res.add(v.getEntry(iter.key()).multiply(iter.value()));<a name="line.219"></a>
223 <FONT color="green">220</FONT> }<a name="line.220"></a>
224 <FONT color="green">221</FONT> return res;<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> public T dotProduct(T[] v) throws IllegalArgumentException {<a name="line.225"></a>
229 <FONT color="green">226</FONT> checkVectorDimensions(v.length);<a name="line.226"></a>
230 <FONT color="green">227</FONT> T res = field.getZero();<a name="line.227"></a>
231 <FONT color="green">228</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.228"></a>
232 <FONT color="green">229</FONT> while (iter.hasNext()) {<a name="line.229"></a>
233 <FONT color="green">230</FONT> int idx = iter.key();<a name="line.230"></a>
234 <FONT color="green">231</FONT> T value = field.getZero();<a name="line.231"></a>
235 <FONT color="green">232</FONT> if (idx &lt; v.length) {<a name="line.232"></a>
236 <FONT color="green">233</FONT> value = v[idx];<a name="line.233"></a>
237 <FONT color="green">234</FONT> }<a name="line.234"></a>
238 <FONT color="green">235</FONT> res = res.add(value.multiply(iter.value()));<a name="line.235"></a>
239 <FONT color="green">236</FONT> }<a name="line.236"></a>
240 <FONT color="green">237</FONT> return res;<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> /** {@inheritDoc} */<a name="line.240"></a>
244 <FONT color="green">241</FONT> public FieldVector&lt;T&gt; ebeDivide(FieldVector&lt;T&gt; v)<a name="line.241"></a>
245 <FONT color="green">242</FONT> throws IllegalArgumentException {<a name="line.242"></a>
246 <FONT color="green">243</FONT> checkVectorDimensions(v.getDimension());<a name="line.243"></a>
247 <FONT color="green">244</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this);<a name="line.244"></a>
248 <FONT color="green">245</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = res.entries.iterator();<a name="line.245"></a>
249 <FONT color="green">246</FONT> while (iter.hasNext()) {<a name="line.246"></a>
250 <FONT color="green">247</FONT> iter.advance();<a name="line.247"></a>
251 <FONT color="green">248</FONT> res.setEntry(iter.key(), iter.value().divide(v.getEntry(iter.key())));<a name="line.248"></a>
252 <FONT color="green">249</FONT> }<a name="line.249"></a>
253 <FONT color="green">250</FONT> return res;<a name="line.250"></a>
254 <FONT color="green">251</FONT> }<a name="line.251"></a>
255 <FONT color="green">252</FONT> <a name="line.252"></a>
256 <FONT color="green">253</FONT> /** {@inheritDoc} */<a name="line.253"></a>
257 <FONT color="green">254</FONT> public FieldVector&lt;T&gt; ebeDivide(T[] v) throws IllegalArgumentException {<a name="line.254"></a>
258 <FONT color="green">255</FONT> checkVectorDimensions(v.length);<a name="line.255"></a>
259 <FONT color="green">256</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this);<a name="line.256"></a>
260 <FONT color="green">257</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = res.entries.iterator();<a name="line.257"></a>
261 <FONT color="green">258</FONT> while (iter.hasNext()) {<a name="line.258"></a>
262 <FONT color="green">259</FONT> iter.advance();<a name="line.259"></a>
263 <FONT color="green">260</FONT> res.setEntry(iter.key(), iter.value().divide(v[iter.key()]));<a name="line.260"></a>
264 <FONT color="green">261</FONT> }<a name="line.261"></a>
265 <FONT color="green">262</FONT> return res;<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> /** {@inheritDoc} */<a name="line.265"></a>
269 <FONT color="green">266</FONT> public FieldVector&lt;T&gt; ebeMultiply(FieldVector&lt;T&gt; v)throws IllegalArgumentException {<a name="line.266"></a>
270 <FONT color="green">267</FONT> checkVectorDimensions(v.getDimension());<a name="line.267"></a>
271 <FONT color="green">268</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this);<a name="line.268"></a>
272 <FONT color="green">269</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = res.entries.iterator();<a name="line.269"></a>
273 <FONT color="green">270</FONT> while (iter.hasNext()) {<a name="line.270"></a>
274 <FONT color="green">271</FONT> iter.advance();<a name="line.271"></a>
275 <FONT color="green">272</FONT> res.setEntry(iter.key(), iter.value().multiply(v.getEntry(iter.key())));<a name="line.272"></a>
276 <FONT color="green">273</FONT> }<a name="line.273"></a>
277 <FONT color="green">274</FONT> return res;<a name="line.274"></a>
278 <FONT color="green">275</FONT> }<a name="line.275"></a>
279 <FONT color="green">276</FONT> <a name="line.276"></a>
280 <FONT color="green">277</FONT> /** {@inheritDoc} */<a name="line.277"></a>
281 <FONT color="green">278</FONT> public FieldVector&lt;T&gt; ebeMultiply(T[] v) throws IllegalArgumentException {<a name="line.278"></a>
282 <FONT color="green">279</FONT> checkVectorDimensions(v.length);<a name="line.279"></a>
283 <FONT color="green">280</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this);<a name="line.280"></a>
284 <FONT color="green">281</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = res.entries.iterator();<a name="line.281"></a>
285 <FONT color="green">282</FONT> while (iter.hasNext()) {<a name="line.282"></a>
286 <FONT color="green">283</FONT> iter.advance();<a name="line.283"></a>
287 <FONT color="green">284</FONT> res.setEntry(iter.key(), iter.value().multiply(v[iter.key()]));<a name="line.284"></a>
288 <FONT color="green">285</FONT> }<a name="line.285"></a>
289 <FONT color="green">286</FONT> return res;<a name="line.286"></a>
290 <FONT color="green">287</FONT> }<a name="line.287"></a>
291 <FONT color="green">288</FONT> <a name="line.288"></a>
292 <FONT color="green">289</FONT> /** {@inheritDoc} */<a name="line.289"></a>
293 <FONT color="green">290</FONT> public T[] getData() {<a name="line.290"></a>
294 <FONT color="green">291</FONT> T[] res = buildArray(virtualSize);<a name="line.291"></a>
295 <FONT color="green">292</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.292"></a>
296 <FONT color="green">293</FONT> while (iter.hasNext()) {<a name="line.293"></a>
297 <FONT color="green">294</FONT> iter.advance();<a name="line.294"></a>
298 <FONT color="green">295</FONT> res[iter.key()] = iter.value();<a name="line.295"></a>
299 <FONT color="green">296</FONT> }<a name="line.296"></a>
300 <FONT color="green">297</FONT> return res;<a name="line.297"></a>
301 <FONT color="green">298</FONT> }<a name="line.298"></a>
302 <FONT color="green">299</FONT> <a name="line.299"></a>
303 <FONT color="green">300</FONT> /** {@inheritDoc} */<a name="line.300"></a>
304 <FONT color="green">301</FONT> public int getDimension() {<a name="line.301"></a>
305 <FONT color="green">302</FONT> return virtualSize;<a name="line.302"></a>
306 <FONT color="green">303</FONT> }<a name="line.303"></a>
307 <FONT color="green">304</FONT> <a name="line.304"></a>
308 <FONT color="green">305</FONT> /** {@inheritDoc} */<a name="line.305"></a>
309 <FONT color="green">306</FONT> public T getEntry(int index) throws MatrixIndexException {<a name="line.306"></a>
310 <FONT color="green">307</FONT> checkIndex(index);<a name="line.307"></a>
311 <FONT color="green">308</FONT> return entries.get(index);<a name="line.308"></a>
312 <FONT color="green">309</FONT> }<a name="line.309"></a>
313 <FONT color="green">310</FONT> <a name="line.310"></a>
314 <FONT color="green">311</FONT> /** {@inheritDoc} */<a name="line.311"></a>
315 <FONT color="green">312</FONT> public Field&lt;T&gt; getField() {<a name="line.312"></a>
316 <FONT color="green">313</FONT> return field;<a name="line.313"></a>
317 <FONT color="green">314</FONT> }<a name="line.314"></a>
318 <FONT color="green">315</FONT> <a name="line.315"></a>
319 <FONT color="green">316</FONT> /** {@inheritDoc} */<a name="line.316"></a>
320 <FONT color="green">317</FONT> public FieldVector&lt;T&gt; getSubVector(int index, int n)<a name="line.317"></a>
321 <FONT color="green">318</FONT> throws MatrixIndexException {<a name="line.318"></a>
322 <FONT color="green">319</FONT> checkIndex(index);<a name="line.319"></a>
323 <FONT color="green">320</FONT> checkIndex(index + n - 1);<a name="line.320"></a>
324 <FONT color="green">321</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(field,n);<a name="line.321"></a>
325 <FONT color="green">322</FONT> int end = index + n;<a name="line.322"></a>
326 <FONT color="green">323</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.323"></a>
327 <FONT color="green">324</FONT> while (iter.hasNext()) {<a name="line.324"></a>
328 <FONT color="green">325</FONT> iter.advance();<a name="line.325"></a>
329 <FONT color="green">326</FONT> int key = iter.key();<a name="line.326"></a>
330 <FONT color="green">327</FONT> if (key &gt;= index &amp;&amp; key &lt; end) {<a name="line.327"></a>
331 <FONT color="green">328</FONT> res.setEntry(key - index, iter.value());<a name="line.328"></a>
332 <FONT color="green">329</FONT> }<a name="line.329"></a>
333 <FONT color="green">330</FONT> }<a name="line.330"></a>
334 <FONT color="green">331</FONT> return res;<a name="line.331"></a>
335 <FONT color="green">332</FONT> }<a name="line.332"></a>
336 <FONT color="green">333</FONT> <a name="line.333"></a>
337 <FONT color="green">334</FONT> /** {@inheritDoc} */<a name="line.334"></a>
338 <FONT color="green">335</FONT> public FieldVector&lt;T&gt; mapAdd(T d) {<a name="line.335"></a>
339 <FONT color="green">336</FONT> return copy().mapAddToSelf(d);<a name="line.336"></a>
340 <FONT color="green">337</FONT> }<a name="line.337"></a>
341 <FONT color="green">338</FONT> <a name="line.338"></a>
342 <FONT color="green">339</FONT> /** {@inheritDoc} */<a name="line.339"></a>
343 <FONT color="green">340</FONT> public FieldVector&lt;T&gt; mapAddToSelf(T d) {<a name="line.340"></a>
344 <FONT color="green">341</FONT> for (int i = 0; i &lt; virtualSize; i++) {<a name="line.341"></a>
345 <FONT color="green">342</FONT> setEntry(i, getEntry(i).add(d));<a name="line.342"></a>
346 <FONT color="green">343</FONT> }<a name="line.343"></a>
347 <FONT color="green">344</FONT> return this;<a name="line.344"></a>
348 <FONT color="green">345</FONT> }<a name="line.345"></a>
349 <FONT color="green">346</FONT> <a name="line.346"></a>
350 <FONT color="green">347</FONT> /** {@inheritDoc} */<a name="line.347"></a>
351 <FONT color="green">348</FONT> public FieldVector&lt;T&gt; mapDivide(T d) {<a name="line.348"></a>
352 <FONT color="green">349</FONT> return copy().mapDivideToSelf(d);<a name="line.349"></a>
353 <FONT color="green">350</FONT> }<a name="line.350"></a>
354 <FONT color="green">351</FONT> <a name="line.351"></a>
355 <FONT color="green">352</FONT> /** {@inheritDoc} */<a name="line.352"></a>
356 <FONT color="green">353</FONT> public FieldVector&lt;T&gt; mapDivideToSelf(T d) {<a name="line.353"></a>
357 <FONT color="green">354</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.354"></a>
358 <FONT color="green">355</FONT> while (iter.hasNext()) {<a name="line.355"></a>
359 <FONT color="green">356</FONT> iter.advance();<a name="line.356"></a>
360 <FONT color="green">357</FONT> entries.put(iter.key(), iter.value().divide(d));<a name="line.357"></a>
361 <FONT color="green">358</FONT> }<a name="line.358"></a>
362 <FONT color="green">359</FONT> return this;<a name="line.359"></a>
363 <FONT color="green">360</FONT> }<a name="line.360"></a>
364 <FONT color="green">361</FONT> <a name="line.361"></a>
365 <FONT color="green">362</FONT> /** {@inheritDoc} */<a name="line.362"></a>
366 <FONT color="green">363</FONT> public FieldVector&lt;T&gt; mapInv() {<a name="line.363"></a>
367 <FONT color="green">364</FONT> return copy().mapInvToSelf();<a name="line.364"></a>
368 <FONT color="green">365</FONT> }<a name="line.365"></a>
369 <FONT color="green">366</FONT> <a name="line.366"></a>
370 <FONT color="green">367</FONT> /** {@inheritDoc} */<a name="line.367"></a>
371 <FONT color="green">368</FONT> public FieldVector&lt;T&gt; mapInvToSelf() {<a name="line.368"></a>
372 <FONT color="green">369</FONT> for (int i = 0; i &lt; virtualSize; i++) {<a name="line.369"></a>
373 <FONT color="green">370</FONT> setEntry(i, field.getOne().divide(getEntry(i)));<a name="line.370"></a>
374 <FONT color="green">371</FONT> }<a name="line.371"></a>
375 <FONT color="green">372</FONT> return this;<a name="line.372"></a>
376 <FONT color="green">373</FONT> }<a name="line.373"></a>
377 <FONT color="green">374</FONT> <a name="line.374"></a>
378 <FONT color="green">375</FONT> /** {@inheritDoc} */<a name="line.375"></a>
379 <FONT color="green">376</FONT> public FieldVector&lt;T&gt; mapMultiply(T d) {<a name="line.376"></a>
380 <FONT color="green">377</FONT> return copy().mapMultiplyToSelf(d);<a name="line.377"></a>
381 <FONT color="green">378</FONT> }<a name="line.378"></a>
382 <FONT color="green">379</FONT> <a name="line.379"></a>
383 <FONT color="green">380</FONT> /** {@inheritDoc} */<a name="line.380"></a>
384 <FONT color="green">381</FONT> public FieldVector&lt;T&gt; mapMultiplyToSelf(T d) {<a name="line.381"></a>
385 <FONT color="green">382</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.382"></a>
386 <FONT color="green">383</FONT> while (iter.hasNext()) {<a name="line.383"></a>
387 <FONT color="green">384</FONT> iter.advance();<a name="line.384"></a>
388 <FONT color="green">385</FONT> entries.put(iter.key(), iter.value().multiply(d));<a name="line.385"></a>
389 <FONT color="green">386</FONT> }<a name="line.386"></a>
390 <FONT color="green">387</FONT> return this;<a name="line.387"></a>
391 <FONT color="green">388</FONT> }<a name="line.388"></a>
392 <FONT color="green">389</FONT> <a name="line.389"></a>
393 <FONT color="green">390</FONT> /** {@inheritDoc} */<a name="line.390"></a>
394 <FONT color="green">391</FONT> public FieldVector&lt;T&gt; mapSubtract(T d) {<a name="line.391"></a>
395 <FONT color="green">392</FONT> return copy().mapSubtractToSelf(d);<a name="line.392"></a>
396 <FONT color="green">393</FONT> }<a name="line.393"></a>
397 <FONT color="green">394</FONT> <a name="line.394"></a>
398 <FONT color="green">395</FONT> /** {@inheritDoc} */<a name="line.395"></a>
399 <FONT color="green">396</FONT> public FieldVector&lt;T&gt; mapSubtractToSelf(T d) {<a name="line.396"></a>
400 <FONT color="green">397</FONT> return mapAddToSelf(field.getZero().subtract(d));<a name="line.397"></a>
401 <FONT color="green">398</FONT> }<a name="line.398"></a>
402 <FONT color="green">399</FONT> <a name="line.399"></a>
403 <FONT color="green">400</FONT> /**<a name="line.400"></a>
404 <FONT color="green">401</FONT> * Optimized method to compute outer product when both vectors are sparse.<a name="line.401"></a>
405 <FONT color="green">402</FONT> * @param v vector with which outer product should be computed<a name="line.402"></a>
406 <FONT color="green">403</FONT> * @return the square matrix outer product between instance and v<a name="line.403"></a>
407 <FONT color="green">404</FONT> * @throws IllegalArgumentException if v is not the same size as {@code this}<a name="line.404"></a>
408 <FONT color="green">405</FONT> */<a name="line.405"></a>
409 <FONT color="green">406</FONT> public FieldMatrix&lt;T&gt; outerProduct(SparseFieldVector&lt;T&gt; v)<a name="line.406"></a>
410 <FONT color="green">407</FONT> throws IllegalArgumentException {<a name="line.407"></a>
411 <FONT color="green">408</FONT> checkVectorDimensions(v.getDimension());<a name="line.408"></a>
412 <FONT color="green">409</FONT> SparseFieldMatrix&lt;T&gt; res = new SparseFieldMatrix&lt;T&gt;(field, virtualSize, virtualSize);<a name="line.409"></a>
413 <FONT color="green">410</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.410"></a>
414 <FONT color="green">411</FONT> while (iter.hasNext()) {<a name="line.411"></a>
415 <FONT color="green">412</FONT> iter.advance();<a name="line.412"></a>
416 <FONT color="green">413</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter2 = v.entries.iterator();<a name="line.413"></a>
417 <FONT color="green">414</FONT> while (iter2.hasNext()) {<a name="line.414"></a>
418 <FONT color="green">415</FONT> iter2.advance();<a name="line.415"></a>
419 <FONT color="green">416</FONT> res.setEntry(iter.key(), iter2.key(), iter.value().multiply(iter2.value()));<a name="line.416"></a>
420 <FONT color="green">417</FONT> }<a name="line.417"></a>
421 <FONT color="green">418</FONT> }<a name="line.418"></a>
422 <FONT color="green">419</FONT> return res;<a name="line.419"></a>
423 <FONT color="green">420</FONT> }<a name="line.420"></a>
424 <FONT color="green">421</FONT> <a name="line.421"></a>
425 <FONT color="green">422</FONT> /** {@inheritDoc} */<a name="line.422"></a>
426 <FONT color="green">423</FONT> public FieldMatrix&lt;T&gt; outerProduct(T[] v) throws IllegalArgumentException {<a name="line.423"></a>
427 <FONT color="green">424</FONT> checkVectorDimensions(v.length);<a name="line.424"></a>
428 <FONT color="green">425</FONT> FieldMatrix&lt;T&gt; res = new SparseFieldMatrix&lt;T&gt;(field, virtualSize, virtualSize);<a name="line.425"></a>
429 <FONT color="green">426</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.426"></a>
430 <FONT color="green">427</FONT> while (iter.hasNext()) {<a name="line.427"></a>
431 <FONT color="green">428</FONT> iter.advance();<a name="line.428"></a>
432 <FONT color="green">429</FONT> int row = iter.key();<a name="line.429"></a>
433 <FONT color="green">430</FONT> FieldElement&lt;T&gt;value = iter.value();<a name="line.430"></a>
434 <FONT color="green">431</FONT> for (int col = 0; col &lt; virtualSize; col++) {<a name="line.431"></a>
435 <FONT color="green">432</FONT> res.setEntry(row, col, value.multiply(v[col]));<a name="line.432"></a>
436 <FONT color="green">433</FONT> }<a name="line.433"></a>
437 <FONT color="green">434</FONT> }<a name="line.434"></a>
438 <FONT color="green">435</FONT> return res;<a name="line.435"></a>
439 <FONT color="green">436</FONT> }<a name="line.436"></a>
440 <FONT color="green">437</FONT> <a name="line.437"></a>
441 <FONT color="green">438</FONT> /** {@inheritDoc} */<a name="line.438"></a>
442 <FONT color="green">439</FONT> public FieldMatrix&lt;T&gt; outerProduct(FieldVector&lt;T&gt; v)<a name="line.439"></a>
443 <FONT color="green">440</FONT> throws IllegalArgumentException {<a name="line.440"></a>
444 <FONT color="green">441</FONT> if(v instanceof SparseFieldVector&lt;?&gt;)<a name="line.441"></a>
445 <FONT color="green">442</FONT> return outerProduct((SparseFieldVector&lt;T&gt;)v);<a name="line.442"></a>
446 <FONT color="green">443</FONT> else<a name="line.443"></a>
447 <FONT color="green">444</FONT> return outerProduct(v.toArray());<a name="line.444"></a>
448 <FONT color="green">445</FONT> }<a name="line.445"></a>
449 <FONT color="green">446</FONT> <a name="line.446"></a>
450 <FONT color="green">447</FONT> /** {@inheritDoc} */<a name="line.447"></a>
451 <FONT color="green">448</FONT> public FieldVector&lt;T&gt; projection(FieldVector&lt;T&gt; v)<a name="line.448"></a>
452 <FONT color="green">449</FONT> throws IllegalArgumentException {<a name="line.449"></a>
453 <FONT color="green">450</FONT> checkVectorDimensions(v.getDimension());<a name="line.450"></a>
454 <FONT color="green">451</FONT> return v.mapMultiply(dotProduct(v).divide(v.dotProduct(v)));<a name="line.451"></a>
455 <FONT color="green">452</FONT> }<a name="line.452"></a>
456 <FONT color="green">453</FONT> <a name="line.453"></a>
457 <FONT color="green">454</FONT> /** {@inheritDoc} */<a name="line.454"></a>
458 <FONT color="green">455</FONT> public FieldVector&lt;T&gt; projection(T[] v) throws IllegalArgumentException {<a name="line.455"></a>
459 <FONT color="green">456</FONT> checkVectorDimensions(v.length);<a name="line.456"></a>
460 <FONT color="green">457</FONT> return projection(new SparseFieldVector&lt;T&gt;(field,v));<a name="line.457"></a>
461 <FONT color="green">458</FONT> }<a name="line.458"></a>
462 <FONT color="green">459</FONT> <a name="line.459"></a>
463 <FONT color="green">460</FONT> /** {@inheritDoc} */<a name="line.460"></a>
464 <FONT color="green">461</FONT> public void set(T value) {<a name="line.461"></a>
465 <FONT color="green">462</FONT> for (int i = 0; i &lt; virtualSize; i++) {<a name="line.462"></a>
466 <FONT color="green">463</FONT> setEntry(i, value);<a name="line.463"></a>
467 <FONT color="green">464</FONT> }<a name="line.464"></a>
468 <FONT color="green">465</FONT> }<a name="line.465"></a>
469 <FONT color="green">466</FONT> <a name="line.466"></a>
470 <FONT color="green">467</FONT> /** {@inheritDoc} */<a name="line.467"></a>
471 <FONT color="green">468</FONT> public void setEntry(int index, T value) throws MatrixIndexException {<a name="line.468"></a>
472 <FONT color="green">469</FONT> checkIndex(index);<a name="line.469"></a>
473 <FONT color="green">470</FONT> entries.put(index, value);<a name="line.470"></a>
474 <FONT color="green">471</FONT> }<a name="line.471"></a>
475 <FONT color="green">472</FONT> <a name="line.472"></a>
476 <FONT color="green">473</FONT> /** {@inheritDoc} */<a name="line.473"></a>
477 <FONT color="green">474</FONT> public void setSubVector(int index, FieldVector&lt;T&gt; v)<a name="line.474"></a>
478 <FONT color="green">475</FONT> throws MatrixIndexException {<a name="line.475"></a>
479 <FONT color="green">476</FONT> checkIndex(index);<a name="line.476"></a>
480 <FONT color="green">477</FONT> checkIndex(index + v.getDimension() - 1);<a name="line.477"></a>
481 <FONT color="green">478</FONT> setSubVector(index, v.getData());<a name="line.478"></a>
482 <FONT color="green">479</FONT> }<a name="line.479"></a>
483 <FONT color="green">480</FONT> <a name="line.480"></a>
484 <FONT color="green">481</FONT> /** {@inheritDoc} */<a name="line.481"></a>
485 <FONT color="green">482</FONT> public void setSubVector(int index, T[] v) throws MatrixIndexException {<a name="line.482"></a>
486 <FONT color="green">483</FONT> checkIndex(index);<a name="line.483"></a>
487 <FONT color="green">484</FONT> checkIndex(index + v.length - 1);<a name="line.484"></a>
488 <FONT color="green">485</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.485"></a>
489 <FONT color="green">486</FONT> setEntry(i + index, v[i]);<a name="line.486"></a>
490 <FONT color="green">487</FONT> }<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> /**<a name="line.491"></a>
495 <FONT color="green">492</FONT> * Optimized method to subtract SparseRealVectors.<a name="line.492"></a>
496 <FONT color="green">493</FONT> * @param v The vector to subtract from &lt;code&gt;this&lt;/code&gt;<a name="line.493"></a>
497 <FONT color="green">494</FONT> * @return The difference of &lt;code&gt;this&lt;/code&gt; and &lt;code&gt;v&lt;/code&gt;<a name="line.494"></a>
498 <FONT color="green">495</FONT> * @throws IllegalArgumentException If the dimensions don't match<a name="line.495"></a>
499 <FONT color="green">496</FONT> */<a name="line.496"></a>
500 <FONT color="green">497</FONT> public SparseFieldVector&lt;T&gt; subtract(SparseFieldVector&lt;T&gt; v) throws IllegalArgumentException{<a name="line.497"></a>
501 <FONT color="green">498</FONT> checkVectorDimensions(v.getDimension());<a name="line.498"></a>
502 <FONT color="green">499</FONT> SparseFieldVector&lt;T&gt; res = (SparseFieldVector&lt;T&gt;)copy();<a name="line.499"></a>
503 <FONT color="green">500</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = v.getEntries().iterator();<a name="line.500"></a>
504 <FONT color="green">501</FONT> while (iter.hasNext()) {<a name="line.501"></a>
505 <FONT color="green">502</FONT> iter.advance();<a name="line.502"></a>
506 <FONT color="green">503</FONT> int key = iter.key();<a name="line.503"></a>
507 <FONT color="green">504</FONT> if (entries.containsKey(key)) {<a name="line.504"></a>
508 <FONT color="green">505</FONT> res.setEntry(key, entries.get(key).subtract(iter.value()));<a name="line.505"></a>
509 <FONT color="green">506</FONT> } else {<a name="line.506"></a>
510 <FONT color="green">507</FONT> res.setEntry(key, field.getZero().subtract(iter.value()));<a name="line.507"></a>
511 <FONT color="green">508</FONT> }<a name="line.508"></a>
512 <FONT color="green">509</FONT> }<a name="line.509"></a>
513 <FONT color="green">510</FONT> return res;<a name="line.510"></a>
514 <FONT color="green">511</FONT> }<a name="line.511"></a>
515 <FONT color="green">512</FONT> <a name="line.512"></a>
516 <FONT color="green">513</FONT> /** {@inheritDoc} */<a name="line.513"></a>
517 <FONT color="green">514</FONT> public FieldVector&lt;T&gt; subtract(FieldVector&lt;T&gt; v)<a name="line.514"></a>
518 <FONT color="green">515</FONT> throws IllegalArgumentException {<a name="line.515"></a>
519 <FONT color="green">516</FONT> if(v instanceof SparseFieldVector&lt;?&gt;)<a name="line.516"></a>
520 <FONT color="green">517</FONT> return subtract((SparseFieldVector&lt;T&gt;)v);<a name="line.517"></a>
521 <FONT color="green">518</FONT> else<a name="line.518"></a>
522 <FONT color="green">519</FONT> return subtract(v.toArray());<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> /** {@inheritDoc} */<a name="line.522"></a>
526 <FONT color="green">523</FONT> public FieldVector&lt;T&gt; subtract(T[] v) throws IllegalArgumentException {<a name="line.523"></a>
527 <FONT color="green">524</FONT> checkVectorDimensions(v.length);<a name="line.524"></a>
528 <FONT color="green">525</FONT> SparseFieldVector&lt;T&gt; res = new SparseFieldVector&lt;T&gt;(this);<a name="line.525"></a>
529 <FONT color="green">526</FONT> for (int i = 0; i &lt; v.length; i++) {<a name="line.526"></a>
530 <FONT color="green">527</FONT> if (entries.containsKey(i)) {<a name="line.527"></a>
531 <FONT color="green">528</FONT> res.setEntry(i, entries.get(i).subtract(v[i]));<a name="line.528"></a>
532 <FONT color="green">529</FONT> } else {<a name="line.529"></a>
533 <FONT color="green">530</FONT> res.setEntry(i, field.getZero().subtract(v[i]));<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> return res;<a name="line.533"></a>
537 <FONT color="green">534</FONT> }<a name="line.534"></a>
538 <FONT color="green">535</FONT> <a name="line.535"></a>
539 <FONT color="green">536</FONT> /** {@inheritDoc} */<a name="line.536"></a>
540 <FONT color="green">537</FONT> public T[] toArray() {<a name="line.537"></a>
541 <FONT color="green">538</FONT> return getData();<a name="line.538"></a>
542 <FONT color="green">539</FONT> }<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> * Check if an index is valid.<a name="line.542"></a>
546 <FONT color="green">543</FONT> *<a name="line.543"></a>
547 <FONT color="green">544</FONT> * @param index<a name="line.544"></a>
548 <FONT color="green">545</FONT> * index to check<a name="line.545"></a>
549 <FONT color="green">546</FONT> * @exception MatrixIndexException<a name="line.546"></a>
550 <FONT color="green">547</FONT> * if index is not valid<a name="line.547"></a>
551 <FONT color="green">548</FONT> */<a name="line.548"></a>
552 <FONT color="green">549</FONT> private void checkIndex(final int index) throws MatrixIndexException {<a name="line.549"></a>
553 <FONT color="green">550</FONT> if (index &lt; 0 || index &gt;= getDimension()) {<a name="line.550"></a>
554 <FONT color="green">551</FONT> throw new MatrixIndexException(<a name="line.551"></a>
555 <FONT color="green">552</FONT> "index {0} out of allowed range [{1}, {2}]",<a name="line.552"></a>
556 <FONT color="green">553</FONT> index, 0, getDimension() - 1);<a name="line.553"></a>
557 <FONT color="green">554</FONT> }<a name="line.554"></a>
558 <FONT color="green">555</FONT> }<a name="line.555"></a>
559 <FONT color="green">556</FONT> <a name="line.556"></a>
560 <FONT color="green">557</FONT> /**<a name="line.557"></a>
561 <FONT color="green">558</FONT> * Check if instance dimension is equal to some expected value.<a name="line.558"></a>
562 <FONT color="green">559</FONT> *<a name="line.559"></a>
563 <FONT color="green">560</FONT> * @param n<a name="line.560"></a>
564 <FONT color="green">561</FONT> * expected dimension.<a name="line.561"></a>
565 <FONT color="green">562</FONT> * @exception IllegalArgumentException<a name="line.562"></a>
566 <FONT color="green">563</FONT> * if the dimension is inconsistent with vector size<a name="line.563"></a>
567 <FONT color="green">564</FONT> */<a name="line.564"></a>
568 <FONT color="green">565</FONT> protected void checkVectorDimensions(int n) throws IllegalArgumentException {<a name="line.565"></a>
569 <FONT color="green">566</FONT> if (getDimension() != n) {<a name="line.566"></a>
570 <FONT color="green">567</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.567"></a>
571 <FONT color="green">568</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.568"></a>
572 <FONT color="green">569</FONT> getDimension(), n);<a name="line.569"></a>
573 <FONT color="green">570</FONT> }<a name="line.570"></a>
574 <FONT color="green">571</FONT> }<a name="line.571"></a>
575 <FONT color="green">572</FONT> <a name="line.572"></a>
576 <FONT color="green">573</FONT> <a name="line.573"></a>
577 <FONT color="green">574</FONT> /** {@inheritDoc} */<a name="line.574"></a>
578 <FONT color="green">575</FONT> public FieldVector&lt;T&gt; add(FieldVector&lt;T&gt; v) throws IllegalArgumentException {<a name="line.575"></a>
579 <FONT color="green">576</FONT> if (v instanceof SparseFieldVector&lt;?&gt;) {<a name="line.576"></a>
580 <FONT color="green">577</FONT> return add((SparseFieldVector&lt;T&gt;)v);<a name="line.577"></a>
581 <FONT color="green">578</FONT> } else {<a name="line.578"></a>
582 <FONT color="green">579</FONT> return add(v.toArray());<a name="line.579"></a>
583 <FONT color="green">580</FONT> }<a name="line.580"></a>
584 <FONT color="green">581</FONT> }<a name="line.581"></a>
585 <FONT color="green">582</FONT> <a name="line.582"></a>
586 <FONT color="green">583</FONT> /** Build an array of elements.<a name="line.583"></a>
587 <FONT color="green">584</FONT> * @param length size of the array to build<a name="line.584"></a>
588 <FONT color="green">585</FONT> * @return a new array<a name="line.585"></a>
589 <FONT color="green">586</FONT> */<a name="line.586"></a>
590 <FONT color="green">587</FONT> @SuppressWarnings("unchecked") // field is type T<a name="line.587"></a>
591 <FONT color="green">588</FONT> private T[] buildArray(final int length) {<a name="line.588"></a>
592 <FONT color="green">589</FONT> return (T[]) Array.newInstance(field.getZero().getClass(), length);<a name="line.589"></a>
593 <FONT color="green">590</FONT> }<a name="line.590"></a>
594 <FONT color="green">591</FONT> <a name="line.591"></a>
595 <FONT color="green">592</FONT> <a name="line.592"></a>
596 <FONT color="green">593</FONT> /** {@inheritDoc} */<a name="line.593"></a>
597 <FONT color="green">594</FONT> @Override<a name="line.594"></a>
598 <FONT color="green">595</FONT> public int hashCode() {<a name="line.595"></a>
599 <FONT color="green">596</FONT> final int prime = 31;<a name="line.596"></a>
600 <FONT color="green">597</FONT> int result = 1;<a name="line.597"></a>
601 <FONT color="green">598</FONT> result = prime * result + ((field == null) ? 0 : field.hashCode());<a name="line.598"></a>
602 <FONT color="green">599</FONT> result = prime * result + virtualSize;<a name="line.599"></a>
603 <FONT color="green">600</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.600"></a>
604 <FONT color="green">601</FONT> while (iter.hasNext()) {<a name="line.601"></a>
605 <FONT color="green">602</FONT> iter.advance();<a name="line.602"></a>
606 <FONT color="green">603</FONT> int temp = iter.value().hashCode();<a name="line.603"></a>
607 <FONT color="green">604</FONT> result = prime * result + temp;<a name="line.604"></a>
608 <FONT color="green">605</FONT> }<a name="line.605"></a>
609 <FONT color="green">606</FONT> return result;<a name="line.606"></a>
610 <FONT color="green">607</FONT> }<a name="line.607"></a>
611 <FONT color="green">608</FONT> <a name="line.608"></a>
612 <FONT color="green">609</FONT> <a name="line.609"></a>
613 <FONT color="green">610</FONT> /** {@inheritDoc} */<a name="line.610"></a>
614 <FONT color="green">611</FONT> @Override<a name="line.611"></a>
615 <FONT color="green">612</FONT> public boolean equals(Object obj) {<a name="line.612"></a>
616 <FONT color="green">613</FONT> <a name="line.613"></a>
617 <FONT color="green">614</FONT> if (this == obj) {<a name="line.614"></a>
618 <FONT color="green">615</FONT> return true;<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> if (!(obj instanceof SparseFieldVector&lt;?&gt;)) {<a name="line.618"></a>
622 <FONT color="green">619</FONT> return false;<a name="line.619"></a>
623 <FONT color="green">620</FONT> }<a name="line.620"></a>
624 <FONT color="green">621</FONT> <a name="line.621"></a>
625 <FONT color="green">622</FONT> @SuppressWarnings("unchecked") // OK, because "else if" check below ensures that<a name="line.622"></a>
626 <FONT color="green">623</FONT> // other must be the same type as this<a name="line.623"></a>
627 <FONT color="green">624</FONT> SparseFieldVector&lt;T&gt; other = (SparseFieldVector&lt;T&gt;) obj;<a name="line.624"></a>
628 <FONT color="green">625</FONT> if (field == null) {<a name="line.625"></a>
629 <FONT color="green">626</FONT> if (other.field != null) {<a name="line.626"></a>
630 <FONT color="green">627</FONT> return false;<a name="line.627"></a>
631 <FONT color="green">628</FONT> }<a name="line.628"></a>
632 <FONT color="green">629</FONT> } else if (!field.equals(other.field)) {<a name="line.629"></a>
633 <FONT color="green">630</FONT> return false;<a name="line.630"></a>
634 <FONT color="green">631</FONT> }<a name="line.631"></a>
635 <FONT color="green">632</FONT> if (virtualSize != other.virtualSize) {<a name="line.632"></a>
636 <FONT color="green">633</FONT> return false;<a name="line.633"></a>
637 <FONT color="green">634</FONT> }<a name="line.634"></a>
638 <FONT color="green">635</FONT> <a name="line.635"></a>
639 <FONT color="green">636</FONT> OpenIntToFieldHashMap&lt;T&gt;.Iterator iter = entries.iterator();<a name="line.636"></a>
640 <FONT color="green">637</FONT> while (iter.hasNext()) {<a name="line.637"></a>
641 <FONT color="green">638</FONT> iter.advance();<a name="line.638"></a>
642 <FONT color="green">639</FONT> T test = other.getEntry(iter.key());<a name="line.639"></a>
643 <FONT color="green">640</FONT> if (!test.equals(iter.value())) {<a name="line.640"></a>
644 <FONT color="green">641</FONT> return false;<a name="line.641"></a>
645 <FONT color="green">642</FONT> }<a name="line.642"></a>
646 <FONT color="green">643</FONT> }<a name="line.643"></a>
647 <FONT color="green">644</FONT> iter = other.getEntries().iterator();<a name="line.644"></a>
648 <FONT color="green">645</FONT> while (iter.hasNext()) {<a name="line.645"></a>
649 <FONT color="green">646</FONT> iter.advance();<a name="line.646"></a>
650 <FONT color="green">647</FONT> T test = iter.value();<a name="line.647"></a>
651 <FONT color="green">648</FONT> if (!test.equals(getEntry(iter.key()))) {<a name="line.648"></a>
652 <FONT color="green">649</FONT> return false;<a name="line.649"></a>
653 <FONT color="green">650</FONT> }<a name="line.650"></a>
654 <FONT color="green">651</FONT> }<a name="line.651"></a>
655 <FONT color="green">652</FONT> return true;<a name="line.652"></a>
656 <FONT color="green">653</FONT> }<a name="line.653"></a>
657 <FONT color="green">654</FONT> <a name="line.654"></a>
658 <FONT color="green">655</FONT> <a name="line.655"></a>
659 <FONT color="green">656</FONT> <a name="line.656"></a>
660 <FONT color="green">657</FONT> }<a name="line.657"></a>
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721 </PRE>
722 </BODY>
723 </HTML>