STK++ 0.9.13
STK_ProductRaw.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------*/
2/* Copyright (C) 2004-2016 Serge Iovleff, Université Lille 1, Inria
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU Lesser General Public License as
6 published by the Free Software Foundation; either version 2 of the
7 License, or (at your option) any later version.
8
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU Lesser General Public License for more details.
13
14 You should have received a copy of the GNU Lesser General Public
15 License along with this program; if not, write to the
16 Free Software Foundation, Inc.,
17 59 Temple Place,
18 Suite 330,
19 Boston, MA 02111-1307
20 USA
21
22 Contact : S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
23*/
24
25/*
26 * Project: stkpp::Arrays
27 * created on: 25 déc. 2012
28 * Author: iovleff, S..._Dot_I..._At_stkpp_Dot_org (see copyright for ...)
29 **/
30
35#ifndef STK_PRODUCTRAW_H
36#define STK_PRODUCTRAW_H
37
38namespace STK
39{
40/* size of the block and panels used in the product algorithm */
41const int blockSize_ = 4;
42const int panelSize_ = 64;
43const int panelTotal= 256; // = 64 * 4
44
45const int vectorSize = 256;
46
49
50namespace hidden
51{
55template<class Type>
56struct Panel
57{
59 inline Type const& operator[](int i) const { return panel[i];}
60 inline Type& operator[](int i) { return panel[i];}
61};
62
66template<class Type>
67struct Block
68{
70 inline Type const& operator[](int i) const { return block[i];}
71 inline Type& operator[](int i) { return block[i];}
72};
73
77template<class Type>
78struct RawVec
79{
81 inline Type const& operator[](int i) const { return vec[i];}
82 inline Type& operator[](int i) { return vec[i];}
83};
84
89template<typename Lhs, typename Rhs, typename Result>
91{
92 typedef typename Result::Type Type;
93
95 static void dot( Lhs const& lhs, Rhs const& rhs, Result& res, int i, int j)
96 {
97 Range const dotRange = inf(lhs.rangeColsInRow(i), rhs.rangeRowsInCol(j));
98 for (int k=dotRange.begin(); k< dotRange.end(); ++k)
99 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
100 }
102 static void dot( Lhs const& lhs, ITContainer<Rhs, Arrays::vector_> const& rhs, Result& res, int i)
103 {
104 Range const dotRange = inf(lhs.rangeColsInRow(i), rhs.range());
105 for (int k=dotRange.begin(); k< dotRange.end(); ++k)
106 res.elt(i) += lhs.elt(i, k) * rhs.elt(k);
107 }
109 static void dot( ITContainer<Lhs, Arrays::point_> const& lhs, Rhs const& rhs, Result& res, int j)
110 {
111 Range const dotRange = inf(rhs.rangeRowsInCol(j), lhs.range());
112 for (int k=dotRange.begin(); k< dotRange.end(); ++k)
113 res.elt(j) += lhs.elt(k) * rhs.elt(k, j);
114 }
115
116 static bool multDispatcher( Lhs const& lhs, Rhs const& rhs, Result& res)
117 {
118 // small sizes
119 switch (lhs.sizeRows())
120 {
121 case 0: return true;
122 case 1: mul1XX(lhs, rhs, res); return true;
123 case 2: mul2XX(lhs, rhs, res); return true;
124 case 3: mul3XX(lhs, rhs, res); return true;
125 case 4: mul4XX(lhs, rhs, res); return true;
126 case 5: mul5XX(lhs, rhs, res); return true;
127 case 6: mul6XX(lhs, rhs, res); return true;
128 case 7: mul7XX(lhs, rhs, res); return true;
129 default: break;
130 }
131 switch (lhs.sizeCols())
132 {
133 case 0: return true; break;
134 case 1: mulX1X(lhs, rhs, res); return true;
135 case 2: mulX2X(lhs, rhs, res); return true;
136 case 3: mulX3X(lhs, rhs, res); return true;
137 case 4: mulX4X(lhs, rhs, res); return true;
138 case 5: mulX5X(lhs, rhs, res); return true;
139 case 6: mulX6X(lhs, rhs, res); return true;
140 case 7: mulX7X(lhs, rhs, res); return true;
141 default: break;
142 }
143 switch (rhs.sizeCols())
144 {
145 case 0: return true;
146 case 1: mulXX1(lhs, rhs, res); return true;
147 case 2: mulXX2(lhs, rhs, res); return true;
148 case 3: mulXX3(lhs, rhs, res); return true;
149 case 4: mulXX4(lhs, rhs, res); return true;
150 case 5: mulXX5(lhs, rhs, res); return true;
151 case 6: mulXX6(lhs, rhs, res); return true;
152 case 7: mulXX7(lhs, rhs, res); return true;
153 default: break;
154 }
155 return false;
156 }
158 static void mul1XX( Lhs const& lhs, Rhs const& rhs, Result& res)
159 {
160 int const lhsRow = lhs.beginRows();
161 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
162 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
163 res.elt(lhsRow, j) += lhs.elt(lhsRow, k) * rhs.elt(k, j);
164 }
166 static void mul2XX( Lhs const& lhs, Rhs const& rhs, Result& res)
167 {
168 int const i = lhs.beginRows();
169 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
170 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
171 {
172 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
173 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
174 }
175 }
177 static void mul3XX( Lhs const& lhs, Rhs const& rhs, Result& res)
178 {
179 int const i = lhs.beginRows();
180 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
181 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
182 {
183 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
184 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
185 res.elt(i+2, j) += lhs.elt(i+2, k) * rhs.elt(k, j);
186 }
187 }
189 static void mul4XX( Lhs const& lhs, Rhs const& rhs, Result& res)
190 {
191 int const i = lhs.beginRows();
192 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
193 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
194 {
195 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
196 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
197 res.elt(i+2, j) += lhs.elt(i+2, k) * rhs.elt(k, j);
198 res.elt(i+3, j) += lhs.elt(i+3, k) * rhs.elt(k, j);
199 }
200 }
202 static void mul5XX( Lhs const& lhs, Rhs const& rhs, Result& res)
203 {
204 int const i = lhs.beginRows();
205 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
206 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
207 {
208 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
209 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
210 res.elt(i+2, j) += lhs.elt(i+2, k) * rhs.elt(k, j);
211 res.elt(i+3, j) += lhs.elt(i+3, k) * rhs.elt(k, j);
212 res.elt(i+4, j) += lhs.elt(i+4, k) * rhs.elt(k, j);
213 }
214 }
216 static void mul6XX( Lhs const& lhs, Rhs const& rhs, Result& res)
217 {
218 int const i = lhs.beginRows();
219 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
220 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
221 {
222 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
223 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
224 res.elt(i+2, j) += lhs.elt(i+2, k) * rhs.elt(k, j);
225 res.elt(i+3, j) += lhs.elt(i+3, k) * rhs.elt(k, j);
226 res.elt(i+4, j) += lhs.elt(i+4, k) * rhs.elt(k, j);
227 res.elt(i+5, j) += lhs.elt(i+5, k) * rhs.elt(k, j);
228 }
229 }
231 static void mul7XX( Lhs const& lhs, Rhs const& rhs, Result& res)
232 {
233 int const i = lhs.beginRows();
234 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
235 for (int k=rhs.beginRows(); k< rhs.endRows(); ++k)
236 {
237 res.elt(i , j) += lhs.elt(i , k) * rhs.elt(k, j);
238 res.elt(i+1, j) += lhs.elt(i+1, k) * rhs.elt(k, j);
239 res.elt(i+2, j) += lhs.elt(i+2, k) * rhs.elt(k, j);
240 res.elt(i+3, j) += lhs.elt(i+3, k) * rhs.elt(k, j);
241 res.elt(i+4, j) += lhs.elt(i+4, k) * rhs.elt(k, j);
242 res.elt(i+5, j) += lhs.elt(i+5, k) * rhs.elt(k, j);
243 res.elt(i+6, j) += lhs.elt(i+6, k) * rhs.elt(k, j);
244 }
245 }
247 static void mulX1X( Lhs const& lhs, Rhs const& rhs, Result& res)
248 {
249 int const k = lhs.beginCols();
250 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
251 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
252 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
253 }
255 static void mulX2X( Lhs const& lhs, Rhs const& rhs, Result& res)
256 {
257 int const k = lhs.beginCols();
258 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
259 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
260 {
261 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
262 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
263 }
264 }
266 static void mulX3X( Lhs const& lhs, Rhs const& rhs, Result& res)
267 {
268 int const k = lhs.beginCols();
269 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
270 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
271 {
272 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
273 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
274 res.elt(i, j) += lhs.elt(i, k+2) * rhs.elt(k+2, j);
275 }
276 }
278 static void mulX4X( Lhs const& lhs, Rhs const& rhs, Result& res)
279 {
280 int const k = lhs.beginCols();
281 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
282 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
283 {
284 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
285 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
286 res.elt(i, j) += lhs.elt(i, k+2) * rhs.elt(k+2, j);
287 res.elt(i, j) += lhs.elt(i, k+3) * rhs.elt(k+3, j);
288 }
289 }
291 static void mulX5X( Lhs const& lhs, Rhs const& rhs, Result& res)
292 {
293 int const k = lhs.beginCols();
294 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
295 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
296 {
297 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
298 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
299 res.elt(i, j) += lhs.elt(i, k+2) * rhs.elt(k+2, j);
300 res.elt(i, j) += lhs.elt(i, k+3) * rhs.elt(k+3, j);
301 res.elt(i, j) += lhs.elt(i, k+4) * rhs.elt(k+4, j);
302 }
303 }
305 static void mulX6X( Lhs const& lhs, Rhs const& rhs, Result& res)
306 {
307 int const k = lhs.beginCols();
308 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
309 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
310 {
311 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
312 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
313 res.elt(i, j) += lhs.elt(i, k+2) * rhs.elt(k+2, j);
314 res.elt(i, j) += lhs.elt(i, k+3) * rhs.elt(k+3, j);
315 res.elt(i, j) += lhs.elt(i, k+4) * rhs.elt(k+4, j);
316 res.elt(i, j) += lhs.elt(i, k+5) * rhs.elt(k+5, j);
317 }
318 }
320 static void mulX7X( Lhs const& lhs, Rhs const& rhs, Result& res)
321 {
322 int const k = lhs.beginCols();
323 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
324 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
325 {
326 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
327 res.elt(i, j) += lhs.elt(i, k+1) * rhs.elt(k+1, j);
328 res.elt(i, j) += lhs.elt(i, k+2) * rhs.elt(k+2, j);
329 res.elt(i, j) += lhs.elt(i, k+3) * rhs.elt(k+3, j);
330 res.elt(i, j) += lhs.elt(i, k+4) * rhs.elt(k+4, j);
331 res.elt(i, j) += lhs.elt(i, k+5) * rhs.elt(k+5, j);
332 res.elt(i, j) += lhs.elt(i, k+6) * rhs.elt(k+6, j);
333 }
334 }
336 static void mulXX1( Lhs const& lhs, Rhs const& rhs, Result& res)
337 {
338 int const j = rhs.beginCols();
339 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
340 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
341 res.elt(i, j) += lhs.elt(i, k) * rhs.elt(k, j);
342 }
344 static void mulXX2( Lhs const& lhs, Rhs const& rhs, Result& res)
345 {
346 int const j = rhs.beginCols();
347 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
348 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
349 {
350 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
351 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
352 }
353 }
355 static void mulXX3( Lhs const& lhs, Rhs const& rhs, Result& res)
356 {
357 int const j = rhs.beginCols();
358 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
359 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
360 {
361 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
362 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
363 res.elt(i, j+2) += lhs.elt(i, k) * rhs.elt(k, j+2);
364 }
365 }
367 static void mulXX4( Lhs const& lhs, Rhs const& rhs, Result& res)
368 {
369 int const j = rhs.beginCols();
370 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
371 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
372 {
373 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
374 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
375 res.elt(i, j+2) += lhs.elt(i, k) * rhs.elt(k, j+2);
376 res.elt(i, j+3) += lhs.elt(i, k) * rhs.elt(k, j+3);
377 }
378 }
380 static void mulXX5( Lhs const& lhs, Rhs const& rhs, Result& res)
381 {
382 int const j = rhs.beginCols();
383 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
384 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
385 {
386 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
387 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
388 res.elt(i, j+2) += lhs.elt(i, k) * rhs.elt(k, j+2);
389 res.elt(i, j+3) += lhs.elt(i, k) * rhs.elt(k, j+3);
390 res.elt(i, j+4) += lhs.elt(i, k) * rhs.elt(k, j+4);
391 }
392 }
394 static void mulXX6( Lhs const& lhs, Rhs const& rhs, Result& res)
395 {
396 int const j = rhs.beginCols();
397 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
398 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
399 {
400 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
401 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
402 res.elt(i, j+2) += lhs.elt(i, k) * rhs.elt(k, j+2);
403 res.elt(i, j+3) += lhs.elt(i, k) * rhs.elt(k, j+3);
404 res.elt(i, j+4) += lhs.elt(i, k) * rhs.elt(k, j+4);
405 res.elt(i, j+5) += lhs.elt(i, k) * rhs.elt(k, j+5);
406 }
407 }
409 static void mulXX7( Lhs const& lhs, Rhs const& rhs, Result& res)
410 {
411 int const j = rhs.beginCols();
412 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
413 for (int k=lhs.beginCols(); k< lhs.endCols(); ++k)
414 {
415 res.elt(i, j ) += lhs.elt(i, k) * rhs.elt(k, j );
416 res.elt(i, j+1) += lhs.elt(i, k) * rhs.elt(k, j+1);
417 res.elt(i, j+2) += lhs.elt(i, k) * rhs.elt(k, j+2);
418 res.elt(i, j+3) += lhs.elt(i, k) * rhs.elt(k, j+3);
419 res.elt(i, j+4) += lhs.elt(i, k) * rhs.elt(k, j+4);
420 res.elt(i, j+5) += lhs.elt(i, k) * rhs.elt(k, j+5);
421 res.elt(i, j+6) += lhs.elt(i, k) * rhs.elt(k, j+6);
422 }
423 }
425 static void mult1Outer( Lhs const& lhs, Rhs const& rhs, Result& res, int k)
426 {
427 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
428 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
429 res.elt(i,j) += lhs.elt(i, k) * rhs.elt(k, j);
430 }
432 static void mult2Outer( Lhs const& lhs, Rhs const& rhs, Result& res, int k)
433 {
434 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
435 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
436 res.elt(i,j) += lhs.elt(i, k ) * rhs.elt(k, j)
437 + lhs.elt(i, k+1) * rhs.elt(k+1, j);
438 }
440 static void mult3Outer( Lhs const& lhs, Rhs const& rhs, Result& res, int k)
441 {
442 for (int i=lhs.beginRows(); i< lhs.endRows(); ++i)
443 for (int j=rhs.beginCols(); j< rhs.endCols(); ++j)
444 res.elt(i,j) += lhs.elt(i, k ) * rhs.elt(k, j)
445 + lhs.elt(i, k+1) * rhs.elt(k+1, j)
446 + lhs.elt(i, k+2) * rhs.elt(k+2, j);
447 }
448};
449
453template<typename Array, typename Type = typename Array::Type>
455{
457 static void arrayToBlock( Array const& m, Block<Type>& block, int iRow, int jCol)
458 {
459 block[0] = m.elt(iRow , jCol);
460 block[1] = m.elt(iRow , jCol+1);
461 block[2] = m.elt(iRow , jCol+2);
462 block[3] = m.elt(iRow , jCol+3);
463 block[4] = m.elt(iRow+1, jCol);
464 block[5] = m.elt(iRow+1, jCol+1);
465 block[6] = m.elt(iRow+1, jCol+2);
466 block[7] = m.elt(iRow+1, jCol+3);
467 block[8] = m.elt(iRow+2, jCol);
468 block[9] = m.elt(iRow+2, jCol+1);
469 block[10] = m.elt(iRow+2, jCol+2);
470 block[11] = m.elt(iRow+2, jCol+3);
471 block[12] = m.elt(iRow+3, jCol);
472 block[13] = m.elt(iRow+3, jCol+1);
473 block[14] = m.elt(iRow+3, jCol+2);
474 block[15] = m.elt(iRow+3, jCol+3);
475 }
477 static void arrayToBlock( Array const& m, Block<Type>& block, int iRow, int jCol, int bSize)
478 {
479 for (int i=0; i<bSize; ++i)
480 {
481 block[i*blockSize_ ] = m.elt(iRow+i, jCol);
482 block[i*blockSize_+1] = m.elt(iRow+i, jCol+1);
483 block[i*blockSize_+2] = m.elt(iRow+i, jCol+2);
484 block[i*blockSize_+3] = m.elt(iRow+i, jCol+3);
485 }
486 }
488 static void arrayToPanel( Array const& m, Panel<Type>& panel, int iRow, int jCol)
489 {
490 for (int j=0; j<panelSize_; ++j)
491 {
492 panel[j*blockSize_ ] = m.elt(iRow , jCol+j);
493 panel[j*blockSize_+1] = m.elt(iRow+1, jCol+j);
494 panel[j*blockSize_+2] = m.elt(iRow+2, jCol+j);
495 panel[j*blockSize_+3] = m.elt(iRow+3, jCol+j);
496 }
497 }
499 static void arrayToPanel( Array const& rhs, Panel<Type>& panel, int iRow, int jCol, int pSize)
500 {
501 for (int j=0; j<pSize; ++j)
502 {
503 panel[j*blockSize_ ] = rhs.elt(iRow , jCol+j);
504 panel[j*blockSize_+1] = rhs.elt(iRow+1, jCol+j);
505 panel[j*blockSize_+2] = rhs.elt(iRow+2, jCol+j);
506 panel[j*blockSize_+3] = rhs.elt(iRow+3, jCol+j);
507 }
508 }
510 static void arrayToBlockByCol( Array const& m, Block<Type>& block, int iRow, int jCol)
511 {
512 block[0] = m.elt(iRow , jCol);
513 block[1] = m.elt(iRow+1, jCol);
514 block[2] = m.elt(iRow+2, jCol);
515 block[3] = m.elt(iRow+3, jCol);
516 block[4] = m.elt(iRow , jCol+1);
517 block[5] = m.elt(iRow+1, jCol+1);
518 block[6] = m.elt(iRow+2, jCol+1);
519 block[7] = m.elt(iRow+3, jCol+1);
520 block[8] = m.elt(iRow , jCol+2);
521 block[9] = m.elt(iRow+1, jCol+2);
522 block[10] = m.elt(iRow+2, jCol+2);
523 block[11] = m.elt(iRow+3, jCol+2);
524 block[12] = m.elt(iRow , jCol+3);
525 block[13] = m.elt(iRow+1, jCol+3);
526 block[14] = m.elt(iRow+2, jCol+3);
527 block[15] = m.elt(iRow+3, jCol+3);
528 }
530 static void arrayToBlockByCol( Array const& m, Block<Type>& block, int iRow, int jCol, int bSize)
531 {
532 for (int j=0; j<bSize; ++j)
533 {
534 block[j*blockSize_ ] = m.elt(iRow, jCol+j);
535 block[j*blockSize_+1] = m.elt(iRow+1, jCol+j);
536 block[j*blockSize_+2] = m.elt(iRow+2, jCol+j);
537 block[j*blockSize_+3] = m.elt(iRow+3, jCol+j);
538 }
539 }
541 static void arrayToPanelByCol( Array const& m, Panel<Type>& panel, int iRow, int kPos)
542 {
543 for (int i=0; i<panelSize_; ++i)
544 {
545 panel[i*blockSize_ ] = m.elt(iRow+i,kPos);
546 panel[i*blockSize_+1] = m.elt(iRow+i,kPos+1);
547 panel[i*blockSize_+2] = m.elt(iRow+i,kPos+2);
548 panel[i*blockSize_+3] = m.elt(iRow+i,kPos+3);
549 }
550 }
552 static void arrayToPanelByCol( Array const& m, Panel<Type>& panel, int iRow, int kPos, int pSize)
553 {
554 for (int i=0; i<pSize; ++i)
555 {
556 panel[i*blockSize_ ] = m.elt(iRow+i, kPos);
557 panel[i*blockSize_+1] = m.elt(iRow+i, kPos+1);
558 panel[i*blockSize_+2] = m.elt(iRow+i, kPos+2);
559 panel[i*blockSize_+3] = m.elt(iRow+i, kPos+3);
560 }
561 }
562
563};
564
565} // namespace hidden
566
567} // namespace STK
568
569#endif /* STK_PRODUCTRAW_H */
The MultidimRegression class allows to regress a multidimensional output variable among a multivariat...
Index sub-vector region: Specialization when the size is unknown.
Definition STK_Range.h:265
Range inf(TRange< SizeI_ > const &I, TRange< SizeJ_ > const &J)
compute inf(I,J).
Definition STK_Range.h:477
The namespace STK is the main domain space of the Statistical ToolKit project.
TRange< panelSize_ > panelRange
const int panelSize_
const int blockSize_
TRange< blockSize_ > blockRange
const int panelTotal
const int vectorSize
This structure encapsulate the data allocated for a block.
Type const & operator[](int i) const
Type block[blockSize_ *blockSize_]
Type & operator[](int i)
This structure regroup the methods to used for copying part of an array in a Block or a Panel.
static void arrayToPanel(Array const &m, Panel< Type > &panel, int iRow, int jCol)
copy a part of an array in a Panel
static void arrayToBlockByCol(Array const &m, Block< Type > &block, int iRow, int jCol)
default dimensions
static void arrayToPanel(Array const &rhs, Panel< Type > &panel, int iRow, int jCol, int pSize)
copy a part of an array in a panel with Panel columns size given
static void arrayToBlock(Array const &m, Block< Type > &block, int iRow, int jCol)
copy a part of an Array in a Block
static void arrayToPanelByCol(Array const &m, Panel< Type > &panel, int iRow, int kPos, int pSize)
with panel size dimension given
static void arrayToBlockByCol(Array const &m, Block< Type > &block, int iRow, int jCol, int bSize)
with block size given
static void arrayToPanelByCol(Array const &m, Panel< Type > &panel, int iRow, int kPos)
default dimensions
static void arrayToBlock(Array const &m, Block< Type > &block, int iRow, int jCol, int bSize)
copy a part of an Array in a Block with block columns size given
This structure regroup the methods to used after block multiplication in order to perform the product...
static void mult2Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with two outer rows/columns
static void dot(Lhs const &lhs, ITContainer< Rhs, Arrays::vector_ > const &rhs, Result &res, int i)
dot product.
static void mult1Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with one outer rows/columns
static void dot(Lhs const &lhs, Rhs const &rhs, Result &res, int i, int j)
dot product.
static void mulXX5(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 5 columns
static void mult3Outer(Lhs const &lhs, Rhs const &rhs, Result &res, int k)
multiplication with three outer rows/columns
static void mulX4X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 4 columns and Rhs having 4 rows
static void mulXX7(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 7 columns
static void mulXX3(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 3 columns
static void mulXX2(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 2 columns
static void mulX6X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 6 columns and Rhs having 6 rows
static void mul2XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 2 rows
static void mul1XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 1 row
static void mulXX4(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 4 columns
static void mulX7X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 7 columns and Rhs having 7 rows
static void mul5XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 5 rows
static void mul4XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 4 rows
static void mul6XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 6 rows
static void dot(ITContainer< Lhs, Arrays::point_ > const &lhs, Rhs const &rhs, Result &res, int j)
dot product.
static void mul7XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 7 rows
static void mulXX6(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 6 columns
static void mulX2X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 2 columns and Rhs having 2 rows
static bool multDispatcher(Lhs const &lhs, Rhs const &rhs, Result &res)
static void mulX1X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 1 column and Rhs having 1 row
static void mul3XX(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 3 rows
static void mulXX1(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Rhs having 1 column
static void mulX5X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 5 columns and Rhs having 5 rows
static void mulX3X(Lhs const &lhs, Rhs const &rhs, Result &res)
multiplication with Lhs having 3 columns and Rhs having 3 rows
This structure encapsulate the data allocated for a panel.
Type & operator[](int i)
Type panel[blockSize_ *panelSize_]
Type const & operator[](int i) const
This structure encapsulate the data allocated for a block.
Type vec[panelSize_]
Type & operator[](int i)
Type const & operator[](int i) const