4 #ifndef ROOT_Math_SMatrix_icc
5 #define ROOT_Math_SMatrix_icc
37 #ifndef ROOT_Math_SMatrix
38 #error "Do not use SMatrix.icc directly. #include \"Math/SMatrix.h\" instead."
39 #endif // ROOT_Math_SMatrix
71 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
72 SMatrix<T,D1,D2,R>::SMatrix() {
74 for(
unsigned int i=0; i<R::kSize; ++i) fRep.Array()[i] = 0;
78 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
79 SMatrix<T,D1,D2,R>::SMatrix( SMatrixIdentity ) {
80 for(
unsigned int i=0; i<R::kSize; ++i)
83 for(
unsigned int i=0; i<D1; ++i)
87 for(
unsigned int i=0; i<D2; ++i)
92 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
93 SMatrix<T,D1,D2,R>::SMatrix(
const SMatrix<T,D1,D2,R>& rhs) {
98 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
100 SMatrix<T,D1,D2,R>::SMatrix(
const SMatrix<T,D1,D2,R2>& rhs) {
105 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
106 template <
class A,
class R2>
107 SMatrix<T,D1,D2,R>::SMatrix(
const Expr<A,T,D1,D2,R2>& rhs) {
115 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
116 template <
class InputIterator>
117 SMatrix<T,D1,D2,R>::SMatrix(InputIterator ibegin, InputIterator iend,
bool triang,
bool lower) {
119 for(
unsigned int i=0; i<R::kSize; ++i) fRep.Array()[i] = 0;
120 AssignItr<T,D1,D2,R>::Evaluate(*
this,ibegin,iend,triang,lower);
123 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
124 template <
class InputIterator>
125 SMatrix<T,D1,D2,R>::SMatrix(InputIterator ibegin,
unsigned int size,
bool triang,
bool lower) {
127 assert( size <= R::kSize);
128 for(
unsigned int i=0; i<R::kSize; ++i) fRep.Array()[i] = 0;
129 AssignItr<T,D1,D2,R>::Evaluate(*
this,ibegin,ibegin+size,triang,lower,
false);
137 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
138 SMatrix<T,D1,D2,R>::SMatrix(
const T& rhs) {
139 STATIC_CHECK( kSize == 1,SMatrix_NOT_of_size_1 );
143 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
144 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator=(
const T& rhs) {
145 STATIC_CHECK( kSize == 1,SMatrix_NOT_of_size_1 );
153 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
155 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator=(
const M& rhs) {
160 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
161 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator=(
const SMatrix<T,D1,D2,R>& rhs) {
166 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
167 template <
class A,
class R2>
168 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator=(
const Expr<A,T,D1,D2,R2>& rhs) {
170 Assign<T,D1,D2,A,R,R2>::Evaluate(*
this, rhs);
176 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
177 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator= ( SMatrixIdentity ) {
178 for(
unsigned int i=0; i<R::kSize; ++i)
181 for(
unsigned int i=0; i<D1; ++i)
185 for(
unsigned int i=0; i<D2; ++i)
196 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
197 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator+=(
const T& rhs) {
199 for(
unsigned int i=0; i<R::kSize; ++i) {
200 fRep.Array()[i] += rhs;
205 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
207 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator+=(
const SMatrix<T,D1,D2,R2>& rhs) {
215 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
216 template <
class A,
class R2>
217 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator+=(
const Expr<A,T,D1,D2,R2>& rhs) {
219 PlusEquals<T,D1,D2,A,R,R2>::Evaluate(*
this, rhs);
227 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
228 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator-=(
const T& rhs) {
230 for(
unsigned int i=0; i<R::kSize; ++i) {
231 fRep.Array()[i] -= rhs;
236 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
238 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator-=(
const SMatrix<T,D1,D2,R2>& rhs) {
246 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
247 template <
class A,
class R2>
248 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator-=(
const Expr<A,T,D1,D2,R2>& rhs) {
250 MinusEquals<T,D1,D2,A,R,R2>::Evaluate(*
this, rhs);
257 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
258 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator*=(
const T& rhs) {
260 for(
unsigned int i=0; i<R::kSize; ++i) {
261 fRep.Array()[i] *= rhs;
266 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
268 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator*=(
const SMatrix<T,D1,D2,R2>& rhs) {
271 return operator=(*
this * rhs);
274 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
275 template <
class A,
class R2>
276 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator*=(
const Expr<A,T,D1,D2,R2>& rhs) {
279 return operator=(*
this * rhs);
286 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
287 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::operator/=(
const T& rhs) {
289 for(
unsigned int i=0; i<R::kSize; ++i) {
290 fRep.Array()[i] /= rhs;
298 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
299 bool SMatrix<T,D1,D2,R>::operator==(
const T& rhs)
const {
301 for(
unsigned int i=0; i<R::kSize; ++i) {
302 rc = rc && (fRep.Array()[i] == rhs);
307 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
309 bool SMatrix<T,D1,D2,R>::operator==(
const SMatrix<T,D1,D2,R2>& rhs)
const {
310 return fRep == rhs.fRep;
313 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
314 template <
class A,
class R2>
315 bool SMatrix<T,D1,D2,R>::operator==(
const Expr<A,T,D1,D2,R2>& rhs)
const {
317 for(
unsigned int i=0; i<D1*D2; ++i) {
318 rc = rc && (fRep[i] == rhs.apply(i));
326 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
327 inline bool SMatrix<T,D1,D2,R>::operator!=(
const T& rhs)
const {
328 return !operator==(rhs);
331 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
332 inline bool SMatrix<T,D1,D2,R>::operator!=(
const SMatrix<T,D1,D2,R>& rhs)
const {
333 return !operator==(rhs);
336 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
337 template <
class A,
class R2>
338 inline bool SMatrix<T,D1,D2,R>::operator!=(
const Expr<A,T,D1,D2,R2>& rhs)
const {
339 return !operator==(rhs);
346 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
347 bool SMatrix<T,D1,D2,R>::operator>(
const T& rhs)
const {
349 for(
unsigned int i=0; i<D1*D2; ++i) {
350 rc = rc && (fRep[i] > rhs);
355 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
357 bool SMatrix<T,D1,D2,R>::operator>(
const SMatrix<T,D1,D2,R2>& rhs)
const {
359 for(
unsigned int i=0; i<D1*D2; ++i) {
360 rc = rc && (fRep[i] > rhs.fRep[i]);
365 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
366 template <
class A,
class R2>
367 bool SMatrix<T,D1,D2,R>::operator>(
const Expr<A,T,D1,D2,R2>& rhs)
const {
369 for(
unsigned int i=0; i<D1*D2; ++i) {
370 rc = rc && (fRep[i] > rhs.apply(i));
378 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
379 bool SMatrix<T,D1,D2,R>::operator<(
const T& rhs)
const {
381 for(
unsigned int i=0; i<D1*D2; ++i) {
382 rc = rc && (fRep[i] < rhs);
387 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
389 bool SMatrix<T,D1,D2,R>::operator<(
const SMatrix<T,D1,D2,R2>& rhs)
const {
391 for(
unsigned int i=0; i<D1*D2; ++i) {
392 rc = rc && (fRep[i] < rhs.fRep[i]);
397 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
398 template <
class A,
class R2>
399 bool SMatrix<T,D1,D2,R>::operator<(
const Expr<A,T,D1,D2,R2>& rhs)
const {
401 for(
unsigned int i=0; i<D1*D2; ++i) {
402 rc = rc && (fRep[i] < rhs.apply(i));
411 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
412 inline bool SMatrix<T,D1,D2,R>::Invert() {
413 STATIC_CHECK( D1 == D2,SMatrix_not_square);
414 return Inverter<D1,D2>::Dinv((*this).fRep);
418 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
419 inline SMatrix<T,D1,D2,R> SMatrix<T,D1,D2,R>::Inverse(
int & ifail)
const {
420 SMatrix<T,D1,D2,R> tmp(*
this);
421 bool ok = tmp.Invert();
428 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
429 inline bool SMatrix<T,D1,D2,R>::InvertFast() {
430 STATIC_CHECK( D1 == D2,SMatrix_not_square);
431 return FastInverter<D1,D2>::Dinv((*this).fRep);
435 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
436 inline SMatrix<T,D1,D2,R> SMatrix<T,D1,D2,R>::InverseFast(
int & ifail)
const {
437 SMatrix<T,D1,D2,R> tmp(*
this);
438 bool ok = tmp.InvertFast();
445 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
446 inline bool SMatrix<T,D1,D2, R>::InvertChol() {
447 STATIC_CHECK( D1 == D2,SMatrix_not_square);
448 return CholInverter<D1>::Dinv((*this).fRep);
451 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
452 inline SMatrix<T,D1,D2, R> SMatrix<T,D1,D2, R>::InverseChol(
int &ifail)
const {
453 SMatrix<T,D1,D2,R > tmp(*
this);
454 bool ok = tmp.InvertChol();
465 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
466 inline bool SMatrix<T,D1,D2,R>::Det(T& det) {
467 STATIC_CHECK( D1 == D2,SMatrix_not_square);
470 return Determinant<D1,D2>::Dfact(fRep, det);
472 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
473 inline bool SMatrix<T,D1,D2,R>::Det2(T& det)
const {
474 SMatrix<T,D1,D2,R> tmp(*
this);
482 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
483 template <
unsigned int D>
484 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_in_row(
const SVector<T,D>& rhs,
490 for(
unsigned int i=row*D2+col, j=0; j<D; ++i, ++j) {
491 fRep[i] = rhs.apply(j);
499 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
500 template <
class A,
unsigned int D>
501 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_in_row(
const VecExpr<A,T,D>& rhs,
507 for(
unsigned int i=row*D2+col, j=0; j<D; ++i, ++j) {
508 fRep[i] = rhs.apply(j);
516 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
517 template <
unsigned int D>
518 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_in_col(
const SVector<T,D>& rhs,
524 for(
unsigned int i=row*D2+col, j=0; j<D; i+=D2, ++j) {
525 fRep[i] = rhs.apply(j);
533 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
534 template <
class A,
unsigned int D>
535 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_in_col(
const VecExpr<A,T,D>& rhs,
541 for(
unsigned int i=row*D2+col, j=0; j<D; i+=D2, ++j) {
542 fRep[i] = rhs.apply(j);
550 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
551 template <
unsigned int D3,
unsigned int D4,
class R2>
552 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_at(
const SMatrix<T,D3,D4,R2>& rhs,
555 PlaceMatrix<T,D1,D2,D3,D4,R,R2>::Evaluate(*
this,rhs,row,col);
562 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
563 template <
class A,
unsigned int D3,
unsigned int D4,
class R2>
564 SMatrix<T,D1,D2,R>& SMatrix<T,D1,D2,R>::Place_at(
const Expr<A,T,D3,D4,R2>& rhs,
567 PlaceExpr<T,D1,D2,D3,D4,A,R,R2>::Evaluate(*
this,rhs,row,col);
574 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
575 SVector<T,D2> SMatrix<T,D1,D2,R>::Row(
unsigned int therow)
const {
577 const unsigned int offset = therow*D2;
580 for(
unsigned int i=0; i<D2; ++i) {
581 tmp[i] = fRep[offset+i];
589 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
590 SVector<T,D1> SMatrix<T,D1,D2,R>::Col(
unsigned int thecol)
const {
593 for(
unsigned int i=0; i<D1; ++i) {
594 tmp[i] = fRep[thecol+i*D2];
602 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
603 std::ostream& SMatrix<T,D1,D2,R>::Print(std::ostream& os)
const {
604 const std::ios_base::fmtflags prevFmt = os.setf(std::ios::right,std::ios::adjustfield);
608 for (
unsigned int i=0; i < D1; ++i) {
609 for (
unsigned int j=0; j < D2; ++j) {
610 os << std::setw(12) << fRep[i*D2+j];
611 if ((!((j+1)%12)) && (j < D2-1))
612 os << std::endl <<
" ...";
615 os << std::endl <<
" ";
619 if (prevFmt != os.flags() ) os.setf(prevFmt, std::ios::adjustfield);
626 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
627 inline T SMatrix<T,D1,D2,R>::apply(
unsigned int i)
const {
return fRep[i]; }
629 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
630 inline const T* SMatrix<T,D1,D2,R>::Array()
const {
return fRep.Array(); }
632 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
633 inline T* SMatrix<T,D1,D2,R>::Array() {
return fRep.Array(); }
638 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
639 inline const T& SMatrix<T,D1,D2,R>::operator()(
unsigned int i,
unsigned int j)
const {
643 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
644 inline T& SMatrix<T,D1,D2,R>::operator()(
unsigned int i,
unsigned int j) {
652 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
653 inline const T& SMatrix<T,D1,D2,R>::At(
unsigned int i,
unsigned int j)
const {
659 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
660 inline T& SMatrix<T,D1,D2,R>::At(
unsigned int i,
unsigned int j) {
669 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
670 inline T * SMatrix<T,D1,D2,R>::begin() {
674 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
675 inline T * SMatrix<T,D1,D2,R>::end() {
676 return fRep.Array() + R::kSize;
679 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
680 inline const T * SMatrix<T,D1,D2,R>::begin()
const {
684 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
685 inline const T * SMatrix<T,D1,D2,R>::end()
const {
686 return fRep.Array() + R::kSize;
690 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
691 template <
class InputIterator>
692 void SMatrix<T,D1,D2,R>::SetElements(InputIterator ibegin, InputIterator iend,
bool triang,
bool lower) {
694 AssignItr<T,D1,D2,R>::Evaluate(*
this,ibegin,iend,triang,lower);
697 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
698 template <
class InputIterator>
699 void SMatrix<T,D1,D2,R>::SetElements(InputIterator ibegin,
unsigned int size,
bool triang,
bool lower) {
701 assert( size <= R::kSize);
702 AssignItr<T,D1,D2,R>::Evaluate(*
this,ibegin,ibegin+size,triang,lower,
false);
710 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
711 template <
class SubVector>
712 SubVector SMatrix<T,D1,D2,R>::SubRow(
unsigned int therow,
unsigned int col0 )
const {
714 const unsigned int offset = therow*D2 + col0;
716 STATIC_CHECK( SubVector::kSize <= D2,SVector_dimension_too_small);
717 assert(col0 + SubVector::kSize <= D2);
720 for(
unsigned int i=0; i<SubVector::kSize; ++i) {
721 tmp[i] = fRep[offset+i];
726 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
727 template <
class SubVector>
728 SubVector SMatrix<T,D1,D2,R>::SubCol(
unsigned int thecol,
unsigned int row0 )
const {
730 const unsigned int offset = thecol + row0*D1;
732 STATIC_CHECK( SubVector::kSize <= D1,SVector_dimension_too_small);
733 assert(row0 + SubVector::kSize <= D1);
736 for(
unsigned int i=0; i<SubVector::kSize; ++i) {
737 tmp[i] = fRep[offset+i*D1];
743 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
744 template <
class SubMatrix>
745 SubMatrix SMatrix<T,D1,D2,R>::Sub(
unsigned int row0,
unsigned int col0)
const {
748 RetrieveMatrix<T,SubMatrix::kRows, SubMatrix::kCols, D1, D2, typename SubMatrix::rep_type, R>::Evaluate
749 (tmp,*
this,row0,col0);
754 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
755 SVector<T,D1> SMatrix<T,D1,D2,R>::Diagonal( )
const {
758 STATIC_CHECK( D1 == D2,SMatrix_NOT_square );
761 for(
unsigned int i=0; i<D1; ++i) {
762 tmp[i] = fRep[ i*D2 + i];
768 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
769 template <
class Vector>
770 void SMatrix<T,D1,D2,R>::SetDiagonal(
const Vector & v) {
773 STATIC_CHECK( ( ( D1 <= D2) && Vector::kSize == D1 ) ||
774 ( ( D2 < D1 ) && Vector::kSize == D2 ), SVector_size_NOT_correct );
777 for(
unsigned int i=0; i<Vector::kSize; ++i) {
778 fRep[ i*D2 + i] = v[i];
783 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
784 T SMatrix<T,D1,D2,R>::Trace( )
const {
785 unsigned int diagSize = D1;
786 if (D2 < D1) diagSize = D2;
788 for(
unsigned int i=0; i< diagSize; ++i) {
789 trace += fRep[ i*D2 + i] ;
795 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
796 #ifndef UNSUPPORTED_TEMPLATE_EXPRESSION
797 SVector<T, D1 * (D2 +1)/2 > SMatrix<T,D1,D2,R>::UpperBlock( )
const {
799 template <
class SubVector>
800 SubVector SMatrix<T,D1,D2,R>::UpperBlock( )
const {
803 STATIC_CHECK( D1 == D2,SMatrix_NOT_square );
805 #ifndef UNSUPPORTED_TEMPLATE_EXPRESSION
806 SVector<T, D1 * (D2 +1)/2 > tmp;
809 STATIC_CHECK( SubVector::kSize == D1*(D1+1)/2,SVector_Wrong_Size );
814 for(
unsigned int i=0; i<D1; ++i) {
815 for(
unsigned int j=i; j<D2; ++j) {
816 tmp[k] = fRep[ i*D2 + j];
824 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
825 #ifndef UNSUPPORTED_TEMPLATE_EXPRESSION
826 SVector<T, D1 * (D2 +1)/2 > SMatrix<T,D1,D2,R>::LowerBlock( )
const {
828 template <
class SubVector>
829 SubVector SMatrix<T,D1,D2,R>::LowerBlock( )
const {
833 STATIC_CHECK( D1 == D2,SMatrix_NOT_square );
835 #ifndef UNSUPPORTED_TEMPLATE_EXPRESSION
836 SVector<T, D1 * (D2 +1)/2 > tmp;
839 STATIC_CHECK( SubVector::kSize == D1*(D1+1)/2,SVector_Wrong_Size );
844 for(
unsigned int i=0; i<D1; ++i) {
845 for(
unsigned int j=0; j<=i; ++j) {
846 tmp[k] = fRep[ i*D2 + j];
856 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
857 #ifndef UNSUPPORTED_TEMPLATE_EXPRESSION
858 SMatrix<T,D1,D2,R>::SMatrix(
const SVector<T, D1*(D2+1)/2 > & v,
bool lower ) {
860 template <
unsigned int N>
861 SMatrix<T,D1,D2,R>::SMatrix(
const SVector<T, N > & v,
bool lower ) {
865 STATIC_CHECK( D1 == D2,SMatrix_NOT_square );
867 #ifdef UNSUPPORTED_TEMPLATE_EXPRESSION
868 STATIC_CHECK( N == D1*(D1+1)/2,SVector_Wrong_Size );
874 for(
unsigned int i=0; i<D1; ++i) {
875 for(
unsigned int j=0; j<=i; ++j) {
876 fRep[ i*D2 + j] = v[k];
877 if ( i != j) fRep[ j*D2 + i] = v[k];
883 for(
unsigned int i=0; i<D1; ++i) {
884 for(
unsigned int j=i; j<D2; ++j) {
885 fRep[ i*D2 + j] = v[k];
886 if ( i != j) fRep[ j*D2 + i] = v[k];
894 template <
class T,
unsigned int D1,
unsigned int D2,
class R>
895 bool SMatrix<T,D1,D2,R>::IsInUse(
const T * p)
const {
896 return p == fRep.Array();