TinyMatrixInline.cxx
1 #ifndef MONTJOIE_FILE_TINY_MATRIX_INLINE_CXX
2 
3 #include "TinyMatrix.hxx"
4 
5 #include "TinyMatrixExpressionInline.cxx"
6 
7 namespace Seldon
8 {
9 
10  /***********************
11  * TinyMatrix<General> *
12  ***********************/
13 
14 
16  template<class T, int m, int n>
18  {
19  this->Zero();
20  }
21 
22 
24  template<class T, int m, int n>
26  {
27  this->Zero();
28  }
29 
30 
32  template<class T, int m, int n>
34  {
35  this->Zero();
36  }
37 
38 
40  template<class T, int m, int n> template<class T0>
43  {
44  TinyMatrixLoop<n>::Init(A, *this);
45  }
46 
47 
49  template<class T, int m, int n> template<class E>
52  {
53  TinyMatrixLoop<m*n>::Copy(A, *this);
54  }
55 
56 
58  template<class T, int m, int n>
60  {
61  return m;
62  }
63 
64 
66  template<class T, int m, int n>
68  {
69  return n;
70  }
71 
72 
74  template<class T, int m, int n>
76  {
77  return m*n;
78  }
79 
80 
82  template<class T, int m, int n>
84  {
85  return data_;
86  }
87 
88 
90  template<class T, int m, int n> template<class T1>
92  operator *=(const T1 & a )
93  {
95  return *this;
96  }
97 
98 
100  template<class T, int m, int n> template<class T1, class E>
103  {
105  return *this;
106  }
107 
108 
110  template<class T, int m, int n> template<class T1, class E>
113  {
115  return *this;
116  }
117 
118 
120  template<class T, int m, int n>
122  {
123  this->Fill(x);
124  return *this;
125  }
126 
127 
129  template<class T, int m, int n> template<class T0, class E>
132  {
133  TinyMatrixLoop<m*n>::Copy(A, *this);
134  return *this;
135  }
136 
137 
139  template<class T, int m, int n>
141  {
142 
143 #ifdef SELDON_CHECK_BOUNDS
144  CheckBounds(a, b, m, n, "TinyMatrix");
145 #endif
146 
147  return this->data_[a*n+b];
148  }
149 
150 
152  template<class T, int m, int n>
153  inline const T& TinyMatrix<T, General, m, n>::operator()(int a, int b) const
154  {
155 
156 #ifdef SELDON_CHECK_BOUNDS
157  CheckBounds(a, b, m, n, "TinyMatrix");
158 #endif
159 
160  return this->data_[a*n+b];
161  }
162 
163 
165  template<class T, int m, int n>
167  {
169  }
170 
171 
173  template<class T, int m, int n>
175  {
176 
177 #ifdef SELDON_CHECK_BOUNDS
178  if (m != n)
179  throw WrongDim("TinyMatrix::SetIdentity()",
180  "The number of rows should be equal to the number of columns");
181 #endif
182 
184  }
185 
186 
188  template<class T, int m, int n> template<class T0>
189  inline void TinyMatrix<T, General, m, n>::SetDiagonal(const T0& alpha)
190  {
191 
192 #ifdef SELDON_CHECK_BOUNDS
193  if (m != n)
194  throw WrongDim("TinyMatrix::SetDiagonal(alpha)",
195  "The number of rows should be equal to the number of columns");
196 #endif
197 
198  TinyMatrixLoop<m*n>::SetDiagonal(*this, alpha);
199  }
200 
201 
203  template<class T, int m, int n>
205  {
207  }
208 
209 
211  template<class T, int m, int n>
213  {
215  }
216 
217 
219  template<class T, int m, int n> template<class T0>
220  inline void TinyMatrix<T, General, m, n>::Fill(const T0& a)
221  {
222  TinyMatrixLoop<m*n>::Fill(*this, a);
223  }
224 
225 
227  template<class T, int m, int n>
229  {
230  return TinyMatrixLoop<m*n>::IsZero(*this);
231  }
232 
233 
235  template<class T, int m, int n>
236  inline void TinyMatrix<T, General, m, n>::Write(const string& file_name) const
237  {
238  ofstream out(file_name.data());
239  Write(out);
240  out.close();
241  }
242 
243 
245  template<class T, int m, int n>
246  inline void TinyMatrix<T, General, m, n>::Write(ostream& out) const
247  {
248  int itmp = m;
249  out.write(reinterpret_cast<char*>(&itmp), sizeof(int));
250  itmp = n;
251  out.write(reinterpret_cast<char*>(&itmp), sizeof(int));
252 
253  return TinyMatrixLoop<m>::Write(out, *this);
254  }
255 
256 
257  /************************
258  * TinyMatrixTripleLoop *
259  ************************/
260 
261 
263  template<int i, int j, int k> template<class T, int m>
266  {
267  A(j, k-1) += val*A(i, k-1);
269  }
270 
271 
273  template<int j, int k, int m> template<class T, int p>
276  {
277  vloc -= A(k, m-1)*A(m-1, j);
279  }
280 
281 
282  /************************
283  * TinyMatrixDoubleLoop *
284  ************************/
285 
286 
288  template<int p, int q> template<int m, int n, class T0, class T1>
289  inline void TinyMatrixDoubleLoop<p, q>::
291  {
292  A(q-1, p-1) = x(q-1);
294  }
295 
296 
298  template<int p, int q> template<int m, int n, class T, class E>
299  inline void TinyMatrixDoubleLoop<p, q>::
301  {
302  out << A(m-p, n-q) << " ";
304  }
305 
306 
308  template<int p, int q> template<int m, int n, class T, class Prop>
309  inline void TinyMatrixDoubleLoop<p, q>::
310  Write(ostream& out, const TinyMatrix<T, Prop, m, n>& A)
311  {
312  out.write(reinterpret_cast<const char*>(&A(m-p, n-q)), sizeof(T));
313 
315  }
316 
317 
318  template<int p, int q> template<int m, int n, class T, class E1, class E2>
319  inline bool TinyMatrixDoubleLoop<p, q>
322  {
323  if (abs(A(p-1, q-1) - B(p-1, q-1)) > TinyVector<T, m>::threshold)
324  return false;
325 
327  }
328 
329 
331  template<int i, int j> template<int m, int n, class T0, class E0,
332  class T1, class E1, class T2>
333  inline void TinyMatrixDoubleLoop<i, j>::
335  const TinyVectorExpression<T1, n, E1>& x, T2& val)
336  {
337  val += A(i-1, j)*x(j);
339  }
340 
341 
343  template<int p, int q>
344  template<int m, int n, int k, class T0, class E0,
345  class T1, class E1, class T2, class Prop2>
346  inline void TinyMatrixDoubleLoop<p, q>::
350  {
355 
357  }
358 
359 
361  template<int p, int q>
362  template<int m, int n, class T0, class T1, class E1, class T2, class E2, class T3>
363  inline void TinyMatrixDoubleLoop<p, q>::
366  {
367  A(p-1, q-1) += alpha*x(p-1)*y(q-1);
369  }
370 
371 
373  template<int p, int q>
374  template<int m, int n, class T1, class E1, class T2, class E2, class T3>
375  inline void TinyMatrixDoubleLoop<p, q>::
378  {
379  A(p-1, q-1) = x(p-1)*y(q-1);
381  }
382 
383 
385  template<int p, int q>
386  template<int m, class T0, class T1, class E1, class T3>
387  inline void TinyMatrixDoubleLoop<p, q>::
390  {
391  A(p-1, q-1) += alpha*x(p-1)*x(q-1);
393  }
394 
395 
397  template<int p, int q>
398  template<int m, class T1, class E1, class T3>
399  inline void TinyMatrixDoubleLoop<p, q>::
402  {
403  A(p-1, q-1) = x(p-1)*x(q-1);
405  }
406 
407 
409  template<int i, int j> template<class T, int m>
411  int& jmax, T& val)
412  {
413  if (abs(A(j, i)) > abs(val))
414  {
415  jmax = j;
416  val = A(j, i);
417  }
418 
419  TinyMatrixDoubleLoop<i, (j-1)*(j-1 > i)>::GetMaximumColumn(A, jmax, val);
420  }
421 
422 
424  template<int i, int j> template<class T, int m>
425  inline void TinyMatrixDoubleLoop<i, j>::
427  {
428  val = A(i, j-1);
429  A(i, j-1) = A(i2, j-1);
430  A(i2, j-1) = val;
432  }
433 
434 
436  template<int i, int j> template<class T, int m>
437  inline void TinyMatrixDoubleLoop<i, j>::
439  {
440  val = A(j-1, i);
441  A(j-1, i) = A(j-1, i2);
442  A(j-1, i2) = val;
444  }
445 
446 
448  template<int i, int j> template<class T, int m>
449  inline void TinyMatrixDoubleLoop<i, j>::
451  {
452  A(i, j-1) *= coef;
454  }
455 
456 
458  template<int i, int j> template<class T, int m>
459  inline void TinyMatrixDoubleLoop<i, j>::
461  {
462  // val = -a_ji / a_ii
463  val = -A(j, i)*coef;
464 
465  // replacing Lj by Lj + val * Li
467 
468  // storing val in a_ij
469  A(j, i) = val;
470 
471  TinyMatrixDoubleLoop<i, (j-1)*(j-1>i) >::PerformElimination(A, coef, val);
472  }
473 
474 
476  template<int i, int j1> template<class T, int m>
479  {
480  // j = m - 1 - j1 + i + 1
481  // val = -a_ij
482  val = -A(i, m - 1 - j1 + i + 1);
483 
484  // replacing Li by Li + val * Lj
486 
487  A(i, m - 1 - j1 + i + 1) = val*A(m - 1 - j1 + i + 1, m - 1 - j1 + i + 1);
488  TinyMatrixDoubleLoop<i, (j1-1)*(j1-1>i) >::PerformSolve(A, val);
489  }
490 
491 
493  template<int j, int k> template<class T, int m>
494  inline void TinyMatrixDoubleLoop<j, k>
496  {
497  val -= A(k-1, j)*A(k-1, j);
499  }
500 
501 
503  template<int j, int k> template<class T, int m>
504  inline void TinyMatrixDoubleLoop<j, k>
506  {
507  vloc = A(j, m-k);
509 
510  A(j, m-k) = vloc*invVal;
512  }
513 
514 
516  template<int i, int k> template<class T, class T2, int m>
517  inline void TinyMatrixDoubleLoop<i, k>
521  {
522  x(i+k) -= A(i, i+k)*x(i);
524  }
525 
526 
528  template<int i, int k> template<class T, class T2, int m>
529  inline void TinyMatrixDoubleLoop<i, k>
532  TinyVector<T2, m>& x, T2& val)
533  {
534  val -= A(i, i+k)*x(i+k);
536  }
537 
538 
540  template<int i, int k> template<class T, class T2, int m>
541  inline void TinyMatrixDoubleLoop<i, k>
545  {
546  x(i+k) += A(i, i+k)*x(i);
548  }
549 
550 
552  template<int i, int k> template<class T, class T2, int m>
553  inline void TinyMatrixDoubleLoop<i, k>
556  TinyVector<T2, m>& x, T2& val)
557  {
558  val += A(i, i+k)*x(i+k);
560  }
561 
562 
563  /******************
564  * TinyMatrixLoop *
565  ******************/
566 
567 
569  template<int p> template<int m, int n, class T, class Prop>
571  {
572  FillZero(A.data_[p-1]);
574  }
575 
576 
578  template<int p> template<int m, int n, class T0, class T1>
579  inline void TinyMatrixLoop<p>::
581  {
584  }
585 
586 
588  template<int k> template<int m, int n, class T0,
589  class Prop, class T1>
590  inline void TinyMatrixLoop<k>::MltScal(const T0& alpha,
592  {
593  A.data_[k-1] *= alpha;
595  }
596 
597 
599  template<int p> template<int m, int n, class T1, class E, class T0, class Prop>
602  {
605 
607  }
608 
609 
611  template<int p> template<int m, int n, class T1, class E, class T0, class Prop>
614  {
617 
619  }
620 
621 
623  template<int p> template<int m, int n, class T1, class E, class T0, class Prop>
626  {
629 
631  }
632 
633 
635  template<int p> template<int m, int n, class T, class Prop>
637  {
640 
642  }
643 
644 
646  template<int p> template<int m, int n, class T, class Prop, class T0>
648  {
651  else
653 
654  return TinyMatrixLoop<p-1>::SetDiagonal(A, alpha);
655  }
656 
657 
659  template<int p> template<int m, int n, class T, class Prop>
661  {
662  SetComplexReal(p-1, A.data_[p-1]);
664  }
665 
666 
668  template<int p> template<int m, int n, class T, class Prop>
670  {
671  SetComplexReal(rand(), A.data_[p-1]);
673  }
674 
675 
677  template<int p> template<int m, int n, class T, class Prop, class T0>
678  inline void TinyMatrixLoop<p>::Fill(TinyMatrix<T, Prop, m, n>& A, const T0& alpha)
679  {
680  SetComplexReal(alpha, A.data_[p-1]);
681  TinyMatrixLoop<p-1>::Fill(A, alpha);
682  }
683 
684 
686  template<int p> template<int m, int n, class Prop, class T>
688  {
689  if (!IsComplexZero(A.data_[p-1]))
690  return false;
691 
692  return TinyMatrixLoop<p-1>::IsZero(A);
693  }
694 
695 
697  template<int p> template<int m, int n, class T, class E>
698  inline void TinyMatrixLoop<p>::
700  {
702  out << '\n';
704  }
705 
706 
708  template<int p> template<int m, int n, class T, class Prop>
709  inline void TinyMatrixLoop<p>::Write(ostream& out, const TinyMatrix<T, Prop, m, n>& A)
710  {
713  }
714 
715 
717  template<int p> template<int m, int n, class T, class E1, class E2>
718  inline bool TinyMatrixLoop<p>
721  {
723  return false;
724 
725  return TinyMatrixLoop<p-1>::IsEqual(A, B);
726  }
727 
728 
730  template<int i> template<int m, int n, class T0, class E0,
731  class T1, class E1, class T2>
732  inline void TinyMatrixLoop<i>::
735  {
736  y(i-1) = A(i-1, 0)*x(0);
737  TinyMatrixDoubleLoop<i, n-1>::Mlt(A, x, y(i-1));
738  TinyMatrixLoop<i-1>::Mlt(A, x, y);
739  }
740 
741 
743  template<int i> template<int m, int n, class T0, class E0,
744  class T1, class E1, class T2>
745  inline void TinyMatrixLoop<i>::
748  {
749  y(i-1) += A(i-1, 0)*x(0);
750  TinyMatrixDoubleLoop<i, n-1>::Mlt(A, x, y(i-1));
752  }
753 
754 
756  template<int i> template<int m, int n, class T0, class E0,
757  class T1, class E1, class T2, class T3>
758  inline void TinyMatrixLoop<i>::
759  MltAdd(const T3& alpha, const TinyMatrixExpression<T0, m, n, E0>& A,
761  {
762  T2 val = A(i-1, 0)*x(0);
764  y(i-1) += alpha*val;
765  TinyMatrixLoop<i-1>::MltAdd(alpha, A, x, y);
766  }
767 
768 
770  template<int p> template<int m, int n, int k, class T0, class E0,
771  class T1, class E1, class T2, class Prop2>
772  inline void TinyMatrixLoop<p>::
776  {
779 
781  TinyMatrixLoop<p-1>::Mlt(A, B, C);
782  }
783 
784 
786  template<int p> template<int m, int n, class T0, class T1, class E1,
787  class T2, class E2, class T3>
788  inline void TinyMatrixLoop<p>::
791  {
793  TinyMatrixLoop<p-1>::Rank1Update(alpha, x, y, A);
794  }
795 
796 
798  template<int p> template<int m, int n, class T1, class E1,
799  class T2, class E2, class T3>
800  inline void TinyMatrixLoop<p>::
803  {
806  }
807 
808 
810  template<int p> template<int m, class T0, class T1, class E1, class T3>
811  inline void TinyMatrixLoop<p>::
814  {
817  }
818 
819 
821  template<int p> template<int m, class T1, class E1, class T3>
822  inline void TinyMatrixLoop<p>::
825  {
828  }
829 
830 
832  template<int p> template<int m, int n, class T1, class E1>
833  inline void TinyMatrixLoop<p>::
835  {
836  x(p-1) = A(p-1, k);
838  }
839 
840 
842  template<int p> template<int m, int n, class T0, class E0, class T1>
843  inline void TinyMatrixLoop<p>::
845  {
846  x(p-1) = A(k, p-1);
848  }
849 
850 
852  template<int p> template<int m, int n, class T1, class E1, class Prop>
853  inline void TinyMatrixLoop<p>::
855  {
856  A(p-1, k) = x(p-1);
858  }
859 
860 
862  template<int p> template<int m, int n, class T1, class E1, class Prop>
863  inline void TinyMatrixLoop<p>::
865  {
866  A(k,p-1) = x(p-1);
868  }
869 
870 
872  template<int p> template<int m, int n, class T, class Prop, class T0>
874  {
875  amax = max(amax, abs(A.data_[p-1]));
877  }
878 
879 
881  template<int i1> template<class T, int m>
882  inline void TinyMatrixLoop<i1>::
884  {
885  // finding the maximum coefficient in the column i
886  // i = m -1 - i1
887  int jmax = m -1 - i1; T val = A(m -1 - i1, m -1 - i1), coef;
889  pivot(m -1 - i1) = jmax;
890 
891  // now swapping rows i and jmax
892  if (m -1 - i1 != jmax)
894 
895  // loop over each row i+1 -> m, to make elimination (we solve by L as well)
896  T one; SetComplexOne(one);
897  coef = one/A(m -1 - i1, m -1 - i1);
899 
900  // multiplying row i with coef, and storing coef in a_ii
902  A(m -1 - i1, m -1 - i1) = coef;
903 
905  }
906 
907 
909  template<int i1> template<class T, int m>
911  {
912  // i = m -1 - i1
913  T val;
916  }
917 
918 
920  template<int i> template<class T, int m>
921  inline void TinyMatrixLoop<i>::
923  {
924  T val;
925  if (pivot(i-1) != i-1)
926  TinyMatrixDoubleLoop<i-1, m>::SwapColumn(A, pivot(i-1), val);
927 
929  }
930 
931 
933  template<int j> template<class T, int m>
935  {
936  T val = A(m-j, m-j);
938 
939  val = sqrt(val);
940  A(m-j, m-j) = val;
941  T one; SetComplexOne(one);
942  T invVal = one / val, vloc;
943 
945 
947  }
948 
949 
951  template<int i> template<class T, class T2, int m>
955  {
956  x(m-i) /= A(m-i, m-i);
959  }
960 
961 
963  template<int i> template<class T, class T2, int m>
967  {
968  T2 val = x(i-1);
970 
971  x(i-1) = val / A(i-1, i-1);
973  }
974 
975 
977  template<int i> template<class T, class T2, int m>
981  {
983 
984  x(i-1) *= A(i-1, i-1);
986  }
987 
988 
990  template<int i> template<class T, class T2, int m>
994  {
995  T val = x(m-i)*A(m-i, m-i);
997  x(m-i) = val;
999  }
1000 
1001 
1002  /*************************
1003  * TinyMatrix<Symmetric> *
1004  *************************/
1005 
1006 
1008  template<class T, int m>
1010  {
1011  this->Zero();
1012  }
1013 
1014 
1016  template<class T, int m>
1018  {
1019  this->Zero();
1020  }
1021 
1022 
1024  template<class T, int m>
1026  {
1027  this->Zero();
1028  }
1029 
1030 
1032  template<class T, int m> template<class E>
1035  {
1036  TinyMatrixLoop<m*(m+1)/2>::Copy(A, *this);
1037  }
1038 
1039 
1041  template<class T, int m>
1043  {
1044  return m;
1045  }
1046 
1047 
1049  template<class T, int m>
1051  {
1052  return m;
1053  }
1054 
1055 
1057  template<class T, int m>
1059  {
1060  return m*(m+1)/2;
1061  }
1062 
1063 
1065  template<class T, int m>
1067  {
1068  return data_;
1069  }
1070 
1071 
1073  template<class T, int m> template<class T1>
1075  operator *=(const T1& a )
1076  {
1077  TinyMatrixLoop<m*(m+1)/2>::MltScal(a, *this);
1078 
1079  return *this;
1080  }
1081 
1082 
1084  template<class T, int m> template<class T1, class E>
1087  {
1088  TinyMatrixLoop<m*(m+1)/2>::AddCopy(B, *this);
1089  return *this;
1090  }
1091 
1092 
1094  template<class T, int m> template<class T1, class E>
1097  {
1098  TinyMatrixLoop<m*(m+1)/2>::DiffCopy(B, *this);
1099  return *this;
1100  }
1101 
1102 
1104  template<class T, int m>
1107  {
1108  this->Fill(x);
1109  return *this;
1110  }
1111 
1112 
1114  template<class T, int m> template<class T0, class E>
1117  {
1118  TinyMatrixLoop<m*(m+1)/2>::Copy(x, *this);
1119  return *this;
1120  }
1121 
1122 
1124  template<class T, int m>
1126  {
1127 
1128 #ifdef SELDON_CHECK_BOUNDS
1129  CheckBounds(i, j, m, m, "TinyMatrix");
1130 #endif
1131 
1132  return this->data_[j > i ? i*m - (i*(i+1))/2 + j: j*m - (j*(j+1))/2 + i];
1133  }
1134 
1135 
1137  template<class T, int m>
1138  inline const T& TinyMatrix<T, Symmetric, m, m>::operator()(int i, int j) const
1139  {
1140 
1141 #ifdef SELDON_CHECK_BOUNDS
1142  CheckBounds(i, j, m, m, "TinyMatrix");
1143 #endif
1144 
1145  return this->data_[j > i ? i*m - (i*(i+1))/2 + j: j*m - (j*(j+1))/2 + i ];
1146  }
1147 
1148 
1150  template<class T, int m>
1152  {
1153  TinyMatrixLoop<m*(m+1)/2>::Zero(*this);
1154  }
1155 
1156 
1158  template<class T, int m>
1160  {
1161  return TinyMatrixLoop<m*(m+1)/2>::SetIdentity(*this);
1162  }
1163 
1164 
1166  template<class T, int m> template<class T0>
1167  inline void TinyMatrix<T, Symmetric, m, m>::SetDiagonal(const T0& alpha)
1168  {
1169  return TinyMatrixLoop<m*(m+1)/2>::SetDiagonal(*this, alpha);
1170  }
1171 
1172 
1174  template<class T, int m>
1176  {
1177  return TinyMatrixLoop<m*(m+1)/2>::Fill(*this);
1178  }
1179 
1180 
1182  template<class T, int m>
1184  {
1185  return TinyMatrixLoop<m*(m+1)/2>::FillRand(*this);
1186  }
1187 
1188 
1190  template<class T, int m> template<class T0>
1191  inline void TinyMatrix<T, Symmetric, m, m>::Fill(const T0& a)
1192  {
1193  return TinyMatrixLoop<m*(m+1)/2>::Fill(*this, a);
1194  }
1195 
1196 
1198  template<class T, int m>
1200  {
1201  return TinyMatrixLoop<m*(m+1)/2>::IsZero(*this);
1202  }
1203 
1204 
1206  template<class T, int m>
1207  inline void TinyMatrix<T, Symmetric, m, m>::WriteText(const string& file_name) const
1208  {
1209  ofstream out(file_name.data());
1210  out.precision(cout.precision());
1211  out << *this;
1212  out.close();
1213  }
1214 
1215 
1217  template<class T, int m>
1218  inline void TinyMatrix<T, Symmetric, m, m>::Write(const string& file_name) const
1219  {
1220  ofstream out(file_name.data());
1221  Write(out);
1222  out.close();
1223  }
1224 
1225 
1227  template<class T, int m>
1228  inline void TinyMatrix<T, Symmetric, m, m>::Write(ostream& out) const
1229  {
1230  int itmp = m;
1231  out.write(reinterpret_cast<char*>(&itmp), sizeof(int));
1232  out.write(reinterpret_cast<char*>(&itmp), sizeof(int));
1233 
1234  return TinyMatrixLoop<m>::Write(out, *this);
1235  }
1236 
1237 
1238  /*************
1239  * Operators *
1240  *************/
1241 
1242 
1244  template<class T, int m, int n, class E1, class E2>
1247  {
1248  return TinyMatrixLoop<m>::IsEqual(u, v);
1249  }
1250 
1251 
1253  template<class T, int m, int n, class E1, class E2>
1256  {
1257  return !TinyMatrixLoop<m>::IsEqual(u, v);
1258  }
1259 
1260 
1262  template <class T, int m, int n, class E>
1263  inline ostream& operator <<(ostream& out, const TinyMatrixExpression<T, m, n, E> & A)
1264  {
1266  return out;
1267  }
1268 
1269 
1270  /***************************
1271  * Matrix-vector functions *
1272  ***************************/
1273 
1274 
1276  template<class T, int m, int n, class E, class T1, class E1> inline TinyVector<T1, m>
1279  {
1281  TinyMatrixLoop<m>::Mlt(A, x, b);
1282 
1283  return b;
1284  }
1285 
1286 
1288  template<class T, int m, int n, class E, class T1, int k, class E1>
1289  inline TinyMatrix<T, General, m, k>
1292  {
1294  TinyMatrixLoop<m*k>::Mlt(A, B, C);
1295 
1296  return C;
1297  }
1298 
1299 
1301  template<class T0, class E0, class T1, class E1, class T2, int m, int n>
1302  inline void Mlt(const TinyMatrixExpression<T0, m, n, E0>& A,
1304  {
1305  TinyMatrixLoop<m>::Mlt(A, x, y);
1306  }
1307 
1308 
1310  template<class T1, class E1, class T2, class E2, class T3, int m, int n>
1311  inline void MltAdd(const TinyMatrixExpression<T1, m, n, E1>& A,
1313  {
1314  TinyMatrixLoop<m>::MltAdd(A, x, y);
1315  }
1316 
1317 
1319  template<class T0, class T1, class E1, class T2, class E2, class T3, int m, int n>
1320  inline void MltAdd(const T0& alpha, const TinyMatrixExpression<T1, m, n, E1>& A,
1322  {
1323  TinyMatrixLoop<m>::MltAdd(alpha, A, x, y);
1324  }
1325 
1326 
1328  template<class T0, class E0, class T1, class E1, class T2, int m, int n>
1331  {
1333  }
1334 
1335 
1337  template<class T0, class E0, class T1, class E1, class T2, int m, int n>
1338  inline void Mlt(const class_SeldonTrans&,
1341  {
1343  }
1344 
1345 
1347  template<int m, int n, class T0, class T1, class E1, class T2, class E2, class T3>
1348  inline void Rank1Update(const T0& alpha, const TinyVectorExpression<T1, m, E1>& x,
1351  {
1352  TinyMatrixLoop<m>::Rank1Update(alpha, x, y, A);
1353  }
1354 
1355 
1357  template<int m, int n, class T1, class E1, class T2, class E2, class T3>
1361  {
1363  }
1364 
1365 
1367  template<int m, class T0, class T1, class E1, class T3>
1368  inline void Rank1Update(const T0& alpha, const TinyVectorExpression<T1, m, E1>& x,
1370  {
1371  TinyMatrixLoop<m>::Rank1Update(alpha, x, A);
1372  }
1373 
1374 
1376  template<int m, class T1, class E1, class T3>
1379  {
1381  }
1382 
1383 
1385  template<int m, int n, class T1, class E1>
1386  inline void GetCol(const TinyMatrixExpression<T1, m, n, E1>& A, int k, TinyVector<T1, m>& x)
1387  {
1388  TinyMatrixLoop<m>::GetCol(A, k, x);
1389  }
1390 
1391 
1393  template<int m, int n, class T0, class E0, class T1>
1394  inline void GetRow(const TinyMatrixExpression<T0, m, n, E0>& A, int k, TinyVector<T1, n>& x)
1395  {
1396  TinyMatrixLoop<n>::GetRow(A, k, x);
1397  }
1398 
1399 
1401  template<int m, int n, class T1, class E1, class Prop>
1402  inline void SetCol(const TinyVectorExpression<T1, m, E1>& x, int k, TinyMatrix<T1, Prop, m, n>& A)
1403  {
1404  TinyMatrixLoop<m>::SetCol(x, k, A);
1405  }
1406 
1407 
1409  template<int m, int n, class T1, class E1, class Prop>
1410  inline void SetRow(const TinyVectorExpression<T1, n, E1>& x, int k, TinyMatrix<T1, Prop, m, n>& A)
1411  {
1412  TinyMatrixLoop<n>::SetRow(x, k, A);
1413  }
1414 
1415 
1416  /****************************
1417  * Matrix-Matrix operations *
1418  ****************************/
1419 
1420 
1422  template<class T, int m, int n, class E, class Prop>
1424  {
1425  B = A;
1426  }
1427 
1428 
1430  template<class T0, class E0, class T1, class E1,
1431  class T2, class Prop2, int m, int n>
1432  inline void Add(const TinyMatrixExpression<T0, m, n, E0>& A,
1435  {
1436  C = A + B;
1437  }
1438 
1439 
1441  template<class T1, class E1, class T2,
1442  class Prop2, int m, int n>
1443  inline void Add(const T1& alpha, const TinyMatrixExpression<T1, m, n, E1>& A,
1445  {
1446  B += alpha*A;
1447  }
1448 
1449 
1451  template<class T0, class E0, class T1, class Prop1, int m, int n>
1453  {
1454  B += A;
1455  }
1456 
1457 
1459  template<class T0, class T1, class Prop, int m, int n>
1460  inline void Mlt(const T0& alpha, TinyMatrix<T1, Prop, m, n>& A)
1461  {
1462  A *= alpha;
1463  }
1464 
1465 
1467  template<class T0, class E0, class T1, class E1,
1468  class T2, class Prop2, int m, int n, int k>
1469  inline void Mlt(const TinyMatrixExpression<T0, m, n, E0>& A,
1472  {
1474  }
1475 
1476 
1478  template<class T0, class E0, class T1, class E1,
1479  class T2, class Prop2, int m, int n, int k>
1483  {
1485  }
1486 
1487 
1489  template<class T3, class T0, class E0, class T1, class E1,
1490  class T2, class Prop2, class T4, int m, int n, int k>
1491  inline void MltAdd(const T3& alpha, const class_SeldonTrans&,
1494  const T4& beta, TinyMatrix<T2, Prop2, m, k>& C)
1495  {
1497  Mlt(transpose(A), B, D);
1498  C = beta*C + alpha*D;
1499  }
1500 
1501 
1503  template<class T, int m, int n, class E>
1506  {
1507  B = transpose(A);
1508  }
1509 
1510 
1512  template<class T, int m>
1514  {
1516  B = transpose(A);
1517  }
1518 
1519 
1520  template<class T, class Prop, int m, int n> inline
1521  typename ClassComplexType<T>::Treal MaxAbs(const TinyMatrix<T, Prop, m, n>& A)
1522  {
1523  typename ClassComplexType<T>::Treal amax(0);
1524  TinyMatrixLoop<TinyMatrix<T, Prop, m, n>::size_>::GetMaxAbs(A, amax);
1525  return amax;
1526  }
1527 
1528 
1529  /****************
1530  * 1x1 matrices *
1531  ****************/
1532 
1533 
1535  template<class T, class Prop>
1536  inline T Det(const TinyMatrix<T, Prop, 1, 1> & A)
1537  {
1538  return A(0, 0);
1539  }
1540 
1541 
1543  template<class T>
1544  inline void GetInverse(const TinyMatrix<T, General, 1, 1> & A,
1546  {
1547  T one; SetComplexOne(one);
1548  B(0,0) = one/A(0, 0);
1549  }
1550 
1551 
1553  template<class T>
1554  inline void GetInverse(const TinyMatrix<T, Symmetric, 1, 1> & A,
1556  {
1557  T one; SetComplexOne(one);
1558  B(0,0) = one/A(0, 0);
1559  }
1560 
1561 
1563  template<class T>
1564  inline void GetInverse(TinyMatrix<T, General, 1, 1> & B)
1565  {
1566  T one; SetComplexOne(one);
1567  B(0,0) = one/B(0, 0);
1568  }
1569 
1570 
1572  template<class T>
1573  inline void GetInverse(TinyMatrix<T, Symmetric, 1, 1> & B)
1574  {
1575  T one; SetComplexOne(one);
1576  B(0,0) = one/B(0, 0);
1577  }
1578 
1579 
1582  template<class T0, class T1>
1583  inline void GetNormalProjector(const TinyVector<T0, 1>& n, TinyMatrix<T1, Symmetric, 1, 1>& P)
1584  {
1585  P(0,0) = n(0)*n(0);
1586  }
1587 
1588 
1591  template<class T0, class T1>
1592  inline void GetNormalProjector(const T0& n, TinyMatrix<T1, Symmetric, 1, 1>& P)
1593  {
1594  P(0,0) = n*n;
1595  }
1596 
1597 
1598  /****************
1599  * 2x2 matrices *
1600  ****************/
1601 
1602 
1604  template<class T, class Prop>
1605  inline T Det(const TinyMatrix<T, Prop, 2, 2> & A)
1606  {
1607  return A(0,0)*A(1,1) - A(0,1)*A(1,0);
1608  }
1609 
1610 
1613  template<class T0, class T1>
1614  inline void GetTangentialProjector(const TinyVector<T0, 2>& n,
1616  {
1617  P(0, 0) = n(1)*n(1);
1618  P(0, 1) = -n(0)*n(1);
1619  P(1, 1) = n(0)*n(0);
1620  }
1621 
1622 
1625  template<class T0, class T1>
1626  inline void GetNormalProjector(const TinyVector<T0, 2>& n, TinyMatrix<T1, Symmetric, 2, 2>& P)
1627  {
1628  P(0, 0) = n(0)*n(0);
1629  P(0, 1) = n(0)*n(1);
1630  P(1, 1) = n(1)*n(1);
1631  }
1632 
1633 
1636  template<class T0, class T1>
1637  inline void GetNormalProjector(const TinyVector<T0, 2>& n, TinyMatrix<T1, General, 2, 2>& P)
1638  {
1639  P(0, 0) = n(0)*n(0);
1640  P(0, 1) = n(0)*n(1);
1641  P(1, 1) = n(1)*n(1);
1642  P(1, 0) = P(0, 1);
1643  }
1644 
1645 
1646  /**************************
1647  * Functions for any size *
1648  **************************/
1649 
1650 
1652  template<class T0, class T1, int m>
1653  inline void GetTangentialProjector(const TinyVector<T0, m>& n,
1655  {
1656  T0 one; SetComplexOne(one);
1657  P.SetIdentity();
1658  Rank1Update(-one, n, P);
1659  }
1660 
1661 
1663  template<class T0, class T1, int m>
1664  inline void GetNormalProjector(const TinyVector<T0, m>& n,
1666  {
1667  Rank1Matrix(n, P);
1668  }
1669 
1670 
1671  template<class T, class Prop, int m, int n>
1672  inline void FillZero(TinyMatrix<T, Prop, m, n>& X)
1673  {
1674  X.Zero();
1675  }
1676 
1677 
1679  template<class T, int m, int n>
1682  {
1683  TinyVector<T, m> vectA, vectB;
1684  for (int p = 0; p < n ; p ++)
1685  {
1686  GetCol(A, p, vectA);
1687  GetCol(B, p, vectB);
1688  res(p) += DotProd(vectA, vectB);
1689  }
1690  }
1691 
1692 } // end namespace
1693 
1694 #define MONTJOIE_FILE_TINY_MATRIX_INLINE_CXX
1695 #endif
Seldon::TinyMatrixTripleLoop::AddRow
static void AddRow(TinyMatrix< T, General, m, m > &A, const T &val)
A(j, :) += val*A(i, :)
Definition: TinyMatrixInline.cxx:265
Seldon::TinyMatrix< T, General, m, n >
Class storing small matrices whose number of rows and columns is known at compilation time.
Definition: TinyMatrix.hxx:37
Seldon::TinyMatrixLoop::IsZero
static bool IsZero(const TinyMatrix< T, Prop, m, n > &A)
returns true if the matrix is null
Definition: TinyMatrixInline.cxx:687
Seldon::TinyMatrixDoubleLoop::SwapColumn
static void SwapColumn(TinyMatrix< T, General, m, m > &A, int i2, T &val)
swapping columns i and i2 (for pivoting)
Definition: TinyMatrixInline.cxx:438
Seldon::TinyMatrixLoop::DiffCopy
static void DiffCopy(const TinyMatrixExpression< T1, m, n, E > &x, TinyMatrix< T0, Prop, m, n > &y)
y -= x
Definition: TinyMatrixInline.cxx:624
Seldon::TinyMatrixDoubleLoop::Mlt
static void Mlt(const TinyMatrixExpression< T0, m, n, E0 > &A, const TinyVectorExpression< T1, n, E1 > &x, T2 &y)
y = A*x
Definition: TinyMatrixInline.cxx:334
Seldon::operator==
bool operator==(const TinyMatrixExpression< T, m, n, E1 > &u, const TinyMatrixExpression< T, m, n, E2 > &v)
returns true if *this == u
Definition: TinyMatrixInline.cxx:1245
Seldon::TinyMatrixLoop::MltAdd
static void MltAdd(const TinyMatrixExpression< T0, m, n, E0 > &A, const TinyVectorExpression< T1, n, E1 > &x, TinyVector< T2, m > &y)
y = y + A*x
Definition: TinyMatrixInline.cxx:746
Seldon::Rank1Matrix
void Rank1Matrix(const TinyVectorExpression< T1, m, E1 > &x, const TinyVectorExpression< T2, n, E2 > &y, TinyMatrix< T3, General, m, n > &A)
A = x y^T.
Definition: TinyMatrixInline.cxx:1358
Seldon::TinyMatrixNode
Definition: TinyMatrix.hxx:16
Seldon::TinyMatrix
empty class overloaded for general and symmetric matrices
Definition: TinyMatrix.hxx:11
Seldon::TinyMatrixDoubleLoop::Write
static void Write(ostream &out, const TinyMatrix< T, Prop, m, n > &A)
writes matrix A in binary format
Definition: TinyMatrixInline.cxx:310
Seldon::TinyMatrixDoubleLoop::GetDiagonalCholesky
static void GetDiagonalCholesky(TinyMatrix< T, Symmetric, m, m > &A, T &val)
Loop val -= A(k, j)*A(k, j) with k between 0 and j-1.
Definition: TinyMatrixInline.cxx:495
Seldon::TinyVectorExpression
Expression between vectors.
Definition: TinyVectorExpression.hxx:8
Seldon::TinyMatrixLoop::FillRand
static void FillRand(TinyMatrix< T, Prop, m, n > &A)
sets randomly all the elements of A
Definition: TinyMatrixInline.cxx:669
Seldon::TinyMatrixDoubleLoop::SwapRow
static void SwapRow(TinyMatrix< T, General, m, m > &A, int i2, T &val)
swapping rows i and i2 (for pivoting)
Definition: TinyMatrixInline.cxx:426
Seldon::TinyMatrixDoubleLoop::SolveCholesky
static void SolveCholesky(const class_SeldonNoTrans &trans, const TinyMatrix< T, Symmetric, m, m > &A, TinyVector< T2, m > &x)
double loop for Cholesky resolution and NoTranspose
Definition: TinyMatrixInline.cxx:518
Seldon::TinyMatrixDoubleLoop::GetMaximumColumn
static void GetMaximumColumn(TinyMatrix< T, General, m, m > &A, int &jmax, T &val)
returns index jmax for which |A(i, j)| is maximal
Definition: TinyMatrixInline.cxx:410
Seldon::TinyMatrixLoop::Write
static void Write(ostream &out, const TinyMatrix< T, Prop, m, n > &A)
writes matrix A in binary format
Definition: TinyMatrixInline.cxx:709
Seldon::TinyMatrixLoop::SetIdentity
static void SetIdentity(TinyMatrix< T, Prop, m, n > &A)
sets matrix to the identity matrix
Definition: TinyMatrixInline.cxx:636
Seldon::TinyMatrixDoubleLoop::WriteText
static void WriteText(ostream &out, const TinyMatrixExpression< T, m, n, E > &A)
writes matrix A in ascii format
Definition: TinyMatrixInline.cxx:300
Seldon::class_SeldonNoTrans
Definition: MatrixFlag.hxx:62
Seldon::TinyMatrixLoop::Copy
static void Copy(const TinyMatrixExpression< T1, m, n, E > &x, TinyMatrix< T0, Prop, m, n > &y)
y = x
Definition: TinyMatrixInline.cxx:600
Seldon::TinyMatrixLoop::GetMaxAbs
static void GetMaxAbs(const TinyMatrix< T, Prop, m, n > &A, T0 &amax)
computes the maximal element of matrix A
Definition: TinyMatrixInline.cxx:873
Seldon::TinyMatrixLoop::SetCol
static void SetCol(const TinyVectorExpression< T1, m, E1 > &x, int k, TinyMatrix< T1, Prop, m, n > &A)
A(:, k) = x.
Definition: TinyMatrixInline.cxx:854
Seldon::TinyMatrixLoop::Init
static void Init(const TinyVector< TinyVector< T0, m >, n > &x, TinyMatrix< T1, General, m, n > &A)
Conversion from vector of vectors to matrix.
Definition: TinyMatrixInline.cxx:580
Seldon::TinyMatrixLoop::Fill
static void Fill(TinyMatrix< T, Prop, m, n > &A)
sets matrix to [0, 1, 2; 3, 4, 5 ...]
Definition: TinyMatrixInline.cxx:660
Seldon::TinyVector
vector with real/complex components
Definition: TinyVector.hxx:17
Seldon::TinyMatrixLoop
class for simple loops for matrix operations
Definition: TinyMatrix.hxx:22
Seldon::TinyMatrixDoubleLoop::ModifyUpperCholesky
static void ModifyUpperCholesky(TinyMatrix< T, Symmetric, m, m > &A, T &invVal, T &vloc)
Loop with k between j+1 and n-1.
Definition: TinyMatrixInline.cxx:505
Seldon::TinyMatrixLoop::GetRow
static void GetRow(const TinyMatrixExpression< T0, m, n, E0 > &A, int k, TinyVector< T1, n > &x)
x = A(k, :)
Definition: TinyMatrixInline.cxx:844
Seldon::TinyMatrixDoubleLoop::PerformSolve
static void PerformSolve(TinyMatrix< T, General, m, m > &A, T &val)
solving by upper matrix
Definition: TinyMatrixInline.cxx:478
Seldon::TinyMatrixLoop::SolveCholesky
static void SolveCholesky(const class_SeldonNoTrans &trans, const TinyMatrix< T, Symmetric, m, m > &A, TinyVector< T2, m > &x)
simple loop for Cholesky resolution and NoTranspose
Definition: TinyMatrixInline.cxx:952
Seldon::TinyMatrixDoubleLoop::Init
static void Init(const TinyVector< T0, m > &x, TinyMatrix< T1, General, m, n > &A)
Conversion from vector of vectors to matrix.
Definition: TinyMatrixInline.cxx:290
Seldon::class_SeldonTrans
Definition: MatrixFlag.hxx:55
Seldon::TinyMatrixDoubleLoop::Rank1Update
static void Rank1Update(const T0 &alpha, const TinyVectorExpression< T1, m, E1 > &x, const TinyVectorExpression< T2, n, E2 > &y, TinyMatrix< T3, General, m, n > &A)
A = A + alpha * x y^T.
Definition: TinyMatrixInline.cxx:364
Seldon::transpose
const TinyMatrixTranspose< T, m, n, E > transpose(const TinyMatrixExpression< T, n, m, E > &u)
returns transpose(u)
Definition: TinyMatrixExpressionInline.cxx:559
Seldon::TinyMatrixDoubleLoop::MltRow
static void MltRow(TinyMatrix< T, General, m, m > &A, const T &coef)
A(i, :) = A(i, :)*coef.
Definition: TinyMatrixInline.cxx:450
Seldon::TinyMatrixLoop::PivotGauss
static void PivotGauss(TinyMatrix< T, General, m, m > &A, TinyVector< int, m > &pivot)
step i1 of Gauss elimination
Definition: TinyMatrixInline.cxx:883
Seldon::TinyMatrixLoop::SetRow
static void SetRow(const TinyVectorExpression< T1, n, E1 > &x, int k, TinyMatrix< T1, Prop, m, n > &A)
A(k, :) = x.
Definition: TinyMatrixInline.cxx:864
Seldon::TinyMatrixLoop::PermuteColumn
static void PermuteColumn(TinyMatrix< T, General, m, m > &A, const TinyVector< int, m > &pivot)
swapping columns for Gauss pivoting
Definition: TinyMatrixInline.cxx:922
Seldon::TinyMatrix< T, Symmetric, m, m >
class storing tiny small matrices
Definition: TinyMatrix.hxx:672
Seldon::TinyMatrixLoop::AddCopy
static void AddCopy(const TinyMatrixExpression< T1, m, n, E > &x, TinyMatrix< T0, Prop, m, n > &y)
y += x
Definition: TinyMatrixInline.cxx:612
Seldon::TinyMatrixLoop::WriteText
static void WriteText(ostream &out, const TinyMatrixExpression< T, m, n, E > &A)
writes matrix A in ascii format
Definition: TinyMatrixInline.cxx:699
Seldon::TinyMatrixLoop::GetCol
static void GetCol(const TinyMatrixExpression< T1, m, n, E1 > &A, int k, TinyVector< T1, m > &x)
x = A(:, k)
Definition: TinyMatrixInline.cxx:834
Seldon::TinyMatrixDoubleLoop
class for double loop in matrix functions
Definition: TinyMatrix.hxx:25
Seldon::MltTrans
void MltTrans(const TinyMatrixExpression< T0, m, n, E0 > &A, const TinyVectorExpression< T1, m, E1 > &x, TinyVector< T2, n > &y)
y = A^t * x
Definition: TinyMatrixInline.cxx:1329
Seldon::TinyMatrixExpression
Expression between vectors.
Definition: TinyMatrixExpression.hxx:8
Seldon::TinyMatrixLoop::GetCholesky
static void GetCholesky(TinyMatrix< T, Symmetric, m, m > &A)
main loop for Cholesky factorisation
Definition: TinyMatrixInline.cxx:934
Seldon::TinyMatrixLoop::Rank1Update
static void Rank1Update(const T0 &alpha, const TinyVectorExpression< T1, m, E1 > &x, const TinyVectorExpression< T2, n, E2 > &y, TinyMatrix< T3, General, m, n > &A)
A = A + alpha * x y^T.
Definition: TinyMatrixInline.cxx:789
Seldon::Transpose
void Transpose(Matrix< T, Prop, Storage, Allocator > &A)
Matrix transposition.
Definition: Functions_Matrix.cxx:2699
Seldon::operator!=
bool operator!=(const TinyMatrixExpression< T, m, n, E1 > &u, const TinyMatrixExpression< T, m, n, E2 > &v)
returns true if *this != u
Definition: TinyMatrixInline.cxx:1254
Seldon::TinyMatrixDoubleLoop::MltCholesky
static void MltCholesky(const class_SeldonTrans &trans, const TinyMatrix< T, Symmetric, m, m > &A, TinyVector< T2, m > &x, T2 &val)
double loop for Cholesky multiplication and Transpose
Definition: TinyMatrixInline.cxx:554
Seldon::TinyMatrixLoop::MltScal
static void MltScal(const T0 &alpha, TinyMatrix< T1, Prop, m, n > &A)
A = alpha*A.
Definition: TinyMatrixInline.cxx:590
Seldon::TinyMatrixLoop::MltCholesky
static void MltCholesky(const class_SeldonTrans &trans, const TinyMatrix< T, Symmetric, m, m > &A, TinyVector< T2, m > &x)
simple loop for Cholesky multiplication and Transpose
Definition: TinyMatrixInline.cxx:991
Seldon::TinyMatrixLoop::Mlt
static void Mlt(const TinyMatrixExpression< T0, m, n, E0 > &A, const TinyVectorExpression< T1, n, E1 > &x, TinyVector< T2, m > &y)
y = A*x
Definition: TinyMatrixInline.cxx:733
Seldon::MaxAbs
ClassComplexType< T >::Treal MaxAbs(const Matrix< T, Prop, Storage, Allocator > &A)
Returns the maximum (in absolute value) of a matrix.
Definition: Functions_Matrix.cxx:2386
Seldon::WrongDim
Definition: Errors.hxx:102
Seldon::TinyMatrixLoop::SetDiagonal
static void SetDiagonal(TinyMatrix< T, Prop, m, n > &A, const T0 &diag)
sets matrix to the identity matrix multiplied by a coefficient alpha
Definition: TinyMatrixInline.cxx:647
Seldon::TinyMatrixDoubleLoop::Rank1Matrix
static void Rank1Matrix(const TinyVectorExpression< T1, m, E1 > &x, const TinyVectorExpression< T2, n, E2 > &y, TinyMatrix< T3, General, m, n > &A)
A = x y^T.
Definition: TinyMatrixInline.cxx:376
Seldon::TinyMatrixLoop::IsEqual
static bool IsEqual(const TinyMatrixExpression< T, m, n, E1 > &A, const TinyMatrixExpression< T, m, n, E2 > &B)
returns true if A == B
Definition: TinyMatrixInline.cxx:719
Seldon
Seldon namespace.
Definition: Array.cxx:24
Seldon::dot
TinyVector< T1, m > dot(const TinyMatrixExpression< T, m, n, E > &A, const TinyVectorExpression< T1, n, E1 > &x)
returns A*x
Definition: TinyMatrixInline.cxx:1277
Seldon::operator<<
ostream & operator<<(ostream &out, const Array< T, N, Allocator > &A)
operator<< overloaded for a 3D array.
Definition: Array.cxx:1617
Seldon::DotProdCol
void DotProdCol(const TinyMatrix< T, General, m, n > &A, const TinyMatrix< T, General, m, n > &B, TinyVector< T, n > &res)
res = A . B, where the scalar product is performed between columns of A and B
Definition: TinyMatrixInline.cxx:1680
Seldon::TinyMatrixTripleLoop
class for triple loop in matrix functions
Definition: TinyMatrix.hxx:28
Seldon::TinyMatrixLoop::Rank1Matrix
static void Rank1Matrix(const TinyVectorExpression< T1, m, E1 > &x, const TinyVectorExpression< T2, n, E2 > &y, TinyMatrix< T3, General, m, n > &A)
A = x y^T.
Definition: TinyMatrixInline.cxx:801
Seldon::TinyMatrixDoubleLoop::PerformElimination
static void PerformElimination(TinyMatrix< T, General, m, m > &A, const T &coef, T &val)
performs Lj = Lj - a_ji/aii Li to eliminate element a_ij
Definition: TinyMatrixInline.cxx:460
Seldon::SetComplexReal
void SetComplexReal(int n, std::complex< T > &number)
Sets a complex number to (n, 0).
Definition: CommonInline.cxx:234
Seldon::TinyMatrixLoop::SolveUpper
static void SolveUpper(TinyMatrix< T, General, m, m > &A)
solving by upper matrix
Definition: TinyMatrixInline.cxx:910