1 #ifndef SimTK_SIMMATRIX_SMALLMATRIX_SYMMAT_H_
2 #define SimTK_SIMMATRIX_SMALLMATRIX_SYMMAT_H_
87 template <
int M,
class ELT,
int RS>
class SymMat {
175 static int size() {
return (M*(M+1))/2; }
176 static int nrow() {
return M; }
177 static int ncol() {
return M; }
221 typedef typename MulOp::Type
Mul;
226 typedef typename MulOpNonConforming::Type
MulNon;
232 typedef typename DvdOp::Type
Dvd;
237 typedef typename AddOp::Type
Add;
242 typedef typename SubOp::Type
Sub;
279 template <
class EE,
int CSS,
int RSS>
286 template <
class EE,
int CSS,
int RSS>
289 for (
int j=0; j<M; ++j)
290 for (
int i=j+1; i<M; ++i)
302 template <
class EE,
int CSS,
int RSS>
305 for (
int j=0; j<M; ++j)
306 for (
int i=j+1; i<M; ++i)
316 template <
class EE,
int CSS,
int RSS>
319 "The allegedly symmetric source matrix was not symmetric to within "
322 for (
int j=0; j<M; ++j)
323 for (
int i=j+1; i<M; ++i)
379 const E& e1,
const E& e2)
385 const E& e1,
const E& e2,
386 const E& e3,
const E& e4,
const E& e5)
393 const E& e1,
const E& e2,
394 const E& e3,
const E& e4,
const E& e5,
395 const E& e6,
const E& e7,
const E& e8,
const E& e9)
398 l[0]=e1;l[1]=e3;l[2]=e6;
403 const E& e1,
const E& e2,
404 const E& e3,
const E& e4,
const E& e5,
405 const E& e6,
const E& e7,
const E& e8,
const E& e9,
406 const E& e10,
const E& e11,
const E& e12,
const E& e13,
const E& e14)
409 l[0]=e1;l[1]=e3;l[2]=e6;l[3]=e10;
410 l[4]=e4;l[5]=e7;l[6]=e11;
415 const E& e1,
const E& e2,
416 const E& e3,
const E& e4,
const E& e5,
417 const E& e6,
const E& e7,
const E& e8,
const E& e9,
418 const E& e10,
const E& e11,
const E& e12,
const E& e13,
const E& e14,
419 const E& e15,
const E& e16,
const E& e17,
const E& e18,
const E& e19,
const E& e20)
423 l[0] =e1; l[1] =e3; l[2] =e6; l[3]=e10; l[4]=e15;
424 l[5] =e4; l[6] =e7; l[7] =e11; l[8]=e16;
425 l[9] =e8; l[10]=e12;l[11]=e17;
443 template <
class EE>
explicit SymMat(
const EE* p) {
445 for (
int i=0; i<M; ++i) {
446 const int rowStart = (i*(i+1))/2;
448 for (
int j=0; j<i; ++j)
457 for (
int i=0; i<M; ++i) {
458 const int rowStart = (i*(i+1))/2;
460 for (
int j=0; j<i; ++j)
476 template <
class EE,
int RSS>
SymMat&
481 template <
class EE,
int RSS>
SymMat&
487 template <
class EE,
int RSS>
SymMat&
492 template <
class EE,
int RSS>
SymMat&
500 template <
class EE,
int RSS>
SymMat&
510 template <
class E2,
int RS2>
511 typename Result<SymMat<M,E2,RS2> >::Add
513 return typename Result<SymMat<M,E2,RS2> >::Add
517 template <
class E2,
int RS2>
518 typename Result<SymMat<M,E2,RS2> >::Sub
520 return typename Result<SymMat<M,E2,RS2> >::Sub
527 template <
class E2,
int RS2>
528 typename Result<SymMat<M,E2,RS2> >::Mul
530 typename Result<SymMat<M,E2,RS2> >::Mul result;
531 for (
int j=0;j<M;++j)
532 for (
int i=0;i<M;++i)
533 result(i,j) = (*this)[i] * s(j);
538 template <
class E2,
int RS2>
539 typename EltResult<E2>::Mul
546 template <
class E2,
int RS2>
547 typename EltResult<E2>::Dvd
587 TNormalize elementwiseNormalized;
590 return elementwiseNormalized;
609 {
return *
reinterpret_cast<const TPosTrans*
>(
this); }
611 {
return *
reinterpret_cast<TPosTrans*
>(
this); }
619 const EImag* p =
reinterpret_cast<const EImag*
>(
this);
620 return *
reinterpret_cast<const TImag*
>(p+offs);
624 EImag* p =
reinterpret_cast<EImag*
>(
this);
625 return *
reinterpret_cast<TImag*
>(p+offs);
704 {
updDiag() += ee;
return *
this; }
706 {
updDiag() -= ee;
return *
this; }
750 template <
class E2,
int RS2>
758 template <
class E2,
int RS2>
785 for (
int j=0; j<i; ++j)
788 for (
int j=i+1; j<M; ++j)
797 for (
int i=0; i<j; ++i)
800 for (
int i=j+1; i<M; ++i)
810 E
elt(
int i,
int j)
const {
848 for (
int i = 1; i < M; ++i)
849 for (
int j = 0; j < i; ++j) {
852 temp[i] += E(reinterpret_cast<const EHerm&>(value));
864 for (
int i = 1; i < M; ++i)
865 for (
int j = 0; j < i; ++j) {
868 temp[j] += E(reinterpret_cast<const EHerm&>(value));
877 const E& getlowerE(
int i)
const {
return d[(M+i)*RS];}
878 E& updlowerE(
int i) {
return d[(M+i)*RS];}
884 explicit SymMat(
const TAsVec& v) {
890 static int lowerIx(
int i,
int j) {
891 assert(0 <= j && j < i && i < M);
892 return (i-j-1) + j*(M-1) - (j*(j-1))/2;
895 template <
int MM,
class EE,
int RSS>
friend class SymMat;
904 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline
908 ::AddOp::perform(l,r);
912 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline
913 typename SymMat<M,E1,S1>::template Result< SymMat<M,E2,S2> >::Sub
916 ::SubOp::perform(l,r);
921 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline
922 typename SymMat<M,E1,S1>::template Result< SymMat<M,E2,S2> >::Mul
925 ::MulOp::perform(l,r);
929 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
935 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
945 template <
int M,
class E,
int S>
inline
946 typename SymMat<M,E,S>::template Result<float>::Mul
949 template <
int M,
class E,
int S>
inline
950 typename SymMat<M,E,S>::template Result<float>::Mul
953 template <
int M,
class E,
int S>
inline
954 typename SymMat<M,E,S>::template Result<double>::Mul
957 template <
int M,
class E,
int S>
inline
958 typename SymMat<M,E,S>::template Result<double>::Mul
961 template <
int M,
class E,
int S>
inline
962 typename SymMat<M,E,S>::template Result<long double>::Mul
965 template <
int M,
class E,
int S>
inline
966 typename SymMat<M,E,S>::template Result<long double>::Mul
970 template <
int M,
class E,
int S>
inline
971 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Mul
973 template <
int M,
class E,
int S>
inline
974 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Mul
980 template <
int M,
class E,
int S,
class R>
inline
981 typename SymMat<M,E,S>::template Result<std::complex<R> >::Mul
984 template <
int M,
class E,
int S,
class R>
inline
985 typename SymMat<M,E,S>::template Result<std::complex<R> >::Mul
989 template <
int M,
class E,
int S,
class R>
inline
990 typename SymMat<M,E,S>::template Result<std::complex<R> >::Mul
992 template <
int M,
class E,
int S,
class R>
inline
993 typename SymMat<M,E,S>::template Result<std::complex<R> >::Mul
997 template <
int M,
class E,
int S,
class R>
inline
998 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Mul
1000 template <
int M,
class E,
int S,
class R>
inline
1001 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Mul
1010 template <
int M,
class E,
int S>
inline
1011 typename SymMat<M,E,S>::template Result<float>::Dvd
1014 template <
int M,
class E,
int S>
inline
1015 typename CNT<float>::template Result<SymMat<M,E,S> >::Dvd
1019 template <
int M,
class E,
int S>
inline
1020 typename SymMat<M,E,S>::template Result<double>::Dvd
1023 template <
int M,
class E,
int S>
inline
1024 typename CNT<double>::template Result<SymMat<M,E,S> >::Dvd
1028 template <
int M,
class E,
int S>
inline
1029 typename SymMat<M,E,S>::template Result<long double>::Dvd
1032 template <
int M,
class E,
int S>
inline
1033 typename CNT<long double>::template Result<SymMat<M,E,S> >::Dvd
1038 template <
int M,
class E,
int S>
inline
1039 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Dvd
1041 template <
int M,
class E,
int S>
inline
1042 typename CNT<typename CNT<E>::Precision>::template Result<SymMat<M,E,S> >::Dvd
1049 template <
int M,
class E,
int S,
class R>
inline
1050 typename SymMat<M,E,S>::template Result<std::complex<R> >::Dvd
1053 template <
int M,
class E,
int S,
class R>
inline
1054 typename CNT<std::complex<R> >::template Result<SymMat<M,E,S> >::Dvd
1059 template <
int M,
class E,
int S,
class R>
inline
1060 typename SymMat<M,E,S>::template Result<std::complex<R> >::Dvd
1062 template <
int M,
class E,
int S,
class R>
inline
1063 typename CNT<std::complex<R> >::template Result<SymMat<M,E,S> >::Dvd
1067 template <
int M,
class E,
int S,
class R>
inline
1068 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Dvd
1070 template <
int M,
class E,
int S,
class R>
inline
1071 typename CNT<R>::template Result<SymMat<M,E,S> >::Dvd
1082 template <
int M,
class E,
int S>
inline
1083 typename SymMat<M,E,S>::template Result<float>::Add
1086 template <
int M,
class E,
int S>
inline
1087 typename SymMat<M,E,S>::template Result<float>::Add
1090 template <
int M,
class E,
int S>
inline
1091 typename SymMat<M,E,S>::template Result<double>::Add
1094 template <
int M,
class E,
int S>
inline
1095 typename SymMat<M,E,S>::template Result<double>::Add
1098 template <
int M,
class E,
int S>
inline
1099 typename SymMat<M,E,S>::template Result<long double>::Add
1102 template <
int M,
class E,
int S>
inline
1103 typename SymMat<M,E,S>::template Result<long double>::Add
1107 template <
int M,
class E,
int S>
inline
1108 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Add
1110 template <
int M,
class E,
int S>
inline
1111 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Add
1117 template <
int M,
class E,
int S,
class R>
inline
1118 typename SymMat<M,E,S>::template Result<std::complex<R> >::Add
1121 template <
int M,
class E,
int S,
class R>
inline
1122 typename SymMat<M,E,S>::template Result<std::complex<R> >::Add
1126 template <
int M,
class E,
int S,
class R>
inline
1127 typename SymMat<M,E,S>::template Result<std::complex<R> >::Add
1129 template <
int M,
class E,
int S,
class R>
inline
1130 typename SymMat<M,E,S>::template Result<std::complex<R> >::Add
1134 template <
int M,
class E,
int S,
class R>
inline
1135 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Add
1137 template <
int M,
class E,
int S,
class R>
inline
1138 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Add
1144 template <
int M,
class E,
int S>
inline
1145 typename SymMat<M,E,S>::template Result<float>::Sub
1148 template <
int M,
class E,
int S>
inline
1149 typename CNT<float>::template Result<SymMat<M,E,S> >::Sub
1153 template <
int M,
class E,
int S>
inline
1154 typename SymMat<M,E,S>::template Result<double>::Sub
1157 template <
int M,
class E,
int S>
inline
1158 typename CNT<double>::template Result<SymMat<M,E,S> >::Sub
1162 template <
int M,
class E,
int S>
inline
1163 typename SymMat<M,E,S>::template Result<long double>::Sub
1166 template <
int M,
class E,
int S>
inline
1167 typename CNT<long double>::template Result<SymMat<M,E,S> >::Sub
1172 template <
int M,
class E,
int S>
inline
1173 typename SymMat<M,E,S>::template Result<typename CNT<E>::Precision>::Sub
1175 template <
int M,
class E,
int S>
inline
1176 typename CNT<typename CNT<E>::Precision>::template Result<SymMat<M,E,S> >::Sub
1183 template <
int M,
class E,
int S,
class R>
inline
1184 typename SymMat<M,E,S>::template Result<std::complex<R> >::Sub
1187 template <
int M,
class E,
int S,
class R>
inline
1188 typename CNT<std::complex<R> >::template Result<SymMat<M,E,S> >::Sub
1193 template <
int M,
class E,
int S,
class R>
inline
1194 typename SymMat<M,E,S>::template Result<std::complex<R> >::Sub
1196 template <
int M,
class E,
int S,
class R>
inline
1197 typename CNT<std::complex<R> >::template Result<SymMat<M,E,S> >::Sub
1201 template <
int M,
class E,
int S,
class R>
inline
1202 typename SymMat<M,E,S>::template Result<typename negator<R>::StdNumber>::Sub
1204 template <
int M,
class E,
int S,
class R>
inline
1205 typename CNT<R>::template Result<SymMat<M,E,S> >::Sub
1210 template <
int M,
class E,
int RS,
class CHAR,
class TRAITS>
inline
1211 std::basic_ostream<CHAR,TRAITS>&
1213 for (
int i=0;i<M;++i) {
1214 o << std::endl <<
"[";
1215 for (
int j=0; j<=i; ++j)
1216 o << (j>0?
" ":
"") << m(i,j);
1217 for (
int j=i+1; j<M; ++j)
1221 if (M) o << std::endl;
1225 template <
int M,
class E,
int RS,
class CHAR,
class TRAITS>
inline
1226 std::basic_istream<CHAR,TRAITS>&
1236 #endif //SimTK_SIMMATRIX_SMALLMATRIX_SYMMAT_H_