comparison libs/commons-math-2.1/docs/apidocs/src-html/org/apache/commons/math/linear/BlockFieldMatrix.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.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> <a name="line.25"></a>
29 <FONT color="green">026</FONT> /**<a name="line.26"></a>
30 <FONT color="green">027</FONT> * Cache-friendly implementation of FieldMatrix using a flat arrays to store<a name="line.27"></a>
31 <FONT color="green">028</FONT> * square blocks of the matrix.<a name="line.28"></a>
32 <FONT color="green">029</FONT> * &lt;p&gt;<a name="line.29"></a>
33 <FONT color="green">030</FONT> * This implementation is specially designed to be cache-friendly. Square blocks are<a name="line.30"></a>
34 <FONT color="green">031</FONT> * stored as small arrays and allow efficient traversal of data both in row major direction<a name="line.31"></a>
35 <FONT color="green">032</FONT> * and columns major direction, one block at a time. This greatly increases performances<a name="line.32"></a>
36 <FONT color="green">033</FONT> * for algorithms that use crossed directions loops like multiplication or transposition.<a name="line.33"></a>
37 <FONT color="green">034</FONT> * &lt;/p&gt;<a name="line.34"></a>
38 <FONT color="green">035</FONT> * &lt;p&gt;<a name="line.35"></a>
39 <FONT color="green">036</FONT> * The size of square blocks is a static parameter. It may be tuned according to the cache<a name="line.36"></a>
40 <FONT color="green">037</FONT> * size of the target computer processor. As a rule of thumbs, it should be the largest<a name="line.37"></a>
41 <FONT color="green">038</FONT> * value that allows three blocks to be simultaneously cached (this is necessary for example<a name="line.38"></a>
42 <FONT color="green">039</FONT> * for matrix multiplication). The default value is to use 36x36 blocks.<a name="line.39"></a>
43 <FONT color="green">040</FONT> * &lt;/p&gt;<a name="line.40"></a>
44 <FONT color="green">041</FONT> * &lt;p&gt;<a name="line.41"></a>
45 <FONT color="green">042</FONT> * The regular blocks represent {@link #BLOCK_SIZE} x {@link #BLOCK_SIZE} squares. Blocks<a name="line.42"></a>
46 <FONT color="green">043</FONT> * at right hand side and bottom side which may be smaller to fit matrix dimensions. The square<a name="line.43"></a>
47 <FONT color="green">044</FONT> * blocks are flattened in row major order in single dimension arrays which are therefore<a name="line.44"></a>
48 <FONT color="green">045</FONT> * {@link #BLOCK_SIZE}&lt;sup&gt;2&lt;/sup&gt; elements long for regular blocks. The blocks are themselves<a name="line.45"></a>
49 <FONT color="green">046</FONT> * organized in row major order.<a name="line.46"></a>
50 <FONT color="green">047</FONT> * &lt;/p&gt;<a name="line.47"></a>
51 <FONT color="green">048</FONT> * &lt;p&gt;<a name="line.48"></a>
52 <FONT color="green">049</FONT> * As an example, for a block size of 36x36, a 100x60 matrix would be stored in 6 blocks.<a name="line.49"></a>
53 <FONT color="green">050</FONT> * Block 0 would be a Field[1296] array holding the upper left 36x36 square, block 1 would be<a name="line.50"></a>
54 <FONT color="green">051</FONT> * a Field[1296] array holding the upper center 36x36 square, block 2 would be a Field[1008]<a name="line.51"></a>
55 <FONT color="green">052</FONT> * array holding the upper right 36x28 rectangle, block 3 would be a Field[864] array holding<a name="line.52"></a>
56 <FONT color="green">053</FONT> * the lower left 24x36 rectangle, block 4 would be a Field[864] array holding the lower center<a name="line.53"></a>
57 <FONT color="green">054</FONT> * 24x36 rectangle and block 5 would be a Field[672] array holding the lower right 24x28<a name="line.54"></a>
58 <FONT color="green">055</FONT> * rectangle.<a name="line.55"></a>
59 <FONT color="green">056</FONT> * &lt;/p&gt;<a name="line.56"></a>
60 <FONT color="green">057</FONT> * &lt;p&gt;<a name="line.57"></a>
61 <FONT color="green">058</FONT> * The layout complexity overhead versus simple mapping of matrices to java<a name="line.58"></a>
62 <FONT color="green">059</FONT> * arrays is negligible for small matrices (about 1%). The gain from cache efficiency leads<a name="line.59"></a>
63 <FONT color="green">060</FONT> * to up to 3-fold improvements for matrices of moderate to large size.<a name="line.60"></a>
64 <FONT color="green">061</FONT> * &lt;/p&gt;<a name="line.61"></a>
65 <FONT color="green">062</FONT> * @param &lt;T&gt; the type of the field elements<a name="line.62"></a>
66 <FONT color="green">063</FONT> * @version $Revision: 825919 $ $Date: 2009-10-16 10:51:55 -0400 (Fri, 16 Oct 2009) $<a name="line.63"></a>
67 <FONT color="green">064</FONT> * @since 2.0<a name="line.64"></a>
68 <FONT color="green">065</FONT> */<a name="line.65"></a>
69 <FONT color="green">066</FONT> public class BlockFieldMatrix&lt;T extends FieldElement&lt;T&gt;&gt; extends AbstractFieldMatrix&lt;T&gt; implements Serializable {<a name="line.66"></a>
70 <FONT color="green">067</FONT> <a name="line.67"></a>
71 <FONT color="green">068</FONT> /** Block size. */<a name="line.68"></a>
72 <FONT color="green">069</FONT> public static final int BLOCK_SIZE = 36;<a name="line.69"></a>
73 <FONT color="green">070</FONT> <a name="line.70"></a>
74 <FONT color="green">071</FONT> /** Serializable version identifier */<a name="line.71"></a>
75 <FONT color="green">072</FONT> private static final long serialVersionUID = -4602336630143123183L;<a name="line.72"></a>
76 <FONT color="green">073</FONT> <a name="line.73"></a>
77 <FONT color="green">074</FONT> /** Blocks of matrix entries. */<a name="line.74"></a>
78 <FONT color="green">075</FONT> private final T blocks[][];<a name="line.75"></a>
79 <FONT color="green">076</FONT> <a name="line.76"></a>
80 <FONT color="green">077</FONT> /** Number of rows of the matrix. */<a name="line.77"></a>
81 <FONT color="green">078</FONT> private final int rows;<a name="line.78"></a>
82 <FONT color="green">079</FONT> <a name="line.79"></a>
83 <FONT color="green">080</FONT> /** Number of columns of the matrix. */<a name="line.80"></a>
84 <FONT color="green">081</FONT> private final int columns;<a name="line.81"></a>
85 <FONT color="green">082</FONT> <a name="line.82"></a>
86 <FONT color="green">083</FONT> /** Number of block rows of the matrix. */<a name="line.83"></a>
87 <FONT color="green">084</FONT> private final int blockRows;<a name="line.84"></a>
88 <FONT color="green">085</FONT> <a name="line.85"></a>
89 <FONT color="green">086</FONT> /** Number of block columns of the matrix. */<a name="line.86"></a>
90 <FONT color="green">087</FONT> private final int blockColumns;<a name="line.87"></a>
91 <FONT color="green">088</FONT> <a name="line.88"></a>
92 <FONT color="green">089</FONT> /**<a name="line.89"></a>
93 <FONT color="green">090</FONT> * Create a new matrix with the supplied row and column dimensions.<a name="line.90"></a>
94 <FONT color="green">091</FONT> *<a name="line.91"></a>
95 <FONT color="green">092</FONT> * @param field field to which the elements belong<a name="line.92"></a>
96 <FONT color="green">093</FONT> * @param rows the number of rows in the new matrix<a name="line.93"></a>
97 <FONT color="green">094</FONT> * @param columns the number of columns in the new matrix<a name="line.94"></a>
98 <FONT color="green">095</FONT> * @throws IllegalArgumentException if row or column dimension is not<a name="line.95"></a>
99 <FONT color="green">096</FONT> * positive<a name="line.96"></a>
100 <FONT color="green">097</FONT> */<a name="line.97"></a>
101 <FONT color="green">098</FONT> public BlockFieldMatrix(final Field&lt;T&gt; field, final int rows, final int columns)<a name="line.98"></a>
102 <FONT color="green">099</FONT> throws IllegalArgumentException {<a name="line.99"></a>
103 <FONT color="green">100</FONT> <a name="line.100"></a>
104 <FONT color="green">101</FONT> super(field, rows, columns);<a name="line.101"></a>
105 <FONT color="green">102</FONT> this.rows = rows;<a name="line.102"></a>
106 <FONT color="green">103</FONT> this.columns = columns;<a name="line.103"></a>
107 <FONT color="green">104</FONT> <a name="line.104"></a>
108 <FONT color="green">105</FONT> // number of blocks<a name="line.105"></a>
109 <FONT color="green">106</FONT> blockRows = (rows + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.106"></a>
110 <FONT color="green">107</FONT> blockColumns = (columns + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.107"></a>
111 <FONT color="green">108</FONT> <a name="line.108"></a>
112 <FONT color="green">109</FONT> // allocate storage blocks, taking care of smaller ones at right and bottom<a name="line.109"></a>
113 <FONT color="green">110</FONT> blocks = createBlocksLayout(field, rows, columns);<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> * Create a new dense matrix copying entries from raw layout data.<a name="line.115"></a>
119 <FONT color="green">116</FONT> * &lt;p&gt;The input array &lt;em&gt;must&lt;/em&gt; already be in raw layout.&lt;/p&gt;<a name="line.116"></a>
120 <FONT color="green">117</FONT> * &lt;p&gt;Calling this constructor is equivalent to call:<a name="line.117"></a>
121 <FONT color="green">118</FONT> * &lt;pre&gt;matrix = new BlockFieldMatrix&lt;T&gt;(getField(), rawData.length, rawData[0].length,<a name="line.118"></a>
122 <FONT color="green">119</FONT> * toBlocksLayout(rawData), false);&lt;/pre&gt;<a name="line.119"></a>
123 <FONT color="green">120</FONT> * &lt;/p&gt;<a name="line.120"></a>
124 <FONT color="green">121</FONT> * @param rawData data for new matrix, in raw layout<a name="line.121"></a>
125 <FONT color="green">122</FONT> *<a name="line.122"></a>
126 <FONT color="green">123</FONT> * @exception IllegalArgumentException if &lt;code&gt;blockData&lt;/code&gt; shape is<a name="line.123"></a>
127 <FONT color="green">124</FONT> * inconsistent with block layout<a name="line.124"></a>
128 <FONT color="green">125</FONT> * @see #BlockFieldMatrix(int, int, FieldElement[][], boolean)<a name="line.125"></a>
129 <FONT color="green">126</FONT> */<a name="line.126"></a>
130 <FONT color="green">127</FONT> public BlockFieldMatrix(final T[][] rawData)<a name="line.127"></a>
131 <FONT color="green">128</FONT> throws IllegalArgumentException {<a name="line.128"></a>
132 <FONT color="green">129</FONT> this(rawData.length, rawData[0].length, toBlocksLayout(rawData), false);<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> * Create a new dense matrix copying entries from block layout data.<a name="line.133"></a>
137 <FONT color="green">134</FONT> * &lt;p&gt;The input array &lt;em&gt;must&lt;/em&gt; already be in blocks layout.&lt;/p&gt;<a name="line.134"></a>
138 <FONT color="green">135</FONT> * @param rows the number of rows in the new matrix<a name="line.135"></a>
139 <FONT color="green">136</FONT> * @param columns the number of columns in the new matrix<a name="line.136"></a>
140 <FONT color="green">137</FONT> * @param blockData data for new matrix<a name="line.137"></a>
141 <FONT color="green">138</FONT> * @param copyArray if true, the input array will be copied, otherwise<a name="line.138"></a>
142 <FONT color="green">139</FONT> * it will be referenced<a name="line.139"></a>
143 <FONT color="green">140</FONT> *<a name="line.140"></a>
144 <FONT color="green">141</FONT> * @exception IllegalArgumentException if &lt;code&gt;blockData&lt;/code&gt; shape is<a name="line.141"></a>
145 <FONT color="green">142</FONT> * inconsistent with block layout<a name="line.142"></a>
146 <FONT color="green">143</FONT> * @see #createBlocksLayout(Field, int, int)<a name="line.143"></a>
147 <FONT color="green">144</FONT> * @see #toBlocksLayout(FieldElement[][])<a name="line.144"></a>
148 <FONT color="green">145</FONT> * @see #BlockFieldMatrix(FieldElement[][])<a name="line.145"></a>
149 <FONT color="green">146</FONT> */<a name="line.146"></a>
150 <FONT color="green">147</FONT> public BlockFieldMatrix(final int rows, final int columns,<a name="line.147"></a>
151 <FONT color="green">148</FONT> final T[][] blockData, final boolean copyArray)<a name="line.148"></a>
152 <FONT color="green">149</FONT> throws IllegalArgumentException {<a name="line.149"></a>
153 <FONT color="green">150</FONT> <a name="line.150"></a>
154 <FONT color="green">151</FONT> super(extractField(blockData), rows, columns);<a name="line.151"></a>
155 <FONT color="green">152</FONT> this.rows = rows;<a name="line.152"></a>
156 <FONT color="green">153</FONT> this.columns = columns;<a name="line.153"></a>
157 <FONT color="green">154</FONT> <a name="line.154"></a>
158 <FONT color="green">155</FONT> // number of blocks<a name="line.155"></a>
159 <FONT color="green">156</FONT> blockRows = (rows + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.156"></a>
160 <FONT color="green">157</FONT> blockColumns = (columns + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.157"></a>
161 <FONT color="green">158</FONT> <a name="line.158"></a>
162 <FONT color="green">159</FONT> if (copyArray) {<a name="line.159"></a>
163 <FONT color="green">160</FONT> // allocate storage blocks, taking care of smaller ones at right and bottom<a name="line.160"></a>
164 <FONT color="green">161</FONT> blocks = buildArray(getField(), blockRows * blockColumns, -1);<a name="line.161"></a>
165 <FONT color="green">162</FONT> } else {<a name="line.162"></a>
166 <FONT color="green">163</FONT> // reference existing array<a name="line.163"></a>
167 <FONT color="green">164</FONT> blocks = blockData;<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> int index = 0;<a name="line.167"></a>
171 <FONT color="green">168</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.168"></a>
172 <FONT color="green">169</FONT> final int iHeight = blockHeight(iBlock);<a name="line.169"></a>
173 <FONT color="green">170</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock, ++index) {<a name="line.170"></a>
174 <FONT color="green">171</FONT> if (blockData[index].length != iHeight * blockWidth(jBlock)) {<a name="line.171"></a>
175 <FONT color="green">172</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.172"></a>
176 <FONT color="green">173</FONT> "wrong array shape (block length = {0}, expected {1})",<a name="line.173"></a>
177 <FONT color="green">174</FONT> blockData[index].length, iHeight * blockWidth(jBlock));<a name="line.174"></a>
178 <FONT color="green">175</FONT> }<a name="line.175"></a>
179 <FONT color="green">176</FONT> if (copyArray) {<a name="line.176"></a>
180 <FONT color="green">177</FONT> blocks[index] = blockData[index].clone();<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> <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> * Convert a data array from raw layout to blocks layout.<a name="line.185"></a>
189 <FONT color="green">186</FONT> * &lt;p&gt;<a name="line.186"></a>
190 <FONT color="green">187</FONT> * Raw layout is the straightforward layout where element at row i and<a name="line.187"></a>
191 <FONT color="green">188</FONT> * column j is in array element &lt;code&gt;rawData[i][j]&lt;/code&gt;. Blocks layout<a name="line.188"></a>
192 <FONT color="green">189</FONT> * is the layout used in {@link BlockFieldMatrix} instances, where the matrix<a name="line.189"></a>
193 <FONT color="green">190</FONT> * is split in square blocks (except at right and bottom side where blocks may<a name="line.190"></a>
194 <FONT color="green">191</FONT> * be rectangular to fit matrix size) and each block is stored in a flattened<a name="line.191"></a>
195 <FONT color="green">192</FONT> * one-dimensional array.<a name="line.192"></a>
196 <FONT color="green">193</FONT> * &lt;/p&gt;<a name="line.193"></a>
197 <FONT color="green">194</FONT> * &lt;p&gt;<a name="line.194"></a>
198 <FONT color="green">195</FONT> * This method creates an array in blocks layout from an input array in raw layout.<a name="line.195"></a>
199 <FONT color="green">196</FONT> * It can be used to provide the array argument of the {@link<a name="line.196"></a>
200 <FONT color="green">197</FONT> * #BlockFieldMatrix(int, int, FieldElement[][], boolean)}<a name="line.197"></a>
201 <FONT color="green">198</FONT> * constructor.<a name="line.198"></a>
202 <FONT color="green">199</FONT> * &lt;/p&gt;<a name="line.199"></a>
203 <FONT color="green">200</FONT> * @param &lt;T&gt; the type of the field elements<a name="line.200"></a>
204 <FONT color="green">201</FONT> * @param rawData data array in raw layout<a name="line.201"></a>
205 <FONT color="green">202</FONT> * @return a new data array containing the same entries but in blocks layout<a name="line.202"></a>
206 <FONT color="green">203</FONT> * @exception IllegalArgumentException if &lt;code&gt;rawData&lt;/code&gt; is not rectangular<a name="line.203"></a>
207 <FONT color="green">204</FONT> * (not all rows have the same length)<a name="line.204"></a>
208 <FONT color="green">205</FONT> * @see #createBlocksLayout(Field, int, int)<a name="line.205"></a>
209 <FONT color="green">206</FONT> * @see #BlockFieldMatrix(int, int, FieldElement[][], boolean)<a name="line.206"></a>
210 <FONT color="green">207</FONT> */<a name="line.207"></a>
211 <FONT color="green">208</FONT> public static &lt;T extends FieldElement&lt;T&gt;&gt; T[][] toBlocksLayout(final T[][] rawData)<a name="line.208"></a>
212 <FONT color="green">209</FONT> throws IllegalArgumentException {<a name="line.209"></a>
213 <FONT color="green">210</FONT> <a name="line.210"></a>
214 <FONT color="green">211</FONT> final int rows = rawData.length;<a name="line.211"></a>
215 <FONT color="green">212</FONT> final int columns = rawData[0].length;<a name="line.212"></a>
216 <FONT color="green">213</FONT> final int blockRows = (rows + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.213"></a>
217 <FONT color="green">214</FONT> final int blockColumns = (columns + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.214"></a>
218 <FONT color="green">215</FONT> <a name="line.215"></a>
219 <FONT color="green">216</FONT> // safety checks<a name="line.216"></a>
220 <FONT color="green">217</FONT> for (int i = 0; i &lt; rawData.length; ++i) {<a name="line.217"></a>
221 <FONT color="green">218</FONT> final int length = rawData[i].length;<a name="line.218"></a>
222 <FONT color="green">219</FONT> if (length != columns) {<a name="line.219"></a>
223 <FONT color="green">220</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.220"></a>
224 <FONT color="green">221</FONT> "some rows have length {0} while others have length {1}",<a name="line.221"></a>
225 <FONT color="green">222</FONT> columns, length);<a name="line.222"></a>
226 <FONT color="green">223</FONT> }<a name="line.223"></a>
227 <FONT color="green">224</FONT> }<a name="line.224"></a>
228 <FONT color="green">225</FONT> <a name="line.225"></a>
229 <FONT color="green">226</FONT> // convert array<a name="line.226"></a>
230 <FONT color="green">227</FONT> final Field&lt;T&gt; field = extractField(rawData);<a name="line.227"></a>
231 <FONT color="green">228</FONT> final T[][] blocks = buildArray(field, blockRows * blockColumns, -1);<a name="line.228"></a>
232 <FONT color="green">229</FONT> int blockIndex = 0;<a name="line.229"></a>
233 <FONT color="green">230</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.230"></a>
234 <FONT color="green">231</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.231"></a>
235 <FONT color="green">232</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.232"></a>
236 <FONT color="green">233</FONT> final int iHeight = pEnd - pStart;<a name="line.233"></a>
237 <FONT color="green">234</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.234"></a>
238 <FONT color="green">235</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.235"></a>
239 <FONT color="green">236</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.236"></a>
240 <FONT color="green">237</FONT> final int jWidth = qEnd - qStart;<a name="line.237"></a>
241 <FONT color="green">238</FONT> <a name="line.238"></a>
242 <FONT color="green">239</FONT> // allocate new block<a name="line.239"></a>
243 <FONT color="green">240</FONT> final T[] block = buildArray(field, iHeight * jWidth);<a name="line.240"></a>
244 <FONT color="green">241</FONT> blocks[blockIndex] = block;<a name="line.241"></a>
245 <FONT color="green">242</FONT> <a name="line.242"></a>
246 <FONT color="green">243</FONT> // copy data<a name="line.243"></a>
247 <FONT color="green">244</FONT> int index = 0;<a name="line.244"></a>
248 <FONT color="green">245</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.245"></a>
249 <FONT color="green">246</FONT> System.arraycopy(rawData[p], qStart, block, index, jWidth);<a name="line.246"></a>
250 <FONT color="green">247</FONT> index += jWidth;<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> ++blockIndex;<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> }<a name="line.253"></a>
257 <FONT color="green">254</FONT> <a name="line.254"></a>
258 <FONT color="green">255</FONT> return blocks;<a name="line.255"></a>
259 <FONT color="green">256</FONT> <a name="line.256"></a>
260 <FONT color="green">257</FONT> }<a name="line.257"></a>
261 <FONT color="green">258</FONT> <a name="line.258"></a>
262 <FONT color="green">259</FONT> /**<a name="line.259"></a>
263 <FONT color="green">260</FONT> * Create a data array in blocks layout.<a name="line.260"></a>
264 <FONT color="green">261</FONT> * &lt;p&gt;<a name="line.261"></a>
265 <FONT color="green">262</FONT> * This method can be used to create the array argument of the {@link<a name="line.262"></a>
266 <FONT color="green">263</FONT> * #BlockFieldMatrix(int, int, FieldElement[][], boolean)}<a name="line.263"></a>
267 <FONT color="green">264</FONT> * constructor.<a name="line.264"></a>
268 <FONT color="green">265</FONT> * &lt;/p&gt;<a name="line.265"></a>
269 <FONT color="green">266</FONT> * @param &lt;T&gt; the type of the field elements<a name="line.266"></a>
270 <FONT color="green">267</FONT> * @param field field to which the elements belong<a name="line.267"></a>
271 <FONT color="green">268</FONT> * @param rows the number of rows in the new matrix<a name="line.268"></a>
272 <FONT color="green">269</FONT> * @param columns the number of columns in the new matrix<a name="line.269"></a>
273 <FONT color="green">270</FONT> * @return a new data array in blocks layout<a name="line.270"></a>
274 <FONT color="green">271</FONT> * @see #toBlocksLayout(FieldElement[][])<a name="line.271"></a>
275 <FONT color="green">272</FONT> * @see #BlockFieldMatrix(int, int, FieldElement[][], boolean)<a name="line.272"></a>
276 <FONT color="green">273</FONT> */<a name="line.273"></a>
277 <FONT color="green">274</FONT> public static &lt;T extends FieldElement&lt;T&gt;&gt; T[][] createBlocksLayout(final Field&lt;T&gt; field,<a name="line.274"></a>
278 <FONT color="green">275</FONT> final int rows, final int columns) {<a name="line.275"></a>
279 <FONT color="green">276</FONT> <a name="line.276"></a>
280 <FONT color="green">277</FONT> final int blockRows = (rows + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.277"></a>
281 <FONT color="green">278</FONT> final int blockColumns = (columns + BLOCK_SIZE - 1) / BLOCK_SIZE;<a name="line.278"></a>
282 <FONT color="green">279</FONT> <a name="line.279"></a>
283 <FONT color="green">280</FONT> final T[][] blocks = buildArray(field, blockRows * blockColumns, -1);<a name="line.280"></a>
284 <FONT color="green">281</FONT> int blockIndex = 0;<a name="line.281"></a>
285 <FONT color="green">282</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.282"></a>
286 <FONT color="green">283</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.283"></a>
287 <FONT color="green">284</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.284"></a>
288 <FONT color="green">285</FONT> final int iHeight = pEnd - pStart;<a name="line.285"></a>
289 <FONT color="green">286</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.286"></a>
290 <FONT color="green">287</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.287"></a>
291 <FONT color="green">288</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.288"></a>
292 <FONT color="green">289</FONT> final int jWidth = qEnd - qStart;<a name="line.289"></a>
293 <FONT color="green">290</FONT> blocks[blockIndex] = buildArray(field, iHeight * jWidth);<a name="line.290"></a>
294 <FONT color="green">291</FONT> ++blockIndex;<a name="line.291"></a>
295 <FONT color="green">292</FONT> }<a name="line.292"></a>
296 <FONT color="green">293</FONT> }<a name="line.293"></a>
297 <FONT color="green">294</FONT> <a name="line.294"></a>
298 <FONT color="green">295</FONT> return blocks;<a name="line.295"></a>
299 <FONT color="green">296</FONT> <a name="line.296"></a>
300 <FONT color="green">297</FONT> }<a name="line.297"></a>
301 <FONT color="green">298</FONT> <a name="line.298"></a>
302 <FONT color="green">299</FONT> /** {@inheritDoc} */<a name="line.299"></a>
303 <FONT color="green">300</FONT> @Override<a name="line.300"></a>
304 <FONT color="green">301</FONT> public FieldMatrix&lt;T&gt; createMatrix(final int rowDimension, final int columnDimension)<a name="line.301"></a>
305 <FONT color="green">302</FONT> throws IllegalArgumentException {<a name="line.302"></a>
306 <FONT color="green">303</FONT> return new BlockFieldMatrix&lt;T&gt;(getField(), rowDimension, columnDimension);<a name="line.303"></a>
307 <FONT color="green">304</FONT> }<a name="line.304"></a>
308 <FONT color="green">305</FONT> <a name="line.305"></a>
309 <FONT color="green">306</FONT> /** {@inheritDoc} */<a name="line.306"></a>
310 <FONT color="green">307</FONT> @Override<a name="line.307"></a>
311 <FONT color="green">308</FONT> public FieldMatrix&lt;T&gt; copy() {<a name="line.308"></a>
312 <FONT color="green">309</FONT> <a name="line.309"></a>
313 <FONT color="green">310</FONT> // create an empty matrix<a name="line.310"></a>
314 <FONT color="green">311</FONT> BlockFieldMatrix&lt;T&gt; copied = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.311"></a>
315 <FONT color="green">312</FONT> <a name="line.312"></a>
316 <FONT color="green">313</FONT> // copy the blocks<a name="line.313"></a>
317 <FONT color="green">314</FONT> for (int i = 0; i &lt; blocks.length; ++i) {<a name="line.314"></a>
318 <FONT color="green">315</FONT> System.arraycopy(blocks[i], 0, copied.blocks[i], 0, blocks[i].length);<a name="line.315"></a>
319 <FONT color="green">316</FONT> }<a name="line.316"></a>
320 <FONT color="green">317</FONT> <a name="line.317"></a>
321 <FONT color="green">318</FONT> return copied;<a name="line.318"></a>
322 <FONT color="green">319</FONT> <a name="line.319"></a>
323 <FONT color="green">320</FONT> }<a name="line.320"></a>
324 <FONT color="green">321</FONT> <a name="line.321"></a>
325 <FONT color="green">322</FONT> /** {@inheritDoc} */<a name="line.322"></a>
326 <FONT color="green">323</FONT> @Override<a name="line.323"></a>
327 <FONT color="green">324</FONT> public FieldMatrix&lt;T&gt; add(final FieldMatrix&lt;T&gt; m)<a name="line.324"></a>
328 <FONT color="green">325</FONT> throws IllegalArgumentException {<a name="line.325"></a>
329 <FONT color="green">326</FONT> try {<a name="line.326"></a>
330 <FONT color="green">327</FONT> return add((BlockFieldMatrix&lt;T&gt;) m);<a name="line.327"></a>
331 <FONT color="green">328</FONT> } catch (ClassCastException cce) {<a name="line.328"></a>
332 <FONT color="green">329</FONT> <a name="line.329"></a>
333 <FONT color="green">330</FONT> // safety check<a name="line.330"></a>
334 <FONT color="green">331</FONT> checkAdditionCompatible(m);<a name="line.331"></a>
335 <FONT color="green">332</FONT> <a name="line.332"></a>
336 <FONT color="green">333</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.333"></a>
337 <FONT color="green">334</FONT> <a name="line.334"></a>
338 <FONT color="green">335</FONT> // perform addition block-wise, to ensure good cache behavior<a name="line.335"></a>
339 <FONT color="green">336</FONT> int blockIndex = 0;<a name="line.336"></a>
340 <FONT color="green">337</FONT> for (int iBlock = 0; iBlock &lt; out.blockRows; ++iBlock) {<a name="line.337"></a>
341 <FONT color="green">338</FONT> for (int jBlock = 0; jBlock &lt; out.blockColumns; ++jBlock) {<a name="line.338"></a>
342 <FONT color="green">339</FONT> <a name="line.339"></a>
343 <FONT color="green">340</FONT> // perform addition on the current block<a name="line.340"></a>
344 <FONT color="green">341</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.341"></a>
345 <FONT color="green">342</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.342"></a>
346 <FONT color="green">343</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.343"></a>
347 <FONT color="green">344</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.344"></a>
348 <FONT color="green">345</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.345"></a>
349 <FONT color="green">346</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.346"></a>
350 <FONT color="green">347</FONT> int k = 0;<a name="line.347"></a>
351 <FONT color="green">348</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.348"></a>
352 <FONT color="green">349</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.349"></a>
353 <FONT color="green">350</FONT> outBlock[k] = tBlock[k].add(m.getEntry(p, q));<a name="line.350"></a>
354 <FONT color="green">351</FONT> ++k;<a name="line.351"></a>
355 <FONT color="green">352</FONT> }<a name="line.352"></a>
356 <FONT color="green">353</FONT> }<a name="line.353"></a>
357 <FONT color="green">354</FONT> <a name="line.354"></a>
358 <FONT color="green">355</FONT> // go to next block<a name="line.355"></a>
359 <FONT color="green">356</FONT> ++blockIndex;<a name="line.356"></a>
360 <FONT color="green">357</FONT> <a name="line.357"></a>
361 <FONT color="green">358</FONT> }<a name="line.358"></a>
362 <FONT color="green">359</FONT> }<a name="line.359"></a>
363 <FONT color="green">360</FONT> <a name="line.360"></a>
364 <FONT color="green">361</FONT> return out;<a name="line.361"></a>
365 <FONT color="green">362</FONT> <a name="line.362"></a>
366 <FONT color="green">363</FONT> }<a name="line.363"></a>
367 <FONT color="green">364</FONT> }<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> * Compute the sum of this and &lt;code&gt;m&lt;/code&gt;.<a name="line.367"></a>
371 <FONT color="green">368</FONT> *<a name="line.368"></a>
372 <FONT color="green">369</FONT> * @param m matrix to be added<a name="line.369"></a>
373 <FONT color="green">370</FONT> * @return this + m<a name="line.370"></a>
374 <FONT color="green">371</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.371"></a>
375 <FONT color="green">372</FONT> */<a name="line.372"></a>
376 <FONT color="green">373</FONT> public BlockFieldMatrix&lt;T&gt; add(final BlockFieldMatrix&lt;T&gt; m)<a name="line.373"></a>
377 <FONT color="green">374</FONT> throws IllegalArgumentException {<a name="line.374"></a>
378 <FONT color="green">375</FONT> <a name="line.375"></a>
379 <FONT color="green">376</FONT> // safety check<a name="line.376"></a>
380 <FONT color="green">377</FONT> checkAdditionCompatible(m);<a name="line.377"></a>
381 <FONT color="green">378</FONT> <a name="line.378"></a>
382 <FONT color="green">379</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.379"></a>
383 <FONT color="green">380</FONT> <a name="line.380"></a>
384 <FONT color="green">381</FONT> // perform addition block-wise, to ensure good cache behavior<a name="line.381"></a>
385 <FONT color="green">382</FONT> for (int blockIndex = 0; blockIndex &lt; out.blocks.length; ++blockIndex) {<a name="line.382"></a>
386 <FONT color="green">383</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.383"></a>
387 <FONT color="green">384</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.384"></a>
388 <FONT color="green">385</FONT> final T[] mBlock = m.blocks[blockIndex];<a name="line.385"></a>
389 <FONT color="green">386</FONT> for (int k = 0; k &lt; outBlock.length; ++k) {<a name="line.386"></a>
390 <FONT color="green">387</FONT> outBlock[k] = tBlock[k].add(mBlock[k]);<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> <a name="line.390"></a>
394 <FONT color="green">391</FONT> return out;<a name="line.391"></a>
395 <FONT color="green">392</FONT> <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> @Override<a name="line.396"></a>
400 <FONT color="green">397</FONT> public FieldMatrix&lt;T&gt; subtract(final FieldMatrix&lt;T&gt; m)<a name="line.397"></a>
401 <FONT color="green">398</FONT> throws IllegalArgumentException {<a name="line.398"></a>
402 <FONT color="green">399</FONT> try {<a name="line.399"></a>
403 <FONT color="green">400</FONT> return subtract((BlockFieldMatrix&lt;T&gt;) m);<a name="line.400"></a>
404 <FONT color="green">401</FONT> } catch (ClassCastException cce) {<a name="line.401"></a>
405 <FONT color="green">402</FONT> <a name="line.402"></a>
406 <FONT color="green">403</FONT> // safety check<a name="line.403"></a>
407 <FONT color="green">404</FONT> checkSubtractionCompatible(m);<a name="line.404"></a>
408 <FONT color="green">405</FONT> <a name="line.405"></a>
409 <FONT color="green">406</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.406"></a>
410 <FONT color="green">407</FONT> <a name="line.407"></a>
411 <FONT color="green">408</FONT> // perform subtraction block-wise, to ensure good cache behavior<a name="line.408"></a>
412 <FONT color="green">409</FONT> int blockIndex = 0;<a name="line.409"></a>
413 <FONT color="green">410</FONT> for (int iBlock = 0; iBlock &lt; out.blockRows; ++iBlock) {<a name="line.410"></a>
414 <FONT color="green">411</FONT> for (int jBlock = 0; jBlock &lt; out.blockColumns; ++jBlock) {<a name="line.411"></a>
415 <FONT color="green">412</FONT> <a name="line.412"></a>
416 <FONT color="green">413</FONT> // perform subtraction on the current block<a name="line.413"></a>
417 <FONT color="green">414</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.414"></a>
418 <FONT color="green">415</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.415"></a>
419 <FONT color="green">416</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.416"></a>
420 <FONT color="green">417</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.417"></a>
421 <FONT color="green">418</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.418"></a>
422 <FONT color="green">419</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.419"></a>
423 <FONT color="green">420</FONT> int k = 0;<a name="line.420"></a>
424 <FONT color="green">421</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.421"></a>
425 <FONT color="green">422</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.422"></a>
426 <FONT color="green">423</FONT> outBlock[k] = tBlock[k].subtract(m.getEntry(p, q));<a name="line.423"></a>
427 <FONT color="green">424</FONT> ++k;<a name="line.424"></a>
428 <FONT color="green">425</FONT> }<a name="line.425"></a>
429 <FONT color="green">426</FONT> }<a name="line.426"></a>
430 <FONT color="green">427</FONT> <a name="line.427"></a>
431 <FONT color="green">428</FONT> // go to next block<a name="line.428"></a>
432 <FONT color="green">429</FONT> ++blockIndex;<a name="line.429"></a>
433 <FONT color="green">430</FONT> <a name="line.430"></a>
434 <FONT color="green">431</FONT> }<a name="line.431"></a>
435 <FONT color="green">432</FONT> }<a name="line.432"></a>
436 <FONT color="green">433</FONT> <a name="line.433"></a>
437 <FONT color="green">434</FONT> return out;<a name="line.434"></a>
438 <FONT color="green">435</FONT> <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> <a name="line.438"></a>
442 <FONT color="green">439</FONT> /**<a name="line.439"></a>
443 <FONT color="green">440</FONT> * Compute this minus &lt;code&gt;m&lt;/code&gt;.<a name="line.440"></a>
444 <FONT color="green">441</FONT> *<a name="line.441"></a>
445 <FONT color="green">442</FONT> * @param m matrix to be subtracted<a name="line.442"></a>
446 <FONT color="green">443</FONT> * @return this - m<a name="line.443"></a>
447 <FONT color="green">444</FONT> * @throws IllegalArgumentException if m is not the same size as this<a name="line.444"></a>
448 <FONT color="green">445</FONT> */<a name="line.445"></a>
449 <FONT color="green">446</FONT> public BlockFieldMatrix&lt;T&gt; subtract(final BlockFieldMatrix&lt;T&gt; m)<a name="line.446"></a>
450 <FONT color="green">447</FONT> throws IllegalArgumentException {<a name="line.447"></a>
451 <FONT color="green">448</FONT> <a name="line.448"></a>
452 <FONT color="green">449</FONT> // safety check<a name="line.449"></a>
453 <FONT color="green">450</FONT> checkSubtractionCompatible(m);<a name="line.450"></a>
454 <FONT color="green">451</FONT> <a name="line.451"></a>
455 <FONT color="green">452</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.452"></a>
456 <FONT color="green">453</FONT> <a name="line.453"></a>
457 <FONT color="green">454</FONT> // perform subtraction block-wise, to ensure good cache behavior<a name="line.454"></a>
458 <FONT color="green">455</FONT> for (int blockIndex = 0; blockIndex &lt; out.blocks.length; ++blockIndex) {<a name="line.455"></a>
459 <FONT color="green">456</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.456"></a>
460 <FONT color="green">457</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.457"></a>
461 <FONT color="green">458</FONT> final T[] mBlock = m.blocks[blockIndex];<a name="line.458"></a>
462 <FONT color="green">459</FONT> for (int k = 0; k &lt; outBlock.length; ++k) {<a name="line.459"></a>
463 <FONT color="green">460</FONT> outBlock[k] = tBlock[k].subtract(mBlock[k]);<a name="line.460"></a>
464 <FONT color="green">461</FONT> }<a name="line.461"></a>
465 <FONT color="green">462</FONT> }<a name="line.462"></a>
466 <FONT color="green">463</FONT> <a name="line.463"></a>
467 <FONT color="green">464</FONT> return out;<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> <a name="line.467"></a>
471 <FONT color="green">468</FONT> /** {@inheritDoc} */<a name="line.468"></a>
472 <FONT color="green">469</FONT> @Override<a name="line.469"></a>
473 <FONT color="green">470</FONT> public FieldMatrix&lt;T&gt; scalarAdd(final T d)<a name="line.470"></a>
474 <FONT color="green">471</FONT> throws IllegalArgumentException {<a name="line.471"></a>
475 <FONT color="green">472</FONT> <a name="line.472"></a>
476 <FONT color="green">473</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.473"></a>
477 <FONT color="green">474</FONT> <a name="line.474"></a>
478 <FONT color="green">475</FONT> // perform subtraction block-wise, to ensure good cache behavior<a name="line.475"></a>
479 <FONT color="green">476</FONT> for (int blockIndex = 0; blockIndex &lt; out.blocks.length; ++blockIndex) {<a name="line.476"></a>
480 <FONT color="green">477</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.477"></a>
481 <FONT color="green">478</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.478"></a>
482 <FONT color="green">479</FONT> for (int k = 0; k &lt; outBlock.length; ++k) {<a name="line.479"></a>
483 <FONT color="green">480</FONT> outBlock[k] = tBlock[k].add(d);<a name="line.480"></a>
484 <FONT color="green">481</FONT> }<a name="line.481"></a>
485 <FONT color="green">482</FONT> }<a name="line.482"></a>
486 <FONT color="green">483</FONT> <a name="line.483"></a>
487 <FONT color="green">484</FONT> return out;<a name="line.484"></a>
488 <FONT color="green">485</FONT> <a name="line.485"></a>
489 <FONT color="green">486</FONT> }<a name="line.486"></a>
490 <FONT color="green">487</FONT> <a name="line.487"></a>
491 <FONT color="green">488</FONT> /** {@inheritDoc} */<a name="line.488"></a>
492 <FONT color="green">489</FONT> @Override<a name="line.489"></a>
493 <FONT color="green">490</FONT> public FieldMatrix&lt;T&gt; scalarMultiply(final T d)<a name="line.490"></a>
494 <FONT color="green">491</FONT> throws IllegalArgumentException {<a name="line.491"></a>
495 <FONT color="green">492</FONT> <a name="line.492"></a>
496 <FONT color="green">493</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, columns);<a name="line.493"></a>
497 <FONT color="green">494</FONT> <a name="line.494"></a>
498 <FONT color="green">495</FONT> // perform subtraction block-wise, to ensure good cache behavior<a name="line.495"></a>
499 <FONT color="green">496</FONT> for (int blockIndex = 0; blockIndex &lt; out.blocks.length; ++blockIndex) {<a name="line.496"></a>
500 <FONT color="green">497</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.497"></a>
501 <FONT color="green">498</FONT> final T[] tBlock = blocks[blockIndex];<a name="line.498"></a>
502 <FONT color="green">499</FONT> for (int k = 0; k &lt; outBlock.length; ++k) {<a name="line.499"></a>
503 <FONT color="green">500</FONT> outBlock[k] = tBlock[k].multiply(d);<a name="line.500"></a>
504 <FONT color="green">501</FONT> }<a name="line.501"></a>
505 <FONT color="green">502</FONT> }<a name="line.502"></a>
506 <FONT color="green">503</FONT> <a name="line.503"></a>
507 <FONT color="green">504</FONT> return out;<a name="line.504"></a>
508 <FONT color="green">505</FONT> <a name="line.505"></a>
509 <FONT color="green">506</FONT> }<a name="line.506"></a>
510 <FONT color="green">507</FONT> <a name="line.507"></a>
511 <FONT color="green">508</FONT> /** {@inheritDoc} */<a name="line.508"></a>
512 <FONT color="green">509</FONT> @Override<a name="line.509"></a>
513 <FONT color="green">510</FONT> public FieldMatrix&lt;T&gt; multiply(final FieldMatrix&lt;T&gt; m)<a name="line.510"></a>
514 <FONT color="green">511</FONT> throws IllegalArgumentException {<a name="line.511"></a>
515 <FONT color="green">512</FONT> try {<a name="line.512"></a>
516 <FONT color="green">513</FONT> return multiply((BlockFieldMatrix&lt;T&gt;) m);<a name="line.513"></a>
517 <FONT color="green">514</FONT> } catch (ClassCastException cce) {<a name="line.514"></a>
518 <FONT color="green">515</FONT> <a name="line.515"></a>
519 <FONT color="green">516</FONT> // safety check<a name="line.516"></a>
520 <FONT color="green">517</FONT> checkMultiplicationCompatible(m);<a name="line.517"></a>
521 <FONT color="green">518</FONT> <a name="line.518"></a>
522 <FONT color="green">519</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, m.getColumnDimension());<a name="line.519"></a>
523 <FONT color="green">520</FONT> final T zero = getField().getZero();<a name="line.520"></a>
524 <FONT color="green">521</FONT> <a name="line.521"></a>
525 <FONT color="green">522</FONT> // perform multiplication block-wise, to ensure good cache behavior<a name="line.522"></a>
526 <FONT color="green">523</FONT> int blockIndex = 0;<a name="line.523"></a>
527 <FONT color="green">524</FONT> for (int iBlock = 0; iBlock &lt; out.blockRows; ++iBlock) {<a name="line.524"></a>
528 <FONT color="green">525</FONT> <a name="line.525"></a>
529 <FONT color="green">526</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.526"></a>
530 <FONT color="green">527</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.527"></a>
531 <FONT color="green">528</FONT> <a name="line.528"></a>
532 <FONT color="green">529</FONT> for (int jBlock = 0; jBlock &lt; out.blockColumns; ++jBlock) {<a name="line.529"></a>
533 <FONT color="green">530</FONT> <a name="line.530"></a>
534 <FONT color="green">531</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.531"></a>
535 <FONT color="green">532</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, m.getColumnDimension());<a name="line.532"></a>
536 <FONT color="green">533</FONT> <a name="line.533"></a>
537 <FONT color="green">534</FONT> // select current block<a name="line.534"></a>
538 <FONT color="green">535</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.535"></a>
539 <FONT color="green">536</FONT> <a name="line.536"></a>
540 <FONT color="green">537</FONT> // perform multiplication on current block<a name="line.537"></a>
541 <FONT color="green">538</FONT> for (int kBlock = 0; kBlock &lt; blockColumns; ++kBlock) {<a name="line.538"></a>
542 <FONT color="green">539</FONT> final int kWidth = blockWidth(kBlock);<a name="line.539"></a>
543 <FONT color="green">540</FONT> final T[] tBlock = blocks[iBlock * blockColumns + kBlock];<a name="line.540"></a>
544 <FONT color="green">541</FONT> final int rStart = kBlock * BLOCK_SIZE;<a name="line.541"></a>
545 <FONT color="green">542</FONT> int k = 0;<a name="line.542"></a>
546 <FONT color="green">543</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.543"></a>
547 <FONT color="green">544</FONT> final int lStart = (p - pStart) * kWidth;<a name="line.544"></a>
548 <FONT color="green">545</FONT> final int lEnd = lStart + kWidth;<a name="line.545"></a>
549 <FONT color="green">546</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.546"></a>
550 <FONT color="green">547</FONT> T sum = zero;<a name="line.547"></a>
551 <FONT color="green">548</FONT> int r = rStart;<a name="line.548"></a>
552 <FONT color="green">549</FONT> for (int l = lStart; l &lt; lEnd; ++l) {<a name="line.549"></a>
553 <FONT color="green">550</FONT> sum = sum.add(tBlock[l].multiply(m.getEntry(r, q)));<a name="line.550"></a>
554 <FONT color="green">551</FONT> ++r;<a name="line.551"></a>
555 <FONT color="green">552</FONT> }<a name="line.552"></a>
556 <FONT color="green">553</FONT> outBlock[k] = outBlock[k].add(sum);<a name="line.553"></a>
557 <FONT color="green">554</FONT> ++k;<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> <a name="line.558"></a>
562 <FONT color="green">559</FONT> // go to next block<a name="line.559"></a>
563 <FONT color="green">560</FONT> ++blockIndex;<a name="line.560"></a>
564 <FONT color="green">561</FONT> <a name="line.561"></a>
565 <FONT color="green">562</FONT> }<a name="line.562"></a>
566 <FONT color="green">563</FONT> }<a name="line.563"></a>
567 <FONT color="green">564</FONT> <a name="line.564"></a>
568 <FONT color="green">565</FONT> return out;<a name="line.565"></a>
569 <FONT color="green">566</FONT> <a name="line.566"></a>
570 <FONT color="green">567</FONT> }<a name="line.567"></a>
571 <FONT color="green">568</FONT> }<a name="line.568"></a>
572 <FONT color="green">569</FONT> <a name="line.569"></a>
573 <FONT color="green">570</FONT> /**<a name="line.570"></a>
574 <FONT color="green">571</FONT> * Returns the result of postmultiplying this by m.<a name="line.571"></a>
575 <FONT color="green">572</FONT> *<a name="line.572"></a>
576 <FONT color="green">573</FONT> * @param m matrix to postmultiply by<a name="line.573"></a>
577 <FONT color="green">574</FONT> * @return this * m<a name="line.574"></a>
578 <FONT color="green">575</FONT> * @throws IllegalArgumentException<a name="line.575"></a>
579 <FONT color="green">576</FONT> * if columnDimension(this) != rowDimension(m)<a name="line.576"></a>
580 <FONT color="green">577</FONT> */<a name="line.577"></a>
581 <FONT color="green">578</FONT> public BlockFieldMatrix&lt;T&gt; multiply(BlockFieldMatrix&lt;T&gt; m) throws IllegalArgumentException {<a name="line.578"></a>
582 <FONT color="green">579</FONT> <a name="line.579"></a>
583 <FONT color="green">580</FONT> // safety check<a name="line.580"></a>
584 <FONT color="green">581</FONT> checkMultiplicationCompatible(m);<a name="line.581"></a>
585 <FONT color="green">582</FONT> <a name="line.582"></a>
586 <FONT color="green">583</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, m.columns);<a name="line.583"></a>
587 <FONT color="green">584</FONT> final T zero = getField().getZero();<a name="line.584"></a>
588 <FONT color="green">585</FONT> <a name="line.585"></a>
589 <FONT color="green">586</FONT> // perform multiplication block-wise, to ensure good cache behavior<a name="line.586"></a>
590 <FONT color="green">587</FONT> int blockIndex = 0;<a name="line.587"></a>
591 <FONT color="green">588</FONT> for (int iBlock = 0; iBlock &lt; out.blockRows; ++iBlock) {<a name="line.588"></a>
592 <FONT color="green">589</FONT> <a name="line.589"></a>
593 <FONT color="green">590</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.590"></a>
594 <FONT color="green">591</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.591"></a>
595 <FONT color="green">592</FONT> <a name="line.592"></a>
596 <FONT color="green">593</FONT> for (int jBlock = 0; jBlock &lt; out.blockColumns; ++jBlock) {<a name="line.593"></a>
597 <FONT color="green">594</FONT> final int jWidth = out.blockWidth(jBlock);<a name="line.594"></a>
598 <FONT color="green">595</FONT> final int jWidth2 = jWidth + jWidth;<a name="line.595"></a>
599 <FONT color="green">596</FONT> final int jWidth3 = jWidth2 + jWidth;<a name="line.596"></a>
600 <FONT color="green">597</FONT> final int jWidth4 = jWidth3 + jWidth;<a name="line.597"></a>
601 <FONT color="green">598</FONT> <a name="line.598"></a>
602 <FONT color="green">599</FONT> // select current block<a name="line.599"></a>
603 <FONT color="green">600</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.600"></a>
604 <FONT color="green">601</FONT> <a name="line.601"></a>
605 <FONT color="green">602</FONT> // perform multiplication on current block<a name="line.602"></a>
606 <FONT color="green">603</FONT> for (int kBlock = 0; kBlock &lt; blockColumns; ++kBlock) {<a name="line.603"></a>
607 <FONT color="green">604</FONT> final int kWidth = blockWidth(kBlock);<a name="line.604"></a>
608 <FONT color="green">605</FONT> final T[] tBlock = blocks[iBlock * blockColumns + kBlock];<a name="line.605"></a>
609 <FONT color="green">606</FONT> final T[] mBlock = m.blocks[kBlock * m.blockColumns + jBlock];<a name="line.606"></a>
610 <FONT color="green">607</FONT> int k = 0;<a name="line.607"></a>
611 <FONT color="green">608</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.608"></a>
612 <FONT color="green">609</FONT> final int lStart = (p - pStart) * kWidth;<a name="line.609"></a>
613 <FONT color="green">610</FONT> final int lEnd = lStart + kWidth;<a name="line.610"></a>
614 <FONT color="green">611</FONT> for (int nStart = 0; nStart &lt; jWidth; ++nStart) {<a name="line.611"></a>
615 <FONT color="green">612</FONT> T sum = zero;<a name="line.612"></a>
616 <FONT color="green">613</FONT> int l = lStart;<a name="line.613"></a>
617 <FONT color="green">614</FONT> int n = nStart;<a name="line.614"></a>
618 <FONT color="green">615</FONT> while (l &lt; lEnd - 3) {<a name="line.615"></a>
619 <FONT color="green">616</FONT> sum = sum.<a name="line.616"></a>
620 <FONT color="green">617</FONT> add(tBlock[l].multiply(mBlock[n])).<a name="line.617"></a>
621 <FONT color="green">618</FONT> add(tBlock[l + 1].multiply(mBlock[n + jWidth])).<a name="line.618"></a>
622 <FONT color="green">619</FONT> add(tBlock[l + 2].multiply(mBlock[n + jWidth2])).<a name="line.619"></a>
623 <FONT color="green">620</FONT> add(tBlock[l + 3].multiply(mBlock[n + jWidth3]));<a name="line.620"></a>
624 <FONT color="green">621</FONT> l += 4;<a name="line.621"></a>
625 <FONT color="green">622</FONT> n += jWidth4;<a name="line.622"></a>
626 <FONT color="green">623</FONT> }<a name="line.623"></a>
627 <FONT color="green">624</FONT> while (l &lt; lEnd) {<a name="line.624"></a>
628 <FONT color="green">625</FONT> sum = sum.add(tBlock[l++].multiply(mBlock[n]));<a name="line.625"></a>
629 <FONT color="green">626</FONT> n += jWidth;<a name="line.626"></a>
630 <FONT color="green">627</FONT> }<a name="line.627"></a>
631 <FONT color="green">628</FONT> outBlock[k] = outBlock[k].add(sum);<a name="line.628"></a>
632 <FONT color="green">629</FONT> ++k;<a name="line.629"></a>
633 <FONT color="green">630</FONT> }<a name="line.630"></a>
634 <FONT color="green">631</FONT> }<a name="line.631"></a>
635 <FONT color="green">632</FONT> }<a name="line.632"></a>
636 <FONT color="green">633</FONT> <a name="line.633"></a>
637 <FONT color="green">634</FONT> // go to next block<a name="line.634"></a>
638 <FONT color="green">635</FONT> ++blockIndex;<a name="line.635"></a>
639 <FONT color="green">636</FONT> <a name="line.636"></a>
640 <FONT color="green">637</FONT> }<a name="line.637"></a>
641 <FONT color="green">638</FONT> }<a name="line.638"></a>
642 <FONT color="green">639</FONT> <a name="line.639"></a>
643 <FONT color="green">640</FONT> return out;<a name="line.640"></a>
644 <FONT color="green">641</FONT> <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> /** {@inheritDoc} */<a name="line.644"></a>
648 <FONT color="green">645</FONT> @Override<a name="line.645"></a>
649 <FONT color="green">646</FONT> public T[][] getData() {<a name="line.646"></a>
650 <FONT color="green">647</FONT> <a name="line.647"></a>
651 <FONT color="green">648</FONT> final T[][] data = buildArray(getField(), getRowDimension(), getColumnDimension());<a name="line.648"></a>
652 <FONT color="green">649</FONT> final int lastColumns = columns - (blockColumns - 1) * BLOCK_SIZE;<a name="line.649"></a>
653 <FONT color="green">650</FONT> <a name="line.650"></a>
654 <FONT color="green">651</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.651"></a>
655 <FONT color="green">652</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.652"></a>
656 <FONT color="green">653</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.653"></a>
657 <FONT color="green">654</FONT> int regularPos = 0;<a name="line.654"></a>
658 <FONT color="green">655</FONT> int lastPos = 0;<a name="line.655"></a>
659 <FONT color="green">656</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.656"></a>
660 <FONT color="green">657</FONT> final T[] dataP = data[p];<a name="line.657"></a>
661 <FONT color="green">658</FONT> int blockIndex = iBlock * blockColumns;<a name="line.658"></a>
662 <FONT color="green">659</FONT> int dataPos = 0;<a name="line.659"></a>
663 <FONT color="green">660</FONT> for (int jBlock = 0; jBlock &lt; blockColumns - 1; ++jBlock) {<a name="line.660"></a>
664 <FONT color="green">661</FONT> System.arraycopy(blocks[blockIndex++], regularPos, dataP, dataPos, BLOCK_SIZE);<a name="line.661"></a>
665 <FONT color="green">662</FONT> dataPos += BLOCK_SIZE;<a name="line.662"></a>
666 <FONT color="green">663</FONT> }<a name="line.663"></a>
667 <FONT color="green">664</FONT> System.arraycopy(blocks[blockIndex], lastPos, dataP, dataPos, lastColumns);<a name="line.664"></a>
668 <FONT color="green">665</FONT> regularPos += BLOCK_SIZE;<a name="line.665"></a>
669 <FONT color="green">666</FONT> lastPos += lastColumns;<a name="line.666"></a>
670 <FONT color="green">667</FONT> }<a name="line.667"></a>
671 <FONT color="green">668</FONT> }<a name="line.668"></a>
672 <FONT color="green">669</FONT> <a name="line.669"></a>
673 <FONT color="green">670</FONT> return data;<a name="line.670"></a>
674 <FONT color="green">671</FONT> <a name="line.671"></a>
675 <FONT color="green">672</FONT> }<a name="line.672"></a>
676 <FONT color="green">673</FONT> <a name="line.673"></a>
677 <FONT color="green">674</FONT> /** {@inheritDoc} */<a name="line.674"></a>
678 <FONT color="green">675</FONT> @Override<a name="line.675"></a>
679 <FONT color="green">676</FONT> public FieldMatrix&lt;T&gt; getSubMatrix(final int startRow, final int endRow,<a name="line.676"></a>
680 <FONT color="green">677</FONT> final int startColumn, final int endColumn)<a name="line.677"></a>
681 <FONT color="green">678</FONT> throws MatrixIndexException {<a name="line.678"></a>
682 <FONT color="green">679</FONT> <a name="line.679"></a>
683 <FONT color="green">680</FONT> // safety checks<a name="line.680"></a>
684 <FONT color="green">681</FONT> checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);<a name="line.681"></a>
685 <FONT color="green">682</FONT> <a name="line.682"></a>
686 <FONT color="green">683</FONT> // create the output matrix<a name="line.683"></a>
687 <FONT color="green">684</FONT> final BlockFieldMatrix&lt;T&gt; out =<a name="line.684"></a>
688 <FONT color="green">685</FONT> new BlockFieldMatrix&lt;T&gt;(getField(), endRow - startRow + 1, endColumn - startColumn + 1);<a name="line.685"></a>
689 <FONT color="green">686</FONT> <a name="line.686"></a>
690 <FONT color="green">687</FONT> // compute blocks shifts<a name="line.687"></a>
691 <FONT color="green">688</FONT> final int blockStartRow = startRow / BLOCK_SIZE;<a name="line.688"></a>
692 <FONT color="green">689</FONT> final int rowsShift = startRow % BLOCK_SIZE;<a name="line.689"></a>
693 <FONT color="green">690</FONT> final int blockStartColumn = startColumn / BLOCK_SIZE;<a name="line.690"></a>
694 <FONT color="green">691</FONT> final int columnsShift = startColumn % BLOCK_SIZE;<a name="line.691"></a>
695 <FONT color="green">692</FONT> <a name="line.692"></a>
696 <FONT color="green">693</FONT> // perform extraction block-wise, to ensure good cache behavior<a name="line.693"></a>
697 <FONT color="green">694</FONT> int pBlock = blockStartRow;<a name="line.694"></a>
698 <FONT color="green">695</FONT> for (int iBlock = 0; iBlock &lt; out.blockRows; ++iBlock) {<a name="line.695"></a>
699 <FONT color="green">696</FONT> final int iHeight = out.blockHeight(iBlock);<a name="line.696"></a>
700 <FONT color="green">697</FONT> int qBlock = blockStartColumn;<a name="line.697"></a>
701 <FONT color="green">698</FONT> for (int jBlock = 0; jBlock &lt; out.blockColumns; ++jBlock) {<a name="line.698"></a>
702 <FONT color="green">699</FONT> final int jWidth = out.blockWidth(jBlock);<a name="line.699"></a>
703 <FONT color="green">700</FONT> <a name="line.700"></a>
704 <FONT color="green">701</FONT> // handle one block of the output matrix<a name="line.701"></a>
705 <FONT color="green">702</FONT> final int outIndex = iBlock * out.blockColumns + jBlock;<a name="line.702"></a>
706 <FONT color="green">703</FONT> final T[] outBlock = out.blocks[outIndex];<a name="line.703"></a>
707 <FONT color="green">704</FONT> final int index = pBlock * blockColumns + qBlock;<a name="line.704"></a>
708 <FONT color="green">705</FONT> final int width = blockWidth(qBlock);<a name="line.705"></a>
709 <FONT color="green">706</FONT> <a name="line.706"></a>
710 <FONT color="green">707</FONT> final int heightExcess = iHeight + rowsShift - BLOCK_SIZE;<a name="line.707"></a>
711 <FONT color="green">708</FONT> final int widthExcess = jWidth + columnsShift - BLOCK_SIZE;<a name="line.708"></a>
712 <FONT color="green">709</FONT> if (heightExcess &gt; 0) {<a name="line.709"></a>
713 <FONT color="green">710</FONT> // the submatrix block spans on two blocks rows from the original matrix<a name="line.710"></a>
714 <FONT color="green">711</FONT> if (widthExcess &gt; 0) {<a name="line.711"></a>
715 <FONT color="green">712</FONT> // the submatrix block spans on two blocks columns from the original matrix<a name="line.712"></a>
716 <FONT color="green">713</FONT> final int width2 = blockWidth(qBlock + 1);<a name="line.713"></a>
717 <FONT color="green">714</FONT> copyBlockPart(blocks[index], width,<a name="line.714"></a>
718 <FONT color="green">715</FONT> rowsShift, BLOCK_SIZE,<a name="line.715"></a>
719 <FONT color="green">716</FONT> columnsShift, BLOCK_SIZE,<a name="line.716"></a>
720 <FONT color="green">717</FONT> outBlock, jWidth, 0, 0);<a name="line.717"></a>
721 <FONT color="green">718</FONT> copyBlockPart(blocks[index + 1], width2,<a name="line.718"></a>
722 <FONT color="green">719</FONT> rowsShift, BLOCK_SIZE,<a name="line.719"></a>
723 <FONT color="green">720</FONT> 0, widthExcess,<a name="line.720"></a>
724 <FONT color="green">721</FONT> outBlock, jWidth, 0, jWidth - widthExcess);<a name="line.721"></a>
725 <FONT color="green">722</FONT> copyBlockPart(blocks[index + blockColumns], width,<a name="line.722"></a>
726 <FONT color="green">723</FONT> 0, heightExcess,<a name="line.723"></a>
727 <FONT color="green">724</FONT> columnsShift, BLOCK_SIZE,<a name="line.724"></a>
728 <FONT color="green">725</FONT> outBlock, jWidth, iHeight - heightExcess, 0);<a name="line.725"></a>
729 <FONT color="green">726</FONT> copyBlockPart(blocks[index + blockColumns + 1], width2,<a name="line.726"></a>
730 <FONT color="green">727</FONT> 0, heightExcess,<a name="line.727"></a>
731 <FONT color="green">728</FONT> 0, widthExcess,<a name="line.728"></a>
732 <FONT color="green">729</FONT> outBlock, jWidth, iHeight - heightExcess, jWidth - widthExcess);<a name="line.729"></a>
733 <FONT color="green">730</FONT> } else {<a name="line.730"></a>
734 <FONT color="green">731</FONT> // the submatrix block spans on one block column from the original matrix<a name="line.731"></a>
735 <FONT color="green">732</FONT> copyBlockPart(blocks[index], width,<a name="line.732"></a>
736 <FONT color="green">733</FONT> rowsShift, BLOCK_SIZE,<a name="line.733"></a>
737 <FONT color="green">734</FONT> columnsShift, jWidth + columnsShift,<a name="line.734"></a>
738 <FONT color="green">735</FONT> outBlock, jWidth, 0, 0);<a name="line.735"></a>
739 <FONT color="green">736</FONT> copyBlockPart(blocks[index + blockColumns], width,<a name="line.736"></a>
740 <FONT color="green">737</FONT> 0, heightExcess,<a name="line.737"></a>
741 <FONT color="green">738</FONT> columnsShift, jWidth + columnsShift,<a name="line.738"></a>
742 <FONT color="green">739</FONT> outBlock, jWidth, iHeight - heightExcess, 0);<a name="line.739"></a>
743 <FONT color="green">740</FONT> }<a name="line.740"></a>
744 <FONT color="green">741</FONT> } else {<a name="line.741"></a>
745 <FONT color="green">742</FONT> // the submatrix block spans on one block row from the original matrix<a name="line.742"></a>
746 <FONT color="green">743</FONT> if (widthExcess &gt; 0) {<a name="line.743"></a>
747 <FONT color="green">744</FONT> // the submatrix block spans on two blocks columns from the original matrix<a name="line.744"></a>
748 <FONT color="green">745</FONT> final int width2 = blockWidth(qBlock + 1);<a name="line.745"></a>
749 <FONT color="green">746</FONT> copyBlockPart(blocks[index], width,<a name="line.746"></a>
750 <FONT color="green">747</FONT> rowsShift, iHeight + rowsShift,<a name="line.747"></a>
751 <FONT color="green">748</FONT> columnsShift, BLOCK_SIZE,<a name="line.748"></a>
752 <FONT color="green">749</FONT> outBlock, jWidth, 0, 0);<a name="line.749"></a>
753 <FONT color="green">750</FONT> copyBlockPart(blocks[index + 1], width2,<a name="line.750"></a>
754 <FONT color="green">751</FONT> rowsShift, iHeight + rowsShift,<a name="line.751"></a>
755 <FONT color="green">752</FONT> 0, widthExcess,<a name="line.752"></a>
756 <FONT color="green">753</FONT> outBlock, jWidth, 0, jWidth - widthExcess);<a name="line.753"></a>
757 <FONT color="green">754</FONT> } else {<a name="line.754"></a>
758 <FONT color="green">755</FONT> // the submatrix block spans on one block column from the original matrix<a name="line.755"></a>
759 <FONT color="green">756</FONT> copyBlockPart(blocks[index], width,<a name="line.756"></a>
760 <FONT color="green">757</FONT> rowsShift, iHeight + rowsShift,<a name="line.757"></a>
761 <FONT color="green">758</FONT> columnsShift, jWidth + columnsShift,<a name="line.758"></a>
762 <FONT color="green">759</FONT> outBlock, jWidth, 0, 0);<a name="line.759"></a>
763 <FONT color="green">760</FONT> }<a name="line.760"></a>
764 <FONT color="green">761</FONT> }<a name="line.761"></a>
765 <FONT color="green">762</FONT> <a name="line.762"></a>
766 <FONT color="green">763</FONT> ++qBlock;<a name="line.763"></a>
767 <FONT color="green">764</FONT> }<a name="line.764"></a>
768 <FONT color="green">765</FONT> <a name="line.765"></a>
769 <FONT color="green">766</FONT> ++pBlock;<a name="line.766"></a>
770 <FONT color="green">767</FONT> <a name="line.767"></a>
771 <FONT color="green">768</FONT> }<a name="line.768"></a>
772 <FONT color="green">769</FONT> <a name="line.769"></a>
773 <FONT color="green">770</FONT> return out;<a name="line.770"></a>
774 <FONT color="green">771</FONT> <a name="line.771"></a>
775 <FONT color="green">772</FONT> }<a name="line.772"></a>
776 <FONT color="green">773</FONT> <a name="line.773"></a>
777 <FONT color="green">774</FONT> /**<a name="line.774"></a>
778 <FONT color="green">775</FONT> * Copy a part of a block into another one<a name="line.775"></a>
779 <FONT color="green">776</FONT> * &lt;p&gt;This method can be called only when the specified part fits in both<a name="line.776"></a>
780 <FONT color="green">777</FONT> * blocks, no verification is done here.&lt;/p&gt;<a name="line.777"></a>
781 <FONT color="green">778</FONT> * @param srcBlock source block<a name="line.778"></a>
782 <FONT color="green">779</FONT> * @param srcWidth source block width ({@link #BLOCK_SIZE} or smaller)<a name="line.779"></a>
783 <FONT color="green">780</FONT> * @param srcStartRow start row in the source block<a name="line.780"></a>
784 <FONT color="green">781</FONT> * @param srcEndRow end row (exclusive) in the source block<a name="line.781"></a>
785 <FONT color="green">782</FONT> * @param srcStartColumn start column in the source block<a name="line.782"></a>
786 <FONT color="green">783</FONT> * @param srcEndColumn end column (exclusive) in the source block<a name="line.783"></a>
787 <FONT color="green">784</FONT> * @param dstBlock destination block<a name="line.784"></a>
788 <FONT color="green">785</FONT> * @param dstWidth destination block width ({@link #BLOCK_SIZE} or smaller)<a name="line.785"></a>
789 <FONT color="green">786</FONT> * @param dstStartRow start row in the destination block<a name="line.786"></a>
790 <FONT color="green">787</FONT> * @param dstStartColumn start column in the destination block<a name="line.787"></a>
791 <FONT color="green">788</FONT> */<a name="line.788"></a>
792 <FONT color="green">789</FONT> private void copyBlockPart(final T[] srcBlock, final int srcWidth,<a name="line.789"></a>
793 <FONT color="green">790</FONT> final int srcStartRow, final int srcEndRow,<a name="line.790"></a>
794 <FONT color="green">791</FONT> final int srcStartColumn, final int srcEndColumn,<a name="line.791"></a>
795 <FONT color="green">792</FONT> final T[] dstBlock, final int dstWidth,<a name="line.792"></a>
796 <FONT color="green">793</FONT> final int dstStartRow, final int dstStartColumn) {<a name="line.793"></a>
797 <FONT color="green">794</FONT> final int length = srcEndColumn - srcStartColumn;<a name="line.794"></a>
798 <FONT color="green">795</FONT> int srcPos = srcStartRow * srcWidth + srcStartColumn;<a name="line.795"></a>
799 <FONT color="green">796</FONT> int dstPos = dstStartRow * dstWidth + dstStartColumn;<a name="line.796"></a>
800 <FONT color="green">797</FONT> for (int srcRow = srcStartRow; srcRow &lt; srcEndRow; ++srcRow) {<a name="line.797"></a>
801 <FONT color="green">798</FONT> System.arraycopy(srcBlock, srcPos, dstBlock, dstPos, length);<a name="line.798"></a>
802 <FONT color="green">799</FONT> srcPos += srcWidth;<a name="line.799"></a>
803 <FONT color="green">800</FONT> dstPos += dstWidth;<a name="line.800"></a>
804 <FONT color="green">801</FONT> }<a name="line.801"></a>
805 <FONT color="green">802</FONT> }<a name="line.802"></a>
806 <FONT color="green">803</FONT> <a name="line.803"></a>
807 <FONT color="green">804</FONT> /** {@inheritDoc} */<a name="line.804"></a>
808 <FONT color="green">805</FONT> @Override<a name="line.805"></a>
809 <FONT color="green">806</FONT> public void setSubMatrix(final T[][] subMatrix, final int row, final int column)<a name="line.806"></a>
810 <FONT color="green">807</FONT> throws MatrixIndexException {<a name="line.807"></a>
811 <FONT color="green">808</FONT> <a name="line.808"></a>
812 <FONT color="green">809</FONT> // safety checks<a name="line.809"></a>
813 <FONT color="green">810</FONT> final int refLength = subMatrix[0].length;<a name="line.810"></a>
814 <FONT color="green">811</FONT> if (refLength &lt; 1) {<a name="line.811"></a>
815 <FONT color="green">812</FONT> throw MathRuntimeException.createIllegalArgumentException("matrix must have at least one column");<a name="line.812"></a>
816 <FONT color="green">813</FONT> }<a name="line.813"></a>
817 <FONT color="green">814</FONT> final int endRow = row + subMatrix.length - 1;<a name="line.814"></a>
818 <FONT color="green">815</FONT> final int endColumn = column + refLength - 1;<a name="line.815"></a>
819 <FONT color="green">816</FONT> checkSubMatrixIndex(row, endRow, column, endColumn);<a name="line.816"></a>
820 <FONT color="green">817</FONT> for (final T[] subRow : subMatrix) {<a name="line.817"></a>
821 <FONT color="green">818</FONT> if (subRow.length != refLength) {<a name="line.818"></a>
822 <FONT color="green">819</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.819"></a>
823 <FONT color="green">820</FONT> "some rows have length {0} while others have length {1}",<a name="line.820"></a>
824 <FONT color="green">821</FONT> refLength, subRow.length);<a name="line.821"></a>
825 <FONT color="green">822</FONT> }<a name="line.822"></a>
826 <FONT color="green">823</FONT> }<a name="line.823"></a>
827 <FONT color="green">824</FONT> <a name="line.824"></a>
828 <FONT color="green">825</FONT> // compute blocks bounds<a name="line.825"></a>
829 <FONT color="green">826</FONT> final int blockStartRow = row / BLOCK_SIZE;<a name="line.826"></a>
830 <FONT color="green">827</FONT> final int blockEndRow = (endRow + BLOCK_SIZE) / BLOCK_SIZE;<a name="line.827"></a>
831 <FONT color="green">828</FONT> final int blockStartColumn = column / BLOCK_SIZE;<a name="line.828"></a>
832 <FONT color="green">829</FONT> final int blockEndColumn = (endColumn + BLOCK_SIZE) / BLOCK_SIZE;<a name="line.829"></a>
833 <FONT color="green">830</FONT> <a name="line.830"></a>
834 <FONT color="green">831</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.831"></a>
835 <FONT color="green">832</FONT> for (int iBlock = blockStartRow; iBlock &lt; blockEndRow; ++iBlock) {<a name="line.832"></a>
836 <FONT color="green">833</FONT> final int iHeight = blockHeight(iBlock);<a name="line.833"></a>
837 <FONT color="green">834</FONT> final int firstRow = iBlock * BLOCK_SIZE;<a name="line.834"></a>
838 <FONT color="green">835</FONT> final int iStart = Math.max(row, firstRow);<a name="line.835"></a>
839 <FONT color="green">836</FONT> final int iEnd = Math.min(endRow + 1, firstRow + iHeight);<a name="line.836"></a>
840 <FONT color="green">837</FONT> <a name="line.837"></a>
841 <FONT color="green">838</FONT> for (int jBlock = blockStartColumn; jBlock &lt; blockEndColumn; ++jBlock) {<a name="line.838"></a>
842 <FONT color="green">839</FONT> final int jWidth = blockWidth(jBlock);<a name="line.839"></a>
843 <FONT color="green">840</FONT> final int firstColumn = jBlock * BLOCK_SIZE;<a name="line.840"></a>
844 <FONT color="green">841</FONT> final int jStart = Math.max(column, firstColumn);<a name="line.841"></a>
845 <FONT color="green">842</FONT> final int jEnd = Math.min(endColumn + 1, firstColumn + jWidth);<a name="line.842"></a>
846 <FONT color="green">843</FONT> final int jLength = jEnd - jStart;<a name="line.843"></a>
847 <FONT color="green">844</FONT> <a name="line.844"></a>
848 <FONT color="green">845</FONT> // handle one block, row by row<a name="line.845"></a>
849 <FONT color="green">846</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.846"></a>
850 <FONT color="green">847</FONT> for (int i = iStart; i &lt; iEnd; ++i) {<a name="line.847"></a>
851 <FONT color="green">848</FONT> System.arraycopy(subMatrix[i - row], jStart - column,<a name="line.848"></a>
852 <FONT color="green">849</FONT> block, (i - firstRow) * jWidth + (jStart - firstColumn),<a name="line.849"></a>
853 <FONT color="green">850</FONT> jLength);<a name="line.850"></a>
854 <FONT color="green">851</FONT> }<a name="line.851"></a>
855 <FONT color="green">852</FONT> <a name="line.852"></a>
856 <FONT color="green">853</FONT> }<a name="line.853"></a>
857 <FONT color="green">854</FONT> }<a name="line.854"></a>
858 <FONT color="green">855</FONT> }<a name="line.855"></a>
859 <FONT color="green">856</FONT> <a name="line.856"></a>
860 <FONT color="green">857</FONT> /** {@inheritDoc} */<a name="line.857"></a>
861 <FONT color="green">858</FONT> @Override<a name="line.858"></a>
862 <FONT color="green">859</FONT> public FieldMatrix&lt;T&gt; getRowMatrix(final int row)<a name="line.859"></a>
863 <FONT color="green">860</FONT> throws MatrixIndexException {<a name="line.860"></a>
864 <FONT color="green">861</FONT> <a name="line.861"></a>
865 <FONT color="green">862</FONT> checkRowIndex(row);<a name="line.862"></a>
866 <FONT color="green">863</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), 1, columns);<a name="line.863"></a>
867 <FONT color="green">864</FONT> <a name="line.864"></a>
868 <FONT color="green">865</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.865"></a>
869 <FONT color="green">866</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.866"></a>
870 <FONT color="green">867</FONT> final int iRow = row - iBlock * BLOCK_SIZE;<a name="line.867"></a>
871 <FONT color="green">868</FONT> int outBlockIndex = 0;<a name="line.868"></a>
872 <FONT color="green">869</FONT> int outIndex = 0;<a name="line.869"></a>
873 <FONT color="green">870</FONT> T[] outBlock = out.blocks[outBlockIndex];<a name="line.870"></a>
874 <FONT color="green">871</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.871"></a>
875 <FONT color="green">872</FONT> final int jWidth = blockWidth(jBlock);<a name="line.872"></a>
876 <FONT color="green">873</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.873"></a>
877 <FONT color="green">874</FONT> final int available = outBlock.length - outIndex;<a name="line.874"></a>
878 <FONT color="green">875</FONT> if (jWidth &gt; available) {<a name="line.875"></a>
879 <FONT color="green">876</FONT> System.arraycopy(block, iRow * jWidth, outBlock, outIndex, available);<a name="line.876"></a>
880 <FONT color="green">877</FONT> outBlock = out.blocks[++outBlockIndex];<a name="line.877"></a>
881 <FONT color="green">878</FONT> System.arraycopy(block, iRow * jWidth, outBlock, 0, jWidth - available);<a name="line.878"></a>
882 <FONT color="green">879</FONT> outIndex = jWidth - available;<a name="line.879"></a>
883 <FONT color="green">880</FONT> } else {<a name="line.880"></a>
884 <FONT color="green">881</FONT> System.arraycopy(block, iRow * jWidth, outBlock, outIndex, jWidth);<a name="line.881"></a>
885 <FONT color="green">882</FONT> outIndex += jWidth;<a name="line.882"></a>
886 <FONT color="green">883</FONT> }<a name="line.883"></a>
887 <FONT color="green">884</FONT> }<a name="line.884"></a>
888 <FONT color="green">885</FONT> <a name="line.885"></a>
889 <FONT color="green">886</FONT> return out;<a name="line.886"></a>
890 <FONT color="green">887</FONT> <a name="line.887"></a>
891 <FONT color="green">888</FONT> }<a name="line.888"></a>
892 <FONT color="green">889</FONT> <a name="line.889"></a>
893 <FONT color="green">890</FONT> /** {@inheritDoc} */<a name="line.890"></a>
894 <FONT color="green">891</FONT> @Override<a name="line.891"></a>
895 <FONT color="green">892</FONT> public void setRowMatrix(final int row, final FieldMatrix&lt;T&gt; matrix)<a name="line.892"></a>
896 <FONT color="green">893</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.893"></a>
897 <FONT color="green">894</FONT> try {<a name="line.894"></a>
898 <FONT color="green">895</FONT> setRowMatrix(row, (BlockFieldMatrix&lt;T&gt;) matrix);<a name="line.895"></a>
899 <FONT color="green">896</FONT> } catch (ClassCastException cce) {<a name="line.896"></a>
900 <FONT color="green">897</FONT> super.setRowMatrix(row, matrix);<a name="line.897"></a>
901 <FONT color="green">898</FONT> }<a name="line.898"></a>
902 <FONT color="green">899</FONT> }<a name="line.899"></a>
903 <FONT color="green">900</FONT> <a name="line.900"></a>
904 <FONT color="green">901</FONT> /**<a name="line.901"></a>
905 <FONT color="green">902</FONT> * Sets the entries in row number &lt;code&gt;row&lt;/code&gt;<a name="line.902"></a>
906 <FONT color="green">903</FONT> * as a row matrix. Row indices start at 0.<a name="line.903"></a>
907 <FONT color="green">904</FONT> *<a name="line.904"></a>
908 <FONT color="green">905</FONT> * @param row the row to be set<a name="line.905"></a>
909 <FONT color="green">906</FONT> * @param matrix row matrix (must have one row and the same number of columns<a name="line.906"></a>
910 <FONT color="green">907</FONT> * as the instance)<a name="line.907"></a>
911 <FONT color="green">908</FONT> * @throws MatrixIndexException if the specified row index is invalid<a name="line.908"></a>
912 <FONT color="green">909</FONT> * @throws InvalidMatrixException if the matrix dimensions do not match one<a name="line.909"></a>
913 <FONT color="green">910</FONT> * instance row<a name="line.910"></a>
914 <FONT color="green">911</FONT> */<a name="line.911"></a>
915 <FONT color="green">912</FONT> public void setRowMatrix(final int row, final BlockFieldMatrix&lt;T&gt; matrix)<a name="line.912"></a>
916 <FONT color="green">913</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.913"></a>
917 <FONT color="green">914</FONT> <a name="line.914"></a>
918 <FONT color="green">915</FONT> checkRowIndex(row);<a name="line.915"></a>
919 <FONT color="green">916</FONT> final int nCols = getColumnDimension();<a name="line.916"></a>
920 <FONT color="green">917</FONT> if ((matrix.getRowDimension() != 1) ||<a name="line.917"></a>
921 <FONT color="green">918</FONT> (matrix.getColumnDimension() != nCols)) {<a name="line.918"></a>
922 <FONT color="green">919</FONT> throw new InvalidMatrixException(<a name="line.919"></a>
923 <FONT color="green">920</FONT> "dimensions mismatch: got {0}x{1} but expected {2}x{3}",<a name="line.920"></a>
924 <FONT color="green">921</FONT> matrix.getRowDimension(), matrix.getColumnDimension(),<a name="line.921"></a>
925 <FONT color="green">922</FONT> 1, nCols);<a name="line.922"></a>
926 <FONT color="green">923</FONT> }<a name="line.923"></a>
927 <FONT color="green">924</FONT> <a name="line.924"></a>
928 <FONT color="green">925</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.925"></a>
929 <FONT color="green">926</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.926"></a>
930 <FONT color="green">927</FONT> final int iRow = row - iBlock * BLOCK_SIZE;<a name="line.927"></a>
931 <FONT color="green">928</FONT> int mBlockIndex = 0;<a name="line.928"></a>
932 <FONT color="green">929</FONT> int mIndex = 0;<a name="line.929"></a>
933 <FONT color="green">930</FONT> T[] mBlock = matrix.blocks[mBlockIndex];<a name="line.930"></a>
934 <FONT color="green">931</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.931"></a>
935 <FONT color="green">932</FONT> final int jWidth = blockWidth(jBlock);<a name="line.932"></a>
936 <FONT color="green">933</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.933"></a>
937 <FONT color="green">934</FONT> final int available = mBlock.length - mIndex;<a name="line.934"></a>
938 <FONT color="green">935</FONT> if (jWidth &gt; available) {<a name="line.935"></a>
939 <FONT color="green">936</FONT> System.arraycopy(mBlock, mIndex, block, iRow * jWidth, available);<a name="line.936"></a>
940 <FONT color="green">937</FONT> mBlock = matrix.blocks[++mBlockIndex];<a name="line.937"></a>
941 <FONT color="green">938</FONT> System.arraycopy(mBlock, 0, block, iRow * jWidth, jWidth - available);<a name="line.938"></a>
942 <FONT color="green">939</FONT> mIndex = jWidth - available;<a name="line.939"></a>
943 <FONT color="green">940</FONT> } else {<a name="line.940"></a>
944 <FONT color="green">941</FONT> System.arraycopy(mBlock, mIndex, block, iRow * jWidth, jWidth);<a name="line.941"></a>
945 <FONT color="green">942</FONT> mIndex += jWidth;<a name="line.942"></a>
946 <FONT color="green">943</FONT> }<a name="line.943"></a>
947 <FONT color="green">944</FONT> }<a name="line.944"></a>
948 <FONT color="green">945</FONT> <a name="line.945"></a>
949 <FONT color="green">946</FONT> }<a name="line.946"></a>
950 <FONT color="green">947</FONT> <a name="line.947"></a>
951 <FONT color="green">948</FONT> /** {@inheritDoc} */<a name="line.948"></a>
952 <FONT color="green">949</FONT> @Override<a name="line.949"></a>
953 <FONT color="green">950</FONT> public FieldMatrix&lt;T&gt; getColumnMatrix(final int column)<a name="line.950"></a>
954 <FONT color="green">951</FONT> throws MatrixIndexException {<a name="line.951"></a>
955 <FONT color="green">952</FONT> <a name="line.952"></a>
956 <FONT color="green">953</FONT> checkColumnIndex(column);<a name="line.953"></a>
957 <FONT color="green">954</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), rows, 1);<a name="line.954"></a>
958 <FONT color="green">955</FONT> <a name="line.955"></a>
959 <FONT color="green">956</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.956"></a>
960 <FONT color="green">957</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.957"></a>
961 <FONT color="green">958</FONT> final int jColumn = column - jBlock * BLOCK_SIZE;<a name="line.958"></a>
962 <FONT color="green">959</FONT> final int jWidth = blockWidth(jBlock);<a name="line.959"></a>
963 <FONT color="green">960</FONT> int outBlockIndex = 0;<a name="line.960"></a>
964 <FONT color="green">961</FONT> int outIndex = 0;<a name="line.961"></a>
965 <FONT color="green">962</FONT> T[] outBlock = out.blocks[outBlockIndex];<a name="line.962"></a>
966 <FONT color="green">963</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.963"></a>
967 <FONT color="green">964</FONT> final int iHeight = blockHeight(iBlock);<a name="line.964"></a>
968 <FONT color="green">965</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.965"></a>
969 <FONT color="green">966</FONT> for (int i = 0; i &lt; iHeight; ++i) {<a name="line.966"></a>
970 <FONT color="green">967</FONT> if (outIndex &gt;= outBlock.length) {<a name="line.967"></a>
971 <FONT color="green">968</FONT> outBlock = out.blocks[++outBlockIndex];<a name="line.968"></a>
972 <FONT color="green">969</FONT> outIndex = 0;<a name="line.969"></a>
973 <FONT color="green">970</FONT> }<a name="line.970"></a>
974 <FONT color="green">971</FONT> outBlock[outIndex++] = block[i * jWidth + jColumn];<a name="line.971"></a>
975 <FONT color="green">972</FONT> }<a name="line.972"></a>
976 <FONT color="green">973</FONT> }<a name="line.973"></a>
977 <FONT color="green">974</FONT> <a name="line.974"></a>
978 <FONT color="green">975</FONT> return out;<a name="line.975"></a>
979 <FONT color="green">976</FONT> <a name="line.976"></a>
980 <FONT color="green">977</FONT> }<a name="line.977"></a>
981 <FONT color="green">978</FONT> <a name="line.978"></a>
982 <FONT color="green">979</FONT> /** {@inheritDoc} */<a name="line.979"></a>
983 <FONT color="green">980</FONT> @Override<a name="line.980"></a>
984 <FONT color="green">981</FONT> public void setColumnMatrix(final int column, final FieldMatrix&lt;T&gt; matrix)<a name="line.981"></a>
985 <FONT color="green">982</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.982"></a>
986 <FONT color="green">983</FONT> try {<a name="line.983"></a>
987 <FONT color="green">984</FONT> setColumnMatrix(column, (BlockFieldMatrix&lt;T&gt;) matrix);<a name="line.984"></a>
988 <FONT color="green">985</FONT> } catch (ClassCastException cce) {<a name="line.985"></a>
989 <FONT color="green">986</FONT> super.setColumnMatrix(column, matrix);<a name="line.986"></a>
990 <FONT color="green">987</FONT> }<a name="line.987"></a>
991 <FONT color="green">988</FONT> }<a name="line.988"></a>
992 <FONT color="green">989</FONT> <a name="line.989"></a>
993 <FONT color="green">990</FONT> /**<a name="line.990"></a>
994 <FONT color="green">991</FONT> * Sets the entries in column number &lt;code&gt;column&lt;/code&gt;<a name="line.991"></a>
995 <FONT color="green">992</FONT> * as a column matrix. Column indices start at 0.<a name="line.992"></a>
996 <FONT color="green">993</FONT> *<a name="line.993"></a>
997 <FONT color="green">994</FONT> * @param column the column to be set<a name="line.994"></a>
998 <FONT color="green">995</FONT> * @param matrix column matrix (must have one column and the same number of rows<a name="line.995"></a>
999 <FONT color="green">996</FONT> * as the instance)<a name="line.996"></a>
1000 <FONT color="green">997</FONT> * @throws MatrixIndexException if the specified column index is invalid<a name="line.997"></a>
1001 <FONT color="green">998</FONT> * @throws InvalidMatrixException if the matrix dimensions do not match one<a name="line.998"></a>
1002 <FONT color="green">999</FONT> * instance column<a name="line.999"></a>
1003 <FONT color="green">1000</FONT> */<a name="line.1000"></a>
1004 <FONT color="green">1001</FONT> void setColumnMatrix(final int column, final BlockFieldMatrix&lt;T&gt; matrix)<a name="line.1001"></a>
1005 <FONT color="green">1002</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.1002"></a>
1006 <FONT color="green">1003</FONT> <a name="line.1003"></a>
1007 <FONT color="green">1004</FONT> checkColumnIndex(column);<a name="line.1004"></a>
1008 <FONT color="green">1005</FONT> final int nRows = getRowDimension();<a name="line.1005"></a>
1009 <FONT color="green">1006</FONT> if ((matrix.getRowDimension() != nRows) ||<a name="line.1006"></a>
1010 <FONT color="green">1007</FONT> (matrix.getColumnDimension() != 1)) {<a name="line.1007"></a>
1011 <FONT color="green">1008</FONT> throw new InvalidMatrixException(<a name="line.1008"></a>
1012 <FONT color="green">1009</FONT> "dimensions mismatch: got {0}x{1} but expected {2}x{3}",<a name="line.1009"></a>
1013 <FONT color="green">1010</FONT> matrix.getRowDimension(), matrix.getColumnDimension(),<a name="line.1010"></a>
1014 <FONT color="green">1011</FONT> nRows, 1);<a name="line.1011"></a>
1015 <FONT color="green">1012</FONT> }<a name="line.1012"></a>
1016 <FONT color="green">1013</FONT> <a name="line.1013"></a>
1017 <FONT color="green">1014</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1014"></a>
1018 <FONT color="green">1015</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1015"></a>
1019 <FONT color="green">1016</FONT> final int jColumn = column - jBlock * BLOCK_SIZE;<a name="line.1016"></a>
1020 <FONT color="green">1017</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1017"></a>
1021 <FONT color="green">1018</FONT> int mBlockIndex = 0;<a name="line.1018"></a>
1022 <FONT color="green">1019</FONT> int mIndex = 0;<a name="line.1019"></a>
1023 <FONT color="green">1020</FONT> T[] mBlock = matrix.blocks[mBlockIndex];<a name="line.1020"></a>
1024 <FONT color="green">1021</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1021"></a>
1025 <FONT color="green">1022</FONT> final int iHeight = blockHeight(iBlock);<a name="line.1022"></a>
1026 <FONT color="green">1023</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1023"></a>
1027 <FONT color="green">1024</FONT> for (int i = 0; i &lt; iHeight; ++i) {<a name="line.1024"></a>
1028 <FONT color="green">1025</FONT> if (mIndex &gt;= mBlock.length) {<a name="line.1025"></a>
1029 <FONT color="green">1026</FONT> mBlock = matrix.blocks[++mBlockIndex];<a name="line.1026"></a>
1030 <FONT color="green">1027</FONT> mIndex = 0;<a name="line.1027"></a>
1031 <FONT color="green">1028</FONT> }<a name="line.1028"></a>
1032 <FONT color="green">1029</FONT> block[i * jWidth + jColumn] = mBlock[mIndex++];<a name="line.1029"></a>
1033 <FONT color="green">1030</FONT> }<a name="line.1030"></a>
1034 <FONT color="green">1031</FONT> }<a name="line.1031"></a>
1035 <FONT color="green">1032</FONT> <a name="line.1032"></a>
1036 <FONT color="green">1033</FONT> }<a name="line.1033"></a>
1037 <FONT color="green">1034</FONT> <a name="line.1034"></a>
1038 <FONT color="green">1035</FONT> /** {@inheritDoc} */<a name="line.1035"></a>
1039 <FONT color="green">1036</FONT> @Override<a name="line.1036"></a>
1040 <FONT color="green">1037</FONT> public FieldVector&lt;T&gt; getRowVector(final int row)<a name="line.1037"></a>
1041 <FONT color="green">1038</FONT> throws MatrixIndexException {<a name="line.1038"></a>
1042 <FONT color="green">1039</FONT> <a name="line.1039"></a>
1043 <FONT color="green">1040</FONT> checkRowIndex(row);<a name="line.1040"></a>
1044 <FONT color="green">1041</FONT> final T[] outData = buildArray(getField(), columns);<a name="line.1041"></a>
1045 <FONT color="green">1042</FONT> <a name="line.1042"></a>
1046 <FONT color="green">1043</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1043"></a>
1047 <FONT color="green">1044</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1044"></a>
1048 <FONT color="green">1045</FONT> final int iRow = row - iBlock * BLOCK_SIZE;<a name="line.1045"></a>
1049 <FONT color="green">1046</FONT> int outIndex = 0;<a name="line.1046"></a>
1050 <FONT color="green">1047</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1047"></a>
1051 <FONT color="green">1048</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1048"></a>
1052 <FONT color="green">1049</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1049"></a>
1053 <FONT color="green">1050</FONT> System.arraycopy(block, iRow * jWidth, outData, outIndex, jWidth);<a name="line.1050"></a>
1054 <FONT color="green">1051</FONT> outIndex += jWidth;<a name="line.1051"></a>
1055 <FONT color="green">1052</FONT> }<a name="line.1052"></a>
1056 <FONT color="green">1053</FONT> <a name="line.1053"></a>
1057 <FONT color="green">1054</FONT> return new ArrayFieldVector&lt;T&gt;(outData, false);<a name="line.1054"></a>
1058 <FONT color="green">1055</FONT> <a name="line.1055"></a>
1059 <FONT color="green">1056</FONT> }<a name="line.1056"></a>
1060 <FONT color="green">1057</FONT> <a name="line.1057"></a>
1061 <FONT color="green">1058</FONT> /** {@inheritDoc} */<a name="line.1058"></a>
1062 <FONT color="green">1059</FONT> @Override<a name="line.1059"></a>
1063 <FONT color="green">1060</FONT> public void setRowVector(final int row, final FieldVector&lt;T&gt; vector)<a name="line.1060"></a>
1064 <FONT color="green">1061</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.1061"></a>
1065 <FONT color="green">1062</FONT> try {<a name="line.1062"></a>
1066 <FONT color="green">1063</FONT> setRow(row, ((ArrayFieldVector&lt;T&gt;) vector).getDataRef());<a name="line.1063"></a>
1067 <FONT color="green">1064</FONT> } catch (ClassCastException cce) {<a name="line.1064"></a>
1068 <FONT color="green">1065</FONT> super.setRowVector(row, vector);<a name="line.1065"></a>
1069 <FONT color="green">1066</FONT> }<a name="line.1066"></a>
1070 <FONT color="green">1067</FONT> }<a name="line.1067"></a>
1071 <FONT color="green">1068</FONT> <a name="line.1068"></a>
1072 <FONT color="green">1069</FONT> /** {@inheritDoc} */<a name="line.1069"></a>
1073 <FONT color="green">1070</FONT> @Override<a name="line.1070"></a>
1074 <FONT color="green">1071</FONT> public FieldVector&lt;T&gt; getColumnVector(final int column)<a name="line.1071"></a>
1075 <FONT color="green">1072</FONT> throws MatrixIndexException {<a name="line.1072"></a>
1076 <FONT color="green">1073</FONT> <a name="line.1073"></a>
1077 <FONT color="green">1074</FONT> checkColumnIndex(column);<a name="line.1074"></a>
1078 <FONT color="green">1075</FONT> final T[] outData = buildArray(getField(), rows);<a name="line.1075"></a>
1079 <FONT color="green">1076</FONT> <a name="line.1076"></a>
1080 <FONT color="green">1077</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1077"></a>
1081 <FONT color="green">1078</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1078"></a>
1082 <FONT color="green">1079</FONT> final int jColumn = column - jBlock * BLOCK_SIZE;<a name="line.1079"></a>
1083 <FONT color="green">1080</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1080"></a>
1084 <FONT color="green">1081</FONT> int outIndex = 0;<a name="line.1081"></a>
1085 <FONT color="green">1082</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1082"></a>
1086 <FONT color="green">1083</FONT> final int iHeight = blockHeight(iBlock);<a name="line.1083"></a>
1087 <FONT color="green">1084</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1084"></a>
1088 <FONT color="green">1085</FONT> for (int i = 0; i &lt; iHeight; ++i) {<a name="line.1085"></a>
1089 <FONT color="green">1086</FONT> outData[outIndex++] = block[i * jWidth + jColumn];<a name="line.1086"></a>
1090 <FONT color="green">1087</FONT> }<a name="line.1087"></a>
1091 <FONT color="green">1088</FONT> }<a name="line.1088"></a>
1092 <FONT color="green">1089</FONT> <a name="line.1089"></a>
1093 <FONT color="green">1090</FONT> return new ArrayFieldVector&lt;T&gt;(outData, false);<a name="line.1090"></a>
1094 <FONT color="green">1091</FONT> <a name="line.1091"></a>
1095 <FONT color="green">1092</FONT> }<a name="line.1092"></a>
1096 <FONT color="green">1093</FONT> <a name="line.1093"></a>
1097 <FONT color="green">1094</FONT> /** {@inheritDoc} */<a name="line.1094"></a>
1098 <FONT color="green">1095</FONT> @Override<a name="line.1095"></a>
1099 <FONT color="green">1096</FONT> public void setColumnVector(final int column, final FieldVector&lt;T&gt; vector)<a name="line.1096"></a>
1100 <FONT color="green">1097</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.1097"></a>
1101 <FONT color="green">1098</FONT> try {<a name="line.1098"></a>
1102 <FONT color="green">1099</FONT> setColumn(column, ((ArrayFieldVector&lt;T&gt;) vector).getDataRef());<a name="line.1099"></a>
1103 <FONT color="green">1100</FONT> } catch (ClassCastException cce) {<a name="line.1100"></a>
1104 <FONT color="green">1101</FONT> super.setColumnVector(column, vector);<a name="line.1101"></a>
1105 <FONT color="green">1102</FONT> }<a name="line.1102"></a>
1106 <FONT color="green">1103</FONT> }<a name="line.1103"></a>
1107 <FONT color="green">1104</FONT> <a name="line.1104"></a>
1108 <FONT color="green">1105</FONT> /** {@inheritDoc} */<a name="line.1105"></a>
1109 <FONT color="green">1106</FONT> @Override<a name="line.1106"></a>
1110 <FONT color="green">1107</FONT> public T[] getRow(final int row)<a name="line.1107"></a>
1111 <FONT color="green">1108</FONT> throws MatrixIndexException {<a name="line.1108"></a>
1112 <FONT color="green">1109</FONT> <a name="line.1109"></a>
1113 <FONT color="green">1110</FONT> checkRowIndex(row);<a name="line.1110"></a>
1114 <FONT color="green">1111</FONT> final T[] out = buildArray(getField(), columns);<a name="line.1111"></a>
1115 <FONT color="green">1112</FONT> <a name="line.1112"></a>
1116 <FONT color="green">1113</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1113"></a>
1117 <FONT color="green">1114</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1114"></a>
1118 <FONT color="green">1115</FONT> final int iRow = row - iBlock * BLOCK_SIZE;<a name="line.1115"></a>
1119 <FONT color="green">1116</FONT> int outIndex = 0;<a name="line.1116"></a>
1120 <FONT color="green">1117</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1117"></a>
1121 <FONT color="green">1118</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1118"></a>
1122 <FONT color="green">1119</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1119"></a>
1123 <FONT color="green">1120</FONT> System.arraycopy(block, iRow * jWidth, out, outIndex, jWidth);<a name="line.1120"></a>
1124 <FONT color="green">1121</FONT> outIndex += jWidth;<a name="line.1121"></a>
1125 <FONT color="green">1122</FONT> }<a name="line.1122"></a>
1126 <FONT color="green">1123</FONT> <a name="line.1123"></a>
1127 <FONT color="green">1124</FONT> return out;<a name="line.1124"></a>
1128 <FONT color="green">1125</FONT> <a name="line.1125"></a>
1129 <FONT color="green">1126</FONT> }<a name="line.1126"></a>
1130 <FONT color="green">1127</FONT> <a name="line.1127"></a>
1131 <FONT color="green">1128</FONT> /** {@inheritDoc} */<a name="line.1128"></a>
1132 <FONT color="green">1129</FONT> @Override<a name="line.1129"></a>
1133 <FONT color="green">1130</FONT> public void setRow(final int row, final T[] array)<a name="line.1130"></a>
1134 <FONT color="green">1131</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.1131"></a>
1135 <FONT color="green">1132</FONT> <a name="line.1132"></a>
1136 <FONT color="green">1133</FONT> checkRowIndex(row);<a name="line.1133"></a>
1137 <FONT color="green">1134</FONT> final int nCols = getColumnDimension();<a name="line.1134"></a>
1138 <FONT color="green">1135</FONT> if (array.length != nCols) {<a name="line.1135"></a>
1139 <FONT color="green">1136</FONT> throw new InvalidMatrixException(<a name="line.1136"></a>
1140 <FONT color="green">1137</FONT> "dimensions mismatch: got {0}x{1} but expected {2}x{3}",<a name="line.1137"></a>
1141 <FONT color="green">1138</FONT> 1, array.length, 1, nCols);<a name="line.1138"></a>
1142 <FONT color="green">1139</FONT> }<a name="line.1139"></a>
1143 <FONT color="green">1140</FONT> <a name="line.1140"></a>
1144 <FONT color="green">1141</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1141"></a>
1145 <FONT color="green">1142</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1142"></a>
1146 <FONT color="green">1143</FONT> final int iRow = row - iBlock * BLOCK_SIZE;<a name="line.1143"></a>
1147 <FONT color="green">1144</FONT> int outIndex = 0;<a name="line.1144"></a>
1148 <FONT color="green">1145</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1145"></a>
1149 <FONT color="green">1146</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1146"></a>
1150 <FONT color="green">1147</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1147"></a>
1151 <FONT color="green">1148</FONT> System.arraycopy(array, outIndex, block, iRow * jWidth, jWidth);<a name="line.1148"></a>
1152 <FONT color="green">1149</FONT> outIndex += jWidth;<a name="line.1149"></a>
1153 <FONT color="green">1150</FONT> }<a name="line.1150"></a>
1154 <FONT color="green">1151</FONT> <a name="line.1151"></a>
1155 <FONT color="green">1152</FONT> }<a name="line.1152"></a>
1156 <FONT color="green">1153</FONT> <a name="line.1153"></a>
1157 <FONT color="green">1154</FONT> /** {@inheritDoc} */<a name="line.1154"></a>
1158 <FONT color="green">1155</FONT> @Override<a name="line.1155"></a>
1159 <FONT color="green">1156</FONT> public T[] getColumn(final int column)<a name="line.1156"></a>
1160 <FONT color="green">1157</FONT> throws MatrixIndexException {<a name="line.1157"></a>
1161 <FONT color="green">1158</FONT> <a name="line.1158"></a>
1162 <FONT color="green">1159</FONT> checkColumnIndex(column);<a name="line.1159"></a>
1163 <FONT color="green">1160</FONT> final T[] out = buildArray(getField(), rows);<a name="line.1160"></a>
1164 <FONT color="green">1161</FONT> <a name="line.1161"></a>
1165 <FONT color="green">1162</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1162"></a>
1166 <FONT color="green">1163</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1163"></a>
1167 <FONT color="green">1164</FONT> final int jColumn = column - jBlock * BLOCK_SIZE;<a name="line.1164"></a>
1168 <FONT color="green">1165</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1165"></a>
1169 <FONT color="green">1166</FONT> int outIndex = 0;<a name="line.1166"></a>
1170 <FONT color="green">1167</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1167"></a>
1171 <FONT color="green">1168</FONT> final int iHeight = blockHeight(iBlock);<a name="line.1168"></a>
1172 <FONT color="green">1169</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1169"></a>
1173 <FONT color="green">1170</FONT> for (int i = 0; i &lt; iHeight; ++i) {<a name="line.1170"></a>
1174 <FONT color="green">1171</FONT> out[outIndex++] = block[i * jWidth + jColumn];<a name="line.1171"></a>
1175 <FONT color="green">1172</FONT> }<a name="line.1172"></a>
1176 <FONT color="green">1173</FONT> }<a name="line.1173"></a>
1177 <FONT color="green">1174</FONT> <a name="line.1174"></a>
1178 <FONT color="green">1175</FONT> return out;<a name="line.1175"></a>
1179 <FONT color="green">1176</FONT> <a name="line.1176"></a>
1180 <FONT color="green">1177</FONT> }<a name="line.1177"></a>
1181 <FONT color="green">1178</FONT> <a name="line.1178"></a>
1182 <FONT color="green">1179</FONT> /** {@inheritDoc} */<a name="line.1179"></a>
1183 <FONT color="green">1180</FONT> @Override<a name="line.1180"></a>
1184 <FONT color="green">1181</FONT> public void setColumn(final int column, final T[] array)<a name="line.1181"></a>
1185 <FONT color="green">1182</FONT> throws MatrixIndexException, InvalidMatrixException {<a name="line.1182"></a>
1186 <FONT color="green">1183</FONT> <a name="line.1183"></a>
1187 <FONT color="green">1184</FONT> checkColumnIndex(column);<a name="line.1184"></a>
1188 <FONT color="green">1185</FONT> final int nRows = getRowDimension();<a name="line.1185"></a>
1189 <FONT color="green">1186</FONT> if (array.length != nRows) {<a name="line.1186"></a>
1190 <FONT color="green">1187</FONT> throw new InvalidMatrixException(<a name="line.1187"></a>
1191 <FONT color="green">1188</FONT> "dimensions mismatch: got {0}x{1} but expected {2}x{3}",<a name="line.1188"></a>
1192 <FONT color="green">1189</FONT> array.length, 1, nRows, 1);<a name="line.1189"></a>
1193 <FONT color="green">1190</FONT> }<a name="line.1190"></a>
1194 <FONT color="green">1191</FONT> <a name="line.1191"></a>
1195 <FONT color="green">1192</FONT> // perform copy block-wise, to ensure good cache behavior<a name="line.1192"></a>
1196 <FONT color="green">1193</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1193"></a>
1197 <FONT color="green">1194</FONT> final int jColumn = column - jBlock * BLOCK_SIZE;<a name="line.1194"></a>
1198 <FONT color="green">1195</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1195"></a>
1199 <FONT color="green">1196</FONT> int outIndex = 0;<a name="line.1196"></a>
1200 <FONT color="green">1197</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1197"></a>
1201 <FONT color="green">1198</FONT> final int iHeight = blockHeight(iBlock);<a name="line.1198"></a>
1202 <FONT color="green">1199</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1199"></a>
1203 <FONT color="green">1200</FONT> for (int i = 0; i &lt; iHeight; ++i) {<a name="line.1200"></a>
1204 <FONT color="green">1201</FONT> block[i * jWidth + jColumn] = array[outIndex++];<a name="line.1201"></a>
1205 <FONT color="green">1202</FONT> }<a name="line.1202"></a>
1206 <FONT color="green">1203</FONT> }<a name="line.1203"></a>
1207 <FONT color="green">1204</FONT> <a name="line.1204"></a>
1208 <FONT color="green">1205</FONT> }<a name="line.1205"></a>
1209 <FONT color="green">1206</FONT> <a name="line.1206"></a>
1210 <FONT color="green">1207</FONT> /** {@inheritDoc} */<a name="line.1207"></a>
1211 <FONT color="green">1208</FONT> @Override<a name="line.1208"></a>
1212 <FONT color="green">1209</FONT> public T getEntry(final int row, final int column)<a name="line.1209"></a>
1213 <FONT color="green">1210</FONT> throws MatrixIndexException {<a name="line.1210"></a>
1214 <FONT color="green">1211</FONT> try {<a name="line.1211"></a>
1215 <FONT color="green">1212</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1212"></a>
1216 <FONT color="green">1213</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1213"></a>
1217 <FONT color="green">1214</FONT> final int k = (row - iBlock * BLOCK_SIZE) * blockWidth(jBlock) +<a name="line.1214"></a>
1218 <FONT color="green">1215</FONT> (column - jBlock * BLOCK_SIZE);<a name="line.1215"></a>
1219 <FONT color="green">1216</FONT> return blocks[iBlock * blockColumns + jBlock][k];<a name="line.1216"></a>
1220 <FONT color="green">1217</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.1217"></a>
1221 <FONT color="green">1218</FONT> throw new MatrixIndexException(<a name="line.1218"></a>
1222 <FONT color="green">1219</FONT> "no entry at indices ({0}, {1}) in a {2}x{3} matrix",<a name="line.1219"></a>
1223 <FONT color="green">1220</FONT> row, column, getRowDimension(), getColumnDimension());<a name="line.1220"></a>
1224 <FONT color="green">1221</FONT> }<a name="line.1221"></a>
1225 <FONT color="green">1222</FONT> }<a name="line.1222"></a>
1226 <FONT color="green">1223</FONT> <a name="line.1223"></a>
1227 <FONT color="green">1224</FONT> /** {@inheritDoc} */<a name="line.1224"></a>
1228 <FONT color="green">1225</FONT> @Override<a name="line.1225"></a>
1229 <FONT color="green">1226</FONT> public void setEntry(final int row, final int column, final T value)<a name="line.1226"></a>
1230 <FONT color="green">1227</FONT> throws MatrixIndexException {<a name="line.1227"></a>
1231 <FONT color="green">1228</FONT> try {<a name="line.1228"></a>
1232 <FONT color="green">1229</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1229"></a>
1233 <FONT color="green">1230</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1230"></a>
1234 <FONT color="green">1231</FONT> final int k = (row - iBlock * BLOCK_SIZE) * blockWidth(jBlock) +<a name="line.1231"></a>
1235 <FONT color="green">1232</FONT> (column - jBlock * BLOCK_SIZE);<a name="line.1232"></a>
1236 <FONT color="green">1233</FONT> blocks[iBlock * blockColumns + jBlock][k] = value;<a name="line.1233"></a>
1237 <FONT color="green">1234</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.1234"></a>
1238 <FONT color="green">1235</FONT> throw new MatrixIndexException(<a name="line.1235"></a>
1239 <FONT color="green">1236</FONT> "no entry at indices ({0}, {1}) in a {2}x{3} matrix",<a name="line.1236"></a>
1240 <FONT color="green">1237</FONT> row, column, getRowDimension(), getColumnDimension());<a name="line.1237"></a>
1241 <FONT color="green">1238</FONT> }<a name="line.1238"></a>
1242 <FONT color="green">1239</FONT> }<a name="line.1239"></a>
1243 <FONT color="green">1240</FONT> <a name="line.1240"></a>
1244 <FONT color="green">1241</FONT> /** {@inheritDoc} */<a name="line.1241"></a>
1245 <FONT color="green">1242</FONT> @Override<a name="line.1242"></a>
1246 <FONT color="green">1243</FONT> public void addToEntry(final int row, final int column, final T increment)<a name="line.1243"></a>
1247 <FONT color="green">1244</FONT> throws MatrixIndexException {<a name="line.1244"></a>
1248 <FONT color="green">1245</FONT> try {<a name="line.1245"></a>
1249 <FONT color="green">1246</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1246"></a>
1250 <FONT color="green">1247</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1247"></a>
1251 <FONT color="green">1248</FONT> final int k = (row - iBlock * BLOCK_SIZE) * blockWidth(jBlock) +<a name="line.1248"></a>
1252 <FONT color="green">1249</FONT> (column - jBlock * BLOCK_SIZE);<a name="line.1249"></a>
1253 <FONT color="green">1250</FONT> final T[] blockIJ = blocks[iBlock * blockColumns + jBlock];<a name="line.1250"></a>
1254 <FONT color="green">1251</FONT> blockIJ[k] = blockIJ[k].add(increment);<a name="line.1251"></a>
1255 <FONT color="green">1252</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.1252"></a>
1256 <FONT color="green">1253</FONT> throw new MatrixIndexException(<a name="line.1253"></a>
1257 <FONT color="green">1254</FONT> "no entry at indices ({0}, {1}) in a {2}x{3} matrix",<a name="line.1254"></a>
1258 <FONT color="green">1255</FONT> row, column, getRowDimension(), getColumnDimension());<a name="line.1255"></a>
1259 <FONT color="green">1256</FONT> }<a name="line.1256"></a>
1260 <FONT color="green">1257</FONT> }<a name="line.1257"></a>
1261 <FONT color="green">1258</FONT> <a name="line.1258"></a>
1262 <FONT color="green">1259</FONT> /** {@inheritDoc} */<a name="line.1259"></a>
1263 <FONT color="green">1260</FONT> @Override<a name="line.1260"></a>
1264 <FONT color="green">1261</FONT> public void multiplyEntry(final int row, final int column, final T factor)<a name="line.1261"></a>
1265 <FONT color="green">1262</FONT> throws MatrixIndexException {<a name="line.1262"></a>
1266 <FONT color="green">1263</FONT> try {<a name="line.1263"></a>
1267 <FONT color="green">1264</FONT> final int iBlock = row / BLOCK_SIZE;<a name="line.1264"></a>
1268 <FONT color="green">1265</FONT> final int jBlock = column / BLOCK_SIZE;<a name="line.1265"></a>
1269 <FONT color="green">1266</FONT> final int k = (row - iBlock * BLOCK_SIZE) * blockWidth(jBlock) +<a name="line.1266"></a>
1270 <FONT color="green">1267</FONT> (column - jBlock * BLOCK_SIZE);<a name="line.1267"></a>
1271 <FONT color="green">1268</FONT> final T[] blockIJ = blocks[iBlock * blockColumns + jBlock];<a name="line.1268"></a>
1272 <FONT color="green">1269</FONT> blockIJ[k] = blockIJ[k].multiply(factor);<a name="line.1269"></a>
1273 <FONT color="green">1270</FONT> } catch (ArrayIndexOutOfBoundsException e) {<a name="line.1270"></a>
1274 <FONT color="green">1271</FONT> throw new MatrixIndexException(<a name="line.1271"></a>
1275 <FONT color="green">1272</FONT> "no entry at indices ({0}, {1}) in a {2}x{3} matrix",<a name="line.1272"></a>
1276 <FONT color="green">1273</FONT> row, column, getRowDimension(), getColumnDimension());<a name="line.1273"></a>
1277 <FONT color="green">1274</FONT> }<a name="line.1274"></a>
1278 <FONT color="green">1275</FONT> }<a name="line.1275"></a>
1279 <FONT color="green">1276</FONT> <a name="line.1276"></a>
1280 <FONT color="green">1277</FONT> /** {@inheritDoc} */<a name="line.1277"></a>
1281 <FONT color="green">1278</FONT> @Override<a name="line.1278"></a>
1282 <FONT color="green">1279</FONT> public FieldMatrix&lt;T&gt; transpose() {<a name="line.1279"></a>
1283 <FONT color="green">1280</FONT> <a name="line.1280"></a>
1284 <FONT color="green">1281</FONT> final int nRows = getRowDimension();<a name="line.1281"></a>
1285 <FONT color="green">1282</FONT> final int nCols = getColumnDimension();<a name="line.1282"></a>
1286 <FONT color="green">1283</FONT> final BlockFieldMatrix&lt;T&gt; out = new BlockFieldMatrix&lt;T&gt;(getField(), nCols, nRows);<a name="line.1283"></a>
1287 <FONT color="green">1284</FONT> <a name="line.1284"></a>
1288 <FONT color="green">1285</FONT> // perform transpose block-wise, to ensure good cache behavior<a name="line.1285"></a>
1289 <FONT color="green">1286</FONT> int blockIndex = 0;<a name="line.1286"></a>
1290 <FONT color="green">1287</FONT> for (int iBlock = 0; iBlock &lt; blockColumns; ++iBlock) {<a name="line.1287"></a>
1291 <FONT color="green">1288</FONT> for (int jBlock = 0; jBlock &lt; blockRows; ++jBlock) {<a name="line.1288"></a>
1292 <FONT color="green">1289</FONT> <a name="line.1289"></a>
1293 <FONT color="green">1290</FONT> // transpose current block<a name="line.1290"></a>
1294 <FONT color="green">1291</FONT> final T[] outBlock = out.blocks[blockIndex];<a name="line.1291"></a>
1295 <FONT color="green">1292</FONT> final T[] tBlock = blocks[jBlock * blockColumns + iBlock];<a name="line.1292"></a>
1296 <FONT color="green">1293</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1293"></a>
1297 <FONT color="green">1294</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, columns);<a name="line.1294"></a>
1298 <FONT color="green">1295</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1295"></a>
1299 <FONT color="green">1296</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, rows);<a name="line.1296"></a>
1300 <FONT color="green">1297</FONT> int k = 0;<a name="line.1297"></a>
1301 <FONT color="green">1298</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1298"></a>
1302 <FONT color="green">1299</FONT> final int lInc = pEnd - pStart;<a name="line.1299"></a>
1303 <FONT color="green">1300</FONT> int l = p - pStart;<a name="line.1300"></a>
1304 <FONT color="green">1301</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1301"></a>
1305 <FONT color="green">1302</FONT> outBlock[k] = tBlock[l];<a name="line.1302"></a>
1306 <FONT color="green">1303</FONT> ++k;<a name="line.1303"></a>
1307 <FONT color="green">1304</FONT> l+= lInc;<a name="line.1304"></a>
1308 <FONT color="green">1305</FONT> }<a name="line.1305"></a>
1309 <FONT color="green">1306</FONT> }<a name="line.1306"></a>
1310 <FONT color="green">1307</FONT> <a name="line.1307"></a>
1311 <FONT color="green">1308</FONT> // go to next block<a name="line.1308"></a>
1312 <FONT color="green">1309</FONT> ++blockIndex;<a name="line.1309"></a>
1313 <FONT color="green">1310</FONT> <a name="line.1310"></a>
1314 <FONT color="green">1311</FONT> }<a name="line.1311"></a>
1315 <FONT color="green">1312</FONT> }<a name="line.1312"></a>
1316 <FONT color="green">1313</FONT> <a name="line.1313"></a>
1317 <FONT color="green">1314</FONT> return out;<a name="line.1314"></a>
1318 <FONT color="green">1315</FONT> <a name="line.1315"></a>
1319 <FONT color="green">1316</FONT> }<a name="line.1316"></a>
1320 <FONT color="green">1317</FONT> <a name="line.1317"></a>
1321 <FONT color="green">1318</FONT> /** {@inheritDoc} */<a name="line.1318"></a>
1322 <FONT color="green">1319</FONT> @Override<a name="line.1319"></a>
1323 <FONT color="green">1320</FONT> public int getRowDimension() {<a name="line.1320"></a>
1324 <FONT color="green">1321</FONT> return rows;<a name="line.1321"></a>
1325 <FONT color="green">1322</FONT> }<a name="line.1322"></a>
1326 <FONT color="green">1323</FONT> <a name="line.1323"></a>
1327 <FONT color="green">1324</FONT> /** {@inheritDoc} */<a name="line.1324"></a>
1328 <FONT color="green">1325</FONT> @Override<a name="line.1325"></a>
1329 <FONT color="green">1326</FONT> public int getColumnDimension() {<a name="line.1326"></a>
1330 <FONT color="green">1327</FONT> return columns;<a name="line.1327"></a>
1331 <FONT color="green">1328</FONT> }<a name="line.1328"></a>
1332 <FONT color="green">1329</FONT> <a name="line.1329"></a>
1333 <FONT color="green">1330</FONT> /** {@inheritDoc} */<a name="line.1330"></a>
1334 <FONT color="green">1331</FONT> @Override<a name="line.1331"></a>
1335 <FONT color="green">1332</FONT> public T[] operate(final T[] v)<a name="line.1332"></a>
1336 <FONT color="green">1333</FONT> throws IllegalArgumentException {<a name="line.1333"></a>
1337 <FONT color="green">1334</FONT> <a name="line.1334"></a>
1338 <FONT color="green">1335</FONT> if (v.length != columns) {<a name="line.1335"></a>
1339 <FONT color="green">1336</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1336"></a>
1340 <FONT color="green">1337</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.1337"></a>
1341 <FONT color="green">1338</FONT> v.length, columns);<a name="line.1338"></a>
1342 <FONT color="green">1339</FONT> }<a name="line.1339"></a>
1343 <FONT color="green">1340</FONT> final T[] out = buildArray(getField(), rows);<a name="line.1340"></a>
1344 <FONT color="green">1341</FONT> final T zero = getField().getZero();<a name="line.1341"></a>
1345 <FONT color="green">1342</FONT> <a name="line.1342"></a>
1346 <FONT color="green">1343</FONT> // perform multiplication block-wise, to ensure good cache behavior<a name="line.1343"></a>
1347 <FONT color="green">1344</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1344"></a>
1348 <FONT color="green">1345</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1345"></a>
1349 <FONT color="green">1346</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1346"></a>
1350 <FONT color="green">1347</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1347"></a>
1351 <FONT color="green">1348</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1348"></a>
1352 <FONT color="green">1349</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1349"></a>
1353 <FONT color="green">1350</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1350"></a>
1354 <FONT color="green">1351</FONT> int k = 0;<a name="line.1351"></a>
1355 <FONT color="green">1352</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1352"></a>
1356 <FONT color="green">1353</FONT> T sum = zero;<a name="line.1353"></a>
1357 <FONT color="green">1354</FONT> int q = qStart;<a name="line.1354"></a>
1358 <FONT color="green">1355</FONT> while (q &lt; qEnd - 3) {<a name="line.1355"></a>
1359 <FONT color="green">1356</FONT> sum = sum.<a name="line.1356"></a>
1360 <FONT color="green">1357</FONT> add(block[k].multiply(v[q])).<a name="line.1357"></a>
1361 <FONT color="green">1358</FONT> add(block[k + 1].multiply(v[q + 1])).<a name="line.1358"></a>
1362 <FONT color="green">1359</FONT> add(block[k + 2].multiply(v[q + 2])).<a name="line.1359"></a>
1363 <FONT color="green">1360</FONT> add(block[k + 3].multiply(v[q + 3]));<a name="line.1360"></a>
1364 <FONT color="green">1361</FONT> k += 4;<a name="line.1361"></a>
1365 <FONT color="green">1362</FONT> q += 4;<a name="line.1362"></a>
1366 <FONT color="green">1363</FONT> }<a name="line.1363"></a>
1367 <FONT color="green">1364</FONT> while (q &lt; qEnd) {<a name="line.1364"></a>
1368 <FONT color="green">1365</FONT> sum = sum.add(block[k++].multiply(v[q++]));<a name="line.1365"></a>
1369 <FONT color="green">1366</FONT> }<a name="line.1366"></a>
1370 <FONT color="green">1367</FONT> out[p] = out[p].add(sum);<a name="line.1367"></a>
1371 <FONT color="green">1368</FONT> }<a name="line.1368"></a>
1372 <FONT color="green">1369</FONT> }<a name="line.1369"></a>
1373 <FONT color="green">1370</FONT> }<a name="line.1370"></a>
1374 <FONT color="green">1371</FONT> <a name="line.1371"></a>
1375 <FONT color="green">1372</FONT> return out;<a name="line.1372"></a>
1376 <FONT color="green">1373</FONT> <a name="line.1373"></a>
1377 <FONT color="green">1374</FONT> }<a name="line.1374"></a>
1378 <FONT color="green">1375</FONT> <a name="line.1375"></a>
1379 <FONT color="green">1376</FONT> /** {@inheritDoc} */<a name="line.1376"></a>
1380 <FONT color="green">1377</FONT> @Override<a name="line.1377"></a>
1381 <FONT color="green">1378</FONT> public T[] preMultiply(final T[] v)<a name="line.1378"></a>
1382 <FONT color="green">1379</FONT> throws IllegalArgumentException {<a name="line.1379"></a>
1383 <FONT color="green">1380</FONT> <a name="line.1380"></a>
1384 <FONT color="green">1381</FONT> if (v.length != rows) {<a name="line.1381"></a>
1385 <FONT color="green">1382</FONT> throw MathRuntimeException.createIllegalArgumentException(<a name="line.1382"></a>
1386 <FONT color="green">1383</FONT> "vector length mismatch: got {0} but expected {1}",<a name="line.1383"></a>
1387 <FONT color="green">1384</FONT> v.length, rows);<a name="line.1384"></a>
1388 <FONT color="green">1385</FONT> }<a name="line.1385"></a>
1389 <FONT color="green">1386</FONT> final T[] out = buildArray(getField(), columns);<a name="line.1386"></a>
1390 <FONT color="green">1387</FONT> final T zero = getField().getZero();<a name="line.1387"></a>
1391 <FONT color="green">1388</FONT> <a name="line.1388"></a>
1392 <FONT color="green">1389</FONT> // perform multiplication block-wise, to ensure good cache behavior<a name="line.1389"></a>
1393 <FONT color="green">1390</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1390"></a>
1394 <FONT color="green">1391</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1391"></a>
1395 <FONT color="green">1392</FONT> final int jWidth2 = jWidth + jWidth;<a name="line.1392"></a>
1396 <FONT color="green">1393</FONT> final int jWidth3 = jWidth2 + jWidth;<a name="line.1393"></a>
1397 <FONT color="green">1394</FONT> final int jWidth4 = jWidth3 + jWidth;<a name="line.1394"></a>
1398 <FONT color="green">1395</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1395"></a>
1399 <FONT color="green">1396</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1396"></a>
1400 <FONT color="green">1397</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1397"></a>
1401 <FONT color="green">1398</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1398"></a>
1402 <FONT color="green">1399</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1399"></a>
1403 <FONT color="green">1400</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1400"></a>
1404 <FONT color="green">1401</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1401"></a>
1405 <FONT color="green">1402</FONT> int k = q - qStart;<a name="line.1402"></a>
1406 <FONT color="green">1403</FONT> T sum = zero;<a name="line.1403"></a>
1407 <FONT color="green">1404</FONT> int p = pStart;<a name="line.1404"></a>
1408 <FONT color="green">1405</FONT> while (p &lt; pEnd - 3) {<a name="line.1405"></a>
1409 <FONT color="green">1406</FONT> sum = sum.<a name="line.1406"></a>
1410 <FONT color="green">1407</FONT> add(block[k].multiply(v[p])).<a name="line.1407"></a>
1411 <FONT color="green">1408</FONT> add(block[k + jWidth].multiply(v[p + 1])).<a name="line.1408"></a>
1412 <FONT color="green">1409</FONT> add(block[k + jWidth2].multiply(v[p + 2])).<a name="line.1409"></a>
1413 <FONT color="green">1410</FONT> add(block[k + jWidth3].multiply(v[p + 3]));<a name="line.1410"></a>
1414 <FONT color="green">1411</FONT> k += jWidth4;<a name="line.1411"></a>
1415 <FONT color="green">1412</FONT> p += 4;<a name="line.1412"></a>
1416 <FONT color="green">1413</FONT> }<a name="line.1413"></a>
1417 <FONT color="green">1414</FONT> while (p &lt; pEnd) {<a name="line.1414"></a>
1418 <FONT color="green">1415</FONT> sum = sum.add(block[k].multiply(v[p++]));<a name="line.1415"></a>
1419 <FONT color="green">1416</FONT> k += jWidth;<a name="line.1416"></a>
1420 <FONT color="green">1417</FONT> }<a name="line.1417"></a>
1421 <FONT color="green">1418</FONT> out[q] = out[q].add(sum);<a name="line.1418"></a>
1422 <FONT color="green">1419</FONT> }<a name="line.1419"></a>
1423 <FONT color="green">1420</FONT> }<a name="line.1420"></a>
1424 <FONT color="green">1421</FONT> }<a name="line.1421"></a>
1425 <FONT color="green">1422</FONT> <a name="line.1422"></a>
1426 <FONT color="green">1423</FONT> return out;<a name="line.1423"></a>
1427 <FONT color="green">1424</FONT> <a name="line.1424"></a>
1428 <FONT color="green">1425</FONT> }<a name="line.1425"></a>
1429 <FONT color="green">1426</FONT> <a name="line.1426"></a>
1430 <FONT color="green">1427</FONT> /** {@inheritDoc} */<a name="line.1427"></a>
1431 <FONT color="green">1428</FONT> @Override<a name="line.1428"></a>
1432 <FONT color="green">1429</FONT> public T walkInRowOrder(final FieldMatrixChangingVisitor&lt;T&gt; visitor)<a name="line.1429"></a>
1433 <FONT color="green">1430</FONT> throws MatrixVisitorException {<a name="line.1430"></a>
1434 <FONT color="green">1431</FONT> visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);<a name="line.1431"></a>
1435 <FONT color="green">1432</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1432"></a>
1436 <FONT color="green">1433</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1433"></a>
1437 <FONT color="green">1434</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1434"></a>
1438 <FONT color="green">1435</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1435"></a>
1439 <FONT color="green">1436</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1436"></a>
1440 <FONT color="green">1437</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1437"></a>
1441 <FONT color="green">1438</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1438"></a>
1442 <FONT color="green">1439</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1439"></a>
1443 <FONT color="green">1440</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1440"></a>
1444 <FONT color="green">1441</FONT> int k = (p - pStart) * jWidth;<a name="line.1441"></a>
1445 <FONT color="green">1442</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1442"></a>
1446 <FONT color="green">1443</FONT> block[k] = visitor.visit(p, q, block[k]);<a name="line.1443"></a>
1447 <FONT color="green">1444</FONT> ++k;<a name="line.1444"></a>
1448 <FONT color="green">1445</FONT> }<a name="line.1445"></a>
1449 <FONT color="green">1446</FONT> }<a name="line.1446"></a>
1450 <FONT color="green">1447</FONT> }<a name="line.1447"></a>
1451 <FONT color="green">1448</FONT> }<a name="line.1448"></a>
1452 <FONT color="green">1449</FONT> return visitor.end();<a name="line.1449"></a>
1453 <FONT color="green">1450</FONT> }<a name="line.1450"></a>
1454 <FONT color="green">1451</FONT> <a name="line.1451"></a>
1455 <FONT color="green">1452</FONT> /** {@inheritDoc} */<a name="line.1452"></a>
1456 <FONT color="green">1453</FONT> @Override<a name="line.1453"></a>
1457 <FONT color="green">1454</FONT> public T walkInRowOrder(final FieldMatrixPreservingVisitor&lt;T&gt; visitor)<a name="line.1454"></a>
1458 <FONT color="green">1455</FONT> throws MatrixVisitorException {<a name="line.1455"></a>
1459 <FONT color="green">1456</FONT> visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);<a name="line.1456"></a>
1460 <FONT color="green">1457</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1457"></a>
1461 <FONT color="green">1458</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1458"></a>
1462 <FONT color="green">1459</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1459"></a>
1463 <FONT color="green">1460</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1460"></a>
1464 <FONT color="green">1461</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1461"></a>
1465 <FONT color="green">1462</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1462"></a>
1466 <FONT color="green">1463</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1463"></a>
1467 <FONT color="green">1464</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1464"></a>
1468 <FONT color="green">1465</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1465"></a>
1469 <FONT color="green">1466</FONT> int k = (p - pStart) * jWidth;<a name="line.1466"></a>
1470 <FONT color="green">1467</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1467"></a>
1471 <FONT color="green">1468</FONT> visitor.visit(p, q, block[k]);<a name="line.1468"></a>
1472 <FONT color="green">1469</FONT> ++k;<a name="line.1469"></a>
1473 <FONT color="green">1470</FONT> }<a name="line.1470"></a>
1474 <FONT color="green">1471</FONT> }<a name="line.1471"></a>
1475 <FONT color="green">1472</FONT> }<a name="line.1472"></a>
1476 <FONT color="green">1473</FONT> }<a name="line.1473"></a>
1477 <FONT color="green">1474</FONT> return visitor.end();<a name="line.1474"></a>
1478 <FONT color="green">1475</FONT> }<a name="line.1475"></a>
1479 <FONT color="green">1476</FONT> <a name="line.1476"></a>
1480 <FONT color="green">1477</FONT> /** {@inheritDoc} */<a name="line.1477"></a>
1481 <FONT color="green">1478</FONT> @Override<a name="line.1478"></a>
1482 <FONT color="green">1479</FONT> public T walkInRowOrder(final FieldMatrixChangingVisitor&lt;T&gt; visitor,<a name="line.1479"></a>
1483 <FONT color="green">1480</FONT> final int startRow, final int endRow,<a name="line.1480"></a>
1484 <FONT color="green">1481</FONT> final int startColumn, final int endColumn)<a name="line.1481"></a>
1485 <FONT color="green">1482</FONT> throws MatrixIndexException, MatrixVisitorException {<a name="line.1482"></a>
1486 <FONT color="green">1483</FONT> checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);<a name="line.1483"></a>
1487 <FONT color="green">1484</FONT> visitor.start(rows, columns, startRow, endRow, startColumn, endColumn);<a name="line.1484"></a>
1488 <FONT color="green">1485</FONT> for (int iBlock = startRow / BLOCK_SIZE; iBlock &lt; 1 + endRow / BLOCK_SIZE; ++iBlock) {<a name="line.1485"></a>
1489 <FONT color="green">1486</FONT> final int p0 = iBlock * BLOCK_SIZE;<a name="line.1486"></a>
1490 <FONT color="green">1487</FONT> final int pStart = Math.max(startRow, p0);<a name="line.1487"></a>
1491 <FONT color="green">1488</FONT> final int pEnd = Math.min((iBlock + 1) * BLOCK_SIZE, 1 + endRow);<a name="line.1488"></a>
1492 <FONT color="green">1489</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1489"></a>
1493 <FONT color="green">1490</FONT> for (int jBlock = startColumn / BLOCK_SIZE; jBlock &lt; 1 + endColumn / BLOCK_SIZE; ++jBlock) {<a name="line.1490"></a>
1494 <FONT color="green">1491</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1491"></a>
1495 <FONT color="green">1492</FONT> final int q0 = jBlock * BLOCK_SIZE;<a name="line.1492"></a>
1496 <FONT color="green">1493</FONT> final int qStart = Math.max(startColumn, q0);<a name="line.1493"></a>
1497 <FONT color="green">1494</FONT> final int qEnd = Math.min((jBlock + 1) * BLOCK_SIZE, 1 + endColumn);<a name="line.1494"></a>
1498 <FONT color="green">1495</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1495"></a>
1499 <FONT color="green">1496</FONT> int k = (p - p0) * jWidth + qStart - q0;<a name="line.1496"></a>
1500 <FONT color="green">1497</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1497"></a>
1501 <FONT color="green">1498</FONT> block[k] = visitor.visit(p, q, block[k]);<a name="line.1498"></a>
1502 <FONT color="green">1499</FONT> ++k;<a name="line.1499"></a>
1503 <FONT color="green">1500</FONT> }<a name="line.1500"></a>
1504 <FONT color="green">1501</FONT> }<a name="line.1501"></a>
1505 <FONT color="green">1502</FONT> }<a name="line.1502"></a>
1506 <FONT color="green">1503</FONT> }<a name="line.1503"></a>
1507 <FONT color="green">1504</FONT> return visitor.end();<a name="line.1504"></a>
1508 <FONT color="green">1505</FONT> }<a name="line.1505"></a>
1509 <FONT color="green">1506</FONT> <a name="line.1506"></a>
1510 <FONT color="green">1507</FONT> /** {@inheritDoc} */<a name="line.1507"></a>
1511 <FONT color="green">1508</FONT> @Override<a name="line.1508"></a>
1512 <FONT color="green">1509</FONT> public T walkInRowOrder(final FieldMatrixPreservingVisitor&lt;T&gt; visitor,<a name="line.1509"></a>
1513 <FONT color="green">1510</FONT> final int startRow, final int endRow,<a name="line.1510"></a>
1514 <FONT color="green">1511</FONT> final int startColumn, final int endColumn)<a name="line.1511"></a>
1515 <FONT color="green">1512</FONT> throws MatrixIndexException, MatrixVisitorException {<a name="line.1512"></a>
1516 <FONT color="green">1513</FONT> checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);<a name="line.1513"></a>
1517 <FONT color="green">1514</FONT> visitor.start(rows, columns, startRow, endRow, startColumn, endColumn);<a name="line.1514"></a>
1518 <FONT color="green">1515</FONT> for (int iBlock = startRow / BLOCK_SIZE; iBlock &lt; 1 + endRow / BLOCK_SIZE; ++iBlock) {<a name="line.1515"></a>
1519 <FONT color="green">1516</FONT> final int p0 = iBlock * BLOCK_SIZE;<a name="line.1516"></a>
1520 <FONT color="green">1517</FONT> final int pStart = Math.max(startRow, p0);<a name="line.1517"></a>
1521 <FONT color="green">1518</FONT> final int pEnd = Math.min((iBlock + 1) * BLOCK_SIZE, 1 + endRow);<a name="line.1518"></a>
1522 <FONT color="green">1519</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1519"></a>
1523 <FONT color="green">1520</FONT> for (int jBlock = startColumn / BLOCK_SIZE; jBlock &lt; 1 + endColumn / BLOCK_SIZE; ++jBlock) {<a name="line.1520"></a>
1524 <FONT color="green">1521</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1521"></a>
1525 <FONT color="green">1522</FONT> final int q0 = jBlock * BLOCK_SIZE;<a name="line.1522"></a>
1526 <FONT color="green">1523</FONT> final int qStart = Math.max(startColumn, q0);<a name="line.1523"></a>
1527 <FONT color="green">1524</FONT> final int qEnd = Math.min((jBlock + 1) * BLOCK_SIZE, 1 + endColumn);<a name="line.1524"></a>
1528 <FONT color="green">1525</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1525"></a>
1529 <FONT color="green">1526</FONT> int k = (p - p0) * jWidth + qStart - q0;<a name="line.1526"></a>
1530 <FONT color="green">1527</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1527"></a>
1531 <FONT color="green">1528</FONT> visitor.visit(p, q, block[k]);<a name="line.1528"></a>
1532 <FONT color="green">1529</FONT> ++k;<a name="line.1529"></a>
1533 <FONT color="green">1530</FONT> }<a name="line.1530"></a>
1534 <FONT color="green">1531</FONT> }<a name="line.1531"></a>
1535 <FONT color="green">1532</FONT> }<a name="line.1532"></a>
1536 <FONT color="green">1533</FONT> }<a name="line.1533"></a>
1537 <FONT color="green">1534</FONT> return visitor.end();<a name="line.1534"></a>
1538 <FONT color="green">1535</FONT> }<a name="line.1535"></a>
1539 <FONT color="green">1536</FONT> <a name="line.1536"></a>
1540 <FONT color="green">1537</FONT> /** {@inheritDoc} */<a name="line.1537"></a>
1541 <FONT color="green">1538</FONT> @Override<a name="line.1538"></a>
1542 <FONT color="green">1539</FONT> public T walkInOptimizedOrder(final FieldMatrixChangingVisitor&lt;T&gt; visitor)<a name="line.1539"></a>
1543 <FONT color="green">1540</FONT> throws MatrixVisitorException {<a name="line.1540"></a>
1544 <FONT color="green">1541</FONT> visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);<a name="line.1541"></a>
1545 <FONT color="green">1542</FONT> int blockIndex = 0;<a name="line.1542"></a>
1546 <FONT color="green">1543</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1543"></a>
1547 <FONT color="green">1544</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1544"></a>
1548 <FONT color="green">1545</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1545"></a>
1549 <FONT color="green">1546</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1546"></a>
1550 <FONT color="green">1547</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1547"></a>
1551 <FONT color="green">1548</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1548"></a>
1552 <FONT color="green">1549</FONT> final T[] block = blocks[blockIndex];<a name="line.1549"></a>
1553 <FONT color="green">1550</FONT> int k = 0;<a name="line.1550"></a>
1554 <FONT color="green">1551</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1551"></a>
1555 <FONT color="green">1552</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1552"></a>
1556 <FONT color="green">1553</FONT> block[k] = visitor.visit(p, q, block[k]);<a name="line.1553"></a>
1557 <FONT color="green">1554</FONT> ++k;<a name="line.1554"></a>
1558 <FONT color="green">1555</FONT> }<a name="line.1555"></a>
1559 <FONT color="green">1556</FONT> }<a name="line.1556"></a>
1560 <FONT color="green">1557</FONT> ++blockIndex;<a name="line.1557"></a>
1561 <FONT color="green">1558</FONT> }<a name="line.1558"></a>
1562 <FONT color="green">1559</FONT> }<a name="line.1559"></a>
1563 <FONT color="green">1560</FONT> return visitor.end();<a name="line.1560"></a>
1564 <FONT color="green">1561</FONT> }<a name="line.1561"></a>
1565 <FONT color="green">1562</FONT> <a name="line.1562"></a>
1566 <FONT color="green">1563</FONT> /** {@inheritDoc} */<a name="line.1563"></a>
1567 <FONT color="green">1564</FONT> @Override<a name="line.1564"></a>
1568 <FONT color="green">1565</FONT> public T walkInOptimizedOrder(final FieldMatrixPreservingVisitor&lt;T&gt; visitor)<a name="line.1565"></a>
1569 <FONT color="green">1566</FONT> throws MatrixVisitorException {<a name="line.1566"></a>
1570 <FONT color="green">1567</FONT> visitor.start(rows, columns, 0, rows - 1, 0, columns - 1);<a name="line.1567"></a>
1571 <FONT color="green">1568</FONT> int blockIndex = 0;<a name="line.1568"></a>
1572 <FONT color="green">1569</FONT> for (int iBlock = 0; iBlock &lt; blockRows; ++iBlock) {<a name="line.1569"></a>
1573 <FONT color="green">1570</FONT> final int pStart = iBlock * BLOCK_SIZE;<a name="line.1570"></a>
1574 <FONT color="green">1571</FONT> final int pEnd = Math.min(pStart + BLOCK_SIZE, rows);<a name="line.1571"></a>
1575 <FONT color="green">1572</FONT> for (int jBlock = 0; jBlock &lt; blockColumns; ++jBlock) {<a name="line.1572"></a>
1576 <FONT color="green">1573</FONT> final int qStart = jBlock * BLOCK_SIZE;<a name="line.1573"></a>
1577 <FONT color="green">1574</FONT> final int qEnd = Math.min(qStart + BLOCK_SIZE, columns);<a name="line.1574"></a>
1578 <FONT color="green">1575</FONT> final T[] block = blocks[blockIndex];<a name="line.1575"></a>
1579 <FONT color="green">1576</FONT> int k = 0;<a name="line.1576"></a>
1580 <FONT color="green">1577</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1577"></a>
1581 <FONT color="green">1578</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1578"></a>
1582 <FONT color="green">1579</FONT> visitor.visit(p, q, block[k]);<a name="line.1579"></a>
1583 <FONT color="green">1580</FONT> ++k;<a name="line.1580"></a>
1584 <FONT color="green">1581</FONT> }<a name="line.1581"></a>
1585 <FONT color="green">1582</FONT> }<a name="line.1582"></a>
1586 <FONT color="green">1583</FONT> ++blockIndex;<a name="line.1583"></a>
1587 <FONT color="green">1584</FONT> }<a name="line.1584"></a>
1588 <FONT color="green">1585</FONT> }<a name="line.1585"></a>
1589 <FONT color="green">1586</FONT> return visitor.end();<a name="line.1586"></a>
1590 <FONT color="green">1587</FONT> }<a name="line.1587"></a>
1591 <FONT color="green">1588</FONT> <a name="line.1588"></a>
1592 <FONT color="green">1589</FONT> /** {@inheritDoc} */<a name="line.1589"></a>
1593 <FONT color="green">1590</FONT> @Override<a name="line.1590"></a>
1594 <FONT color="green">1591</FONT> public T walkInOptimizedOrder(final FieldMatrixChangingVisitor&lt;T&gt; visitor,<a name="line.1591"></a>
1595 <FONT color="green">1592</FONT> final int startRow, final int endRow,<a name="line.1592"></a>
1596 <FONT color="green">1593</FONT> final int startColumn, final int endColumn)<a name="line.1593"></a>
1597 <FONT color="green">1594</FONT> throws MatrixIndexException, MatrixVisitorException {<a name="line.1594"></a>
1598 <FONT color="green">1595</FONT> checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);<a name="line.1595"></a>
1599 <FONT color="green">1596</FONT> visitor.start(rows, columns, startRow, endRow, startColumn, endColumn);<a name="line.1596"></a>
1600 <FONT color="green">1597</FONT> for (int iBlock = startRow / BLOCK_SIZE; iBlock &lt; 1 + endRow / BLOCK_SIZE; ++iBlock) {<a name="line.1597"></a>
1601 <FONT color="green">1598</FONT> final int p0 = iBlock * BLOCK_SIZE;<a name="line.1598"></a>
1602 <FONT color="green">1599</FONT> final int pStart = Math.max(startRow, p0);<a name="line.1599"></a>
1603 <FONT color="green">1600</FONT> final int pEnd = Math.min((iBlock + 1) * BLOCK_SIZE, 1 + endRow);<a name="line.1600"></a>
1604 <FONT color="green">1601</FONT> for (int jBlock = startColumn / BLOCK_SIZE; jBlock &lt; 1 + endColumn / BLOCK_SIZE; ++jBlock) {<a name="line.1601"></a>
1605 <FONT color="green">1602</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1602"></a>
1606 <FONT color="green">1603</FONT> final int q0 = jBlock * BLOCK_SIZE;<a name="line.1603"></a>
1607 <FONT color="green">1604</FONT> final int qStart = Math.max(startColumn, q0);<a name="line.1604"></a>
1608 <FONT color="green">1605</FONT> final int qEnd = Math.min((jBlock + 1) * BLOCK_SIZE, 1 + endColumn);<a name="line.1605"></a>
1609 <FONT color="green">1606</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1606"></a>
1610 <FONT color="green">1607</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1607"></a>
1611 <FONT color="green">1608</FONT> int k = (p - p0) * jWidth + qStart - q0;<a name="line.1608"></a>
1612 <FONT color="green">1609</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1609"></a>
1613 <FONT color="green">1610</FONT> block[k] = visitor.visit(p, q, block[k]);<a name="line.1610"></a>
1614 <FONT color="green">1611</FONT> ++k;<a name="line.1611"></a>
1615 <FONT color="green">1612</FONT> }<a name="line.1612"></a>
1616 <FONT color="green">1613</FONT> }<a name="line.1613"></a>
1617 <FONT color="green">1614</FONT> }<a name="line.1614"></a>
1618 <FONT color="green">1615</FONT> }<a name="line.1615"></a>
1619 <FONT color="green">1616</FONT> return visitor.end();<a name="line.1616"></a>
1620 <FONT color="green">1617</FONT> }<a name="line.1617"></a>
1621 <FONT color="green">1618</FONT> <a name="line.1618"></a>
1622 <FONT color="green">1619</FONT> /** {@inheritDoc} */<a name="line.1619"></a>
1623 <FONT color="green">1620</FONT> @Override<a name="line.1620"></a>
1624 <FONT color="green">1621</FONT> public T walkInOptimizedOrder(final FieldMatrixPreservingVisitor&lt;T&gt; visitor,<a name="line.1621"></a>
1625 <FONT color="green">1622</FONT> final int startRow, final int endRow,<a name="line.1622"></a>
1626 <FONT color="green">1623</FONT> final int startColumn, final int endColumn)<a name="line.1623"></a>
1627 <FONT color="green">1624</FONT> throws MatrixIndexException, MatrixVisitorException {<a name="line.1624"></a>
1628 <FONT color="green">1625</FONT> checkSubMatrixIndex(startRow, endRow, startColumn, endColumn);<a name="line.1625"></a>
1629 <FONT color="green">1626</FONT> visitor.start(rows, columns, startRow, endRow, startColumn, endColumn);<a name="line.1626"></a>
1630 <FONT color="green">1627</FONT> for (int iBlock = startRow / BLOCK_SIZE; iBlock &lt; 1 + endRow / BLOCK_SIZE; ++iBlock) {<a name="line.1627"></a>
1631 <FONT color="green">1628</FONT> final int p0 = iBlock * BLOCK_SIZE;<a name="line.1628"></a>
1632 <FONT color="green">1629</FONT> final int pStart = Math.max(startRow, p0);<a name="line.1629"></a>
1633 <FONT color="green">1630</FONT> final int pEnd = Math.min((iBlock + 1) * BLOCK_SIZE, 1 + endRow);<a name="line.1630"></a>
1634 <FONT color="green">1631</FONT> for (int jBlock = startColumn / BLOCK_SIZE; jBlock &lt; 1 + endColumn / BLOCK_SIZE; ++jBlock) {<a name="line.1631"></a>
1635 <FONT color="green">1632</FONT> final int jWidth = blockWidth(jBlock);<a name="line.1632"></a>
1636 <FONT color="green">1633</FONT> final int q0 = jBlock * BLOCK_SIZE;<a name="line.1633"></a>
1637 <FONT color="green">1634</FONT> final int qStart = Math.max(startColumn, q0);<a name="line.1634"></a>
1638 <FONT color="green">1635</FONT> final int qEnd = Math.min((jBlock + 1) * BLOCK_SIZE, 1 + endColumn);<a name="line.1635"></a>
1639 <FONT color="green">1636</FONT> final T[] block = blocks[iBlock * blockColumns + jBlock];<a name="line.1636"></a>
1640 <FONT color="green">1637</FONT> for (int p = pStart; p &lt; pEnd; ++p) {<a name="line.1637"></a>
1641 <FONT color="green">1638</FONT> int k = (p - p0) * jWidth + qStart - q0;<a name="line.1638"></a>
1642 <FONT color="green">1639</FONT> for (int q = qStart; q &lt; qEnd; ++q) {<a name="line.1639"></a>
1643 <FONT color="green">1640</FONT> visitor.visit(p, q, block[k]);<a name="line.1640"></a>
1644 <FONT color="green">1641</FONT> ++k;<a name="line.1641"></a>
1645 <FONT color="green">1642</FONT> }<a name="line.1642"></a>
1646 <FONT color="green">1643</FONT> }<a name="line.1643"></a>
1647 <FONT color="green">1644</FONT> }<a name="line.1644"></a>
1648 <FONT color="green">1645</FONT> }<a name="line.1645"></a>
1649 <FONT color="green">1646</FONT> return visitor.end();<a name="line.1646"></a>
1650 <FONT color="green">1647</FONT> }<a name="line.1647"></a>
1651 <FONT color="green">1648</FONT> <a name="line.1648"></a>
1652 <FONT color="green">1649</FONT> /**<a name="line.1649"></a>
1653 <FONT color="green">1650</FONT> * Get the height of a block.<a name="line.1650"></a>
1654 <FONT color="green">1651</FONT> * @param blockRow row index (in block sense) of the block<a name="line.1651"></a>
1655 <FONT color="green">1652</FONT> * @return height (number of rows) of the block<a name="line.1652"></a>
1656 <FONT color="green">1653</FONT> */<a name="line.1653"></a>
1657 <FONT color="green">1654</FONT> private int blockHeight(final int blockRow) {<a name="line.1654"></a>
1658 <FONT color="green">1655</FONT> return (blockRow == blockRows - 1) ? rows - blockRow * BLOCK_SIZE : BLOCK_SIZE;<a name="line.1655"></a>
1659 <FONT color="green">1656</FONT> }<a name="line.1656"></a>
1660 <FONT color="green">1657</FONT> <a name="line.1657"></a>
1661 <FONT color="green">1658</FONT> /**<a name="line.1658"></a>
1662 <FONT color="green">1659</FONT> * Get the width of a block.<a name="line.1659"></a>
1663 <FONT color="green">1660</FONT> * @param blockColumn column index (in block sense) of the block<a name="line.1660"></a>
1664 <FONT color="green">1661</FONT> * @return width (number of columns) of the block<a name="line.1661"></a>
1665 <FONT color="green">1662</FONT> */<a name="line.1662"></a>
1666 <FONT color="green">1663</FONT> private int blockWidth(final int blockColumn) {<a name="line.1663"></a>
1667 <FONT color="green">1664</FONT> return (blockColumn == blockColumns - 1) ? columns - blockColumn * BLOCK_SIZE : BLOCK_SIZE;<a name="line.1664"></a>
1668 <FONT color="green">1665</FONT> }<a name="line.1665"></a>
1669 <FONT color="green">1666</FONT> <a name="line.1666"></a>
1670 <FONT color="green">1667</FONT> }<a name="line.1667"></a>
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731 </PRE>
1732 </BODY>
1733 </HTML>