1 #ifndef SimTK_SIMMATRIX_SMALLMATRIX_VEC_H_
2 #define SimTK_SIMMATRIX_SMALLMATRIX_VEC_H_
46 template <
class E1,
int S1,
class E2,
int S2>
void
48 Vec<1,
typename CNT<E1>::template Result<E2>::Add>& result) {
49 result[0] = r1[0] + r2[0];
51 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
53 Vec<N,
typename CNT<E1>::template Result<E2>::Add>& result) {
55 reinterpret_cast<const Vec<N-1,E2,S2
>&>(r2),
56 reinterpret_cast<Vec<N-1,typename CNT<E1>::
57 template Result<E2>::Add
>&>(result));
58 result[N-1] = r1[N-1] + r2[N-1];
61 template <
class E1,
int S1,
class E2,
int S2>
void
63 Vec<1,
typename CNT<E1>::template Result<E2>::Sub>& result) {
64 result[0] = r1[0] - r2[0];
66 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
68 Vec<N,
typename CNT<E1>::template Result<E2>::Sub>& result) {
70 reinterpret_cast<const Vec<N-1,E2,S2
>&>(r2),
71 reinterpret_cast<Vec<N-1,typename CNT<E1>::
72 template Result<E2>::Sub
>&>(result));
73 result[N-1] = r1[N-1] - r2[N-1];
76 template <
class E1,
int S1,
class E2,
int S2>
void
78 Vec<1,
typename CNT<E1>::template Result<E2>::Mul>& result) {
79 result[0] = r1[0] * r2[0];
81 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
83 Vec<N,
typename CNT<E1>::template Result<E2>::Mul>& result) {
85 reinterpret_cast<const Vec<N-1,E2,S2
>&>(r2),
86 reinterpret_cast<Vec<N-1,typename CNT<E1>::
87 template Result<E2>::Mul
>&>(result));
88 result[N-1] = r1[N-1] * r2[N-1];
91 template <
class E1,
int S1,
class E2,
int S2>
void
93 Vec<1,
typename CNT<E1>::template Result<E2>::Dvd>& result) {
94 result[0] = r1[0] / r2[0];
96 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
98 Vec<N,
typename CNT<E1>::template Result<E2>::Dvd>& result) {
100 reinterpret_cast<const Vec<N-1,E2,S2
>&>(r2),
101 reinterpret_cast<Vec<N-1,typename CNT<E1>::
102 template Result<E2>::Dvd
>&>(result));
103 result[N-1] = r1[N-1] / r2[N-1];
106 template <
class E1,
int S1,
class E2,
int S2>
void
107 copy(Vec<1,E1,S1>& r1,
const Vec<1,E2,S2>& r2) {
110 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
111 copy(Vec<N,E1,S1>& r1,
const Vec<N,E2,S2>& r2) {
112 copy(
reinterpret_cast<Vec<N-1,E1,S1
>&>(r1),
113 reinterpret_cast<const Vec<N-1,E2,S2
>&>(r2));
183 template <
int M,
class ELT,
int STRIDE>
316 static int size() {
return M; }
318 static int nrow() {
return M; }
320 static int ncol() {
return 1; }
327 for(
int i=0;i<M;++i) sum += CNT<E>::scalarNormSqr(d[i*STRIDE]);
337 for(
int i=0;i<M;++i) vsqrt[i] = CNT<E>::sqrt(d[i*STRIDE]);
357 for(
int i=0;i<M;++i) vstd[i] = CNT<E>::standardize(d[i*STRIDE]);
366 for (
int i=0;i<M;++i) sum += d[i*STRIDE];
388 typedef typename MulOp::Type
Mul;
393 typedef typename MulOpNonConforming::Type
MulNon;
398 typedef typename DvdOp::Type
Dvd;
403 typedef typename AddOp::Type
Add;
408 typedef typename SubOp::Type
Sub;
468 explicit Vec(
const E& e) {
for (
int i=0;i<M;++i) d[i*STRIDE]=e;}
476 for (
int i=0;i<M;++i) d[i*STRIDE]=e;
489 { assert(M==2);(*this)[0]=e0;(*this)[1]=e1; }
491 { assert(M==3);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2; }
492 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3)
493 { assert(M==4);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;(*this)[3]=e3; }
494 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4)
495 { assert(M==5);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
496 (*this)[3]=e3;(*this)[4]=e4; }
497 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5)
498 { assert(M==6);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
499 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5; }
500 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5,
const E& e6)
501 { assert(M==7);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
502 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6; }
503 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5,
const E& e6,
const E& e7)
504 { assert(M==8);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
505 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6;(*this)[7]=e7; }
506 Vec(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5,
const E& e6,
const E& e7,
const E& e8)
507 { assert(M==9);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
508 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6;(*this)[7]=e7;(*this)[8]=e8; }
514 template <
class EE>
explicit Vec(
const EE* p)
515 { assert(p);
for(
int i=0;i<M;++i) d[i*STRIDE]=p[i]; }
522 { assert(p);
for(
int i=0;i<M;++i) d[i*STRIDE]=p[i];
return *
this; }
532 {
for(
int i=0;i<M;++i) d[i*STRIDE] += r[i];
return *
this; }
537 {
for(
int i=0;i<M;++i) d[i*STRIDE] -= -(r[i]);
return *
this; }
542 {
for(
int i=0;i<M;++i) d[i*STRIDE] -= r[i];
return *
this; }
547 {
for(
int i=0;i<M;++i) d[i*STRIDE] += -(r[i]);
return *
this; }
595 { assert(0 <= i && i < M);
return d[i*STRIDE]; }
602 E&
operator[](
int i) {assert(0 <= i && i < M);
return d[i*STRIDE];}
625 TNormalize elementwiseNormalized;
626 for (
int i=0; i<M; ++i)
628 return elementwiseNormalized;
654 const TNeg&
negate()
const {
return *
reinterpret_cast<const TNeg*
>(
this); }
657 TNeg&
updNegate() {
return *
reinterpret_cast< TNeg*
>(
this); }
660 const THerm&
transpose()
const {
return *
reinterpret_cast<const THerm*
>(
this); }
670 {
return *
reinterpret_cast<const TPosTrans*
>(
this); }
673 {
return *
reinterpret_cast<TPosTrans*
>(
this); }
692 const EImag* p =
reinterpret_cast<const EImag*
>(
this);
693 return *
reinterpret_cast<const TImag*
>(p+offs);
700 return *
reinterpret_cast<TImag*
>(p+offs);
707 {
return *
reinterpret_cast<const TWithoutNegator*
>(
this); }
711 {
return *
reinterpret_cast<TWithoutNegator*
>(
this); }
724 for (
int i=0; i<M; ++i) result[i] = (*
this)[i] * e;
730 for (
int i=0; i<M; ++i) result[i] = e * (*
this)[i];
739 for (
int i=0; i<M; ++i) result[i] = (*
this)[i] / e;
745 for (
int i=0; i<M; ++i) result[i] = e / (*
this)[i];
752 for (
int i=0; i<M; ++i) result[i] = (*
this)[i] + e;
760 for (
int i=0; i<M; ++i) result[i] = (*
this)[i] - e;
766 for (
int i=0; i<M; ++i) result[i] = e - (*
this)[i];
782 {
for(
int i=0;i<M;++i) d[i*STRIDE] = ee;
return *
this; }
784 {
for(
int i=0;i<M;++i) d[i*STRIDE] += ee;
return *
this; }
786 {
for(
int i=0;i<M;++i) d[i*STRIDE] -= ee;
return *
this; }
788 {
for(
int i=0;i<M;++i) d[i*STRIDE] = ee - d[i*STRIDE];
return *
this; }
790 {
for(
int i=0;i<M;++i) d[i*STRIDE] *= ee;
return *
this; }
792 {
for(
int i=0;i<M;++i) d[i*STRIDE] = ee * d[i*STRIDE];
return *
this; }
794 {
for(
int i=0;i<M;++i) d[i*STRIDE] /= ee;
return *
this; }
796 {
for(
int i=0;i<M;++i) d[i*STRIDE] = ee / d[i*STRIDE];
return *
this; }
826 assert(0 <= i && i + MM <= M);
836 assert(0 <= i && i + MM <= M);
846 assert(0 <= i && i + M <= MM);
854 assert(0 <= i && i + M <= MM);
862 assert(0 <= p && p < M);
865 for (
int i=0; i<M-1; ++i, ++nxt) {
867 out[i] = (*this)[nxt];
889 assert(0 <= p && p <= M);
893 for (
int i=0; i<M; ++i, ++nxt) {
894 if (i==p) out[nxt++] = v;
895 out[nxt] = (*this)[i];
903 {
return *
reinterpret_cast<const Vec*
>(p); }
907 {
return *
reinterpret_cast<Vec*
>(p); }
917 for (
int i=0; i<M; ++i)
926 bool seenInf =
false;
927 for (
int i=0; i<M; ++i) {
928 const ELT& e = (*this)[i];
941 for (
int i=0; i<M; ++i)
953 template <
class E2,
int RS2>
955 for (
int i=0; i<M; ++i)
964 template <
class E2,
int RS2>
978 for (
int i=0; i<M; ++i)
987 std::stringstream stream;
993 void set(
int i,
const E& value)
994 { (*this)[i] = value; }
997 const E&
get(
int i)
const
1012 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline
1013 typename Vec<M,E1,S1>::template Result< Vec<M,E2,S2> >::Add
1016 ::AddOp::perform(l,r);
1020 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline
1021 typename Vec<M,E1,S1>::template Result< Vec<M,E2,S2> >::Sub
1024 ::SubOp::perform(l,r);
1028 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1030 {
for (
int i=0; i < M; ++i)
if (l[i] != r[i])
return false;
1033 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1037 template <
int M,
class E1,
int S1,
class E2>
inline bool
1039 {
for (
int i=0; i < M; ++i)
if (v[i] != e)
return false;
1042 template <
int M,
class E1,
int S1,
class E2>
inline bool
1046 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1048 {
for (
int i=0; i < M; ++i) if (l[i] >= r[i])
return false;
1051 template <
int M,
class E1,
int S1,
class E2>
inline bool
1052 operator<(const Vec<M,E1,S1>& v,
const E2& e)
1053 {
for (
int i=0; i < M; ++i) if (v[i] >= e)
return false;
1057 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1059 {
for (
int i=0; i < M; ++i)
if (l[i] <= r[i])
return false;
1062 template <
int M,
class E1,
int S1,
class E2>
inline bool
1064 {
for (
int i=0; i < M; ++i)
if (v[i] <= e)
return false;
1069 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1071 {
for (
int i=0; i < M; ++i) if (l[i] > r[i])
return false;
1075 template <
int M,
class E1,
int S1,
class E2>
inline bool
1076 operator<=(const Vec<M,E1,S1>& v,
const E2& e)
1077 {
for (
int i=0; i < M; ++i) if (v[i] > e)
return false;
1082 template <
int M,
class E1,
int S1,
class E2,
int S2>
inline bool
1084 {
for (
int i=0; i < M; ++i)
if (l[i] < r[i])
return false;
1088 template <
int M,
class E1,
int S1,
class E2>
inline bool
1090 {
for (
int i=0; i < M; ++i)
if (v[i] < e)
return false;
1104 template <
int M,
class E,
int S>
inline
1105 typename Vec<M,E,S>::template Result<float>::Mul
1108 template <
int M,
class E,
int S>
inline
1109 typename Vec<M,E,S>::template Result<float>::Mul
1112 template <
int M,
class E,
int S>
inline
1113 typename Vec<M,E,S>::template Result<double>::Mul
1116 template <
int M,
class E,
int S>
inline
1117 typename Vec<M,E,S>::template Result<double>::Mul
1120 template <
int M,
class E,
int S>
inline
1121 typename Vec<M,E,S>::template Result<long double>::Mul
1124 template <
int M,
class E,
int S>
inline
1125 typename Vec<M,E,S>::template Result<long double>::Mul
1129 template <
int M,
class E,
int S>
inline
1130 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Mul
1132 template <
int M,
class E,
int S>
inline
1133 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Mul
1139 template <
int M,
class E,
int S,
class R>
inline
1140 typename Vec<M,E,S>::template Result<std::complex<R> >::Mul
1143 template <
int M,
class E,
int S,
class R>
inline
1144 typename Vec<M,E,S>::template Result<std::complex<R> >::Mul
1148 template <
int M,
class E,
int S,
class R>
inline
1149 typename Vec<M,E,S>::template Result<std::complex<R> >::Mul
1151 template <
int M,
class E,
int S,
class R>
inline
1152 typename Vec<M,E,S>::template Result<std::complex<R> >::Mul
1156 template <
int M,
class E,
int S,
class R>
inline
1157 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Mul
1159 template <
int M,
class E,
int S,
class R>
inline
1160 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Mul
1169 template <
int M,
class E,
int S>
inline
1170 typename Vec<M,E,S>::template Result<float>::Dvd
1173 template <
int M,
class E,
int S>
inline
1174 typename CNT<float>::template Result<Vec<M,E,S> >::Dvd
1178 template <
int M,
class E,
int S>
inline
1179 typename Vec<M,E,S>::template Result<double>::Dvd
1182 template <
int M,
class E,
int S>
inline
1183 typename CNT<double>::template Result<Vec<M,E,S> >::Dvd
1187 template <
int M,
class E,
int S>
inline
1188 typename Vec<M,E,S>::template Result<long double>::Dvd
1191 template <
int M,
class E,
int S>
inline
1192 typename CNT<long double>::template Result<Vec<M,E,S> >::Dvd
1197 template <
int M,
class E,
int S>
inline
1198 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Dvd
1200 template <
int M,
class E,
int S>
inline
1201 typename CNT<typename CNT<E>::Precision>::template Result<Vec<M,E,S> >::Dvd
1208 template <
int M,
class E,
int S,
class R>
inline
1209 typename Vec<M,E,S>::template Result<std::complex<R> >::Dvd
1212 template <
int M,
class E,
int S,
class R>
inline
1213 typename CNT<std::complex<R> >::template Result<Vec<M,E,S> >::Dvd
1218 template <
int M,
class E,
int S,
class R>
inline
1219 typename Vec<M,E,S>::template Result<std::complex<R> >::Dvd
1221 template <
int M,
class E,
int S,
class R>
inline
1222 typename CNT<std::complex<R> >::template Result<Vec<M,E,S> >::Dvd
1226 template <
int M,
class E,
int S,
class R>
inline
1227 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Dvd
1229 template <
int M,
class E,
int S,
class R>
inline
1230 typename CNT<R>::template Result<Vec<M,E,S> >::Dvd
1241 template <
int M,
class E,
int S>
inline
1242 typename Vec<M,E,S>::template Result<float>::Add
1245 template <
int M,
class E,
int S>
inline
1246 typename Vec<M,E,S>::template Result<float>::Add
1249 template <
int M,
class E,
int S>
inline
1250 typename Vec<M,E,S>::template Result<double>::Add
1253 template <
int M,
class E,
int S>
inline
1254 typename Vec<M,E,S>::template Result<double>::Add
1257 template <
int M,
class E,
int S>
inline
1258 typename Vec<M,E,S>::template Result<long double>::Add
1261 template <
int M,
class E,
int S>
inline
1262 typename Vec<M,E,S>::template Result<long double>::Add
1266 template <
int M,
class E,
int S>
inline
1267 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Add
1269 template <
int M,
class E,
int S>
inline
1270 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Add
1276 template <
int M,
class E,
int S,
class R>
inline
1277 typename Vec<M,E,S>::template Result<std::complex<R> >::Add
1280 template <
int M,
class E,
int S,
class R>
inline
1281 typename Vec<M,E,S>::template Result<std::complex<R> >::Add
1285 template <
int M,
class E,
int S,
class R>
inline
1286 typename Vec<M,E,S>::template Result<std::complex<R> >::Add
1288 template <
int M,
class E,
int S,
class R>
inline
1289 typename Vec<M,E,S>::template Result<std::complex<R> >::Add
1293 template <
int M,
class E,
int S,
class R>
inline
1294 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Add
1296 template <
int M,
class E,
int S,
class R>
inline
1297 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Add
1303 template <
int M,
class E,
int S>
inline
1304 typename Vec<M,E,S>::template Result<float>::Sub
1307 template <
int M,
class E,
int S>
inline
1308 typename CNT<float>::template Result<Vec<M,E,S> >::Sub
1312 template <
int M,
class E,
int S>
inline
1313 typename Vec<M,E,S>::template Result<double>::Sub
1316 template <
int M,
class E,
int S>
inline
1317 typename CNT<double>::template Result<Vec<M,E,S> >::Sub
1321 template <
int M,
class E,
int S>
inline
1322 typename Vec<M,E,S>::template Result<long double>::Sub
1325 template <
int M,
class E,
int S>
inline
1326 typename CNT<long double>::template Result<Vec<M,E,S> >::Sub
1331 template <
int M,
class E,
int S>
inline
1332 typename Vec<M,E,S>::template Result<typename CNT<E>::Precision>::Sub
1334 template <
int M,
class E,
int S>
inline
1335 typename CNT<typename CNT<E>::Precision>::template Result<Vec<M,E,S> >::Sub
1342 template <
int M,
class E,
int S,
class R>
inline
1343 typename Vec<M,E,S>::template Result<std::complex<R> >::Sub
1346 template <
int M,
class E,
int S,
class R>
inline
1347 typename CNT<std::complex<R> >::template Result<Vec<M,E,S> >::Sub
1352 template <
int M,
class E,
int S,
class R>
inline
1353 typename Vec<M,E,S>::template Result<std::complex<R> >::Sub
1355 template <
int M,
class E,
int S,
class R>
inline
1356 typename CNT<std::complex<R> >::template Result<Vec<M,E,S> >::Sub
1360 template <
int M,
class E,
int S,
class R>
inline
1361 typename Vec<M,E,S>::template Result<typename negator<R>::StdNumber>::Sub
1363 template <
int M,
class E,
int S,
class R>
inline
1364 typename CNT<R>::template Result<Vec<M,E,S> >::Sub
1368 template <
int M,
class E,
int S,
class CHAR,
class TRAITS>
inline
1369 std::basic_ostream<CHAR,TRAITS>&
1370 operator<<(std::basic_ostream<CHAR,TRAITS>& o,
const Vec<M,E,S>& v) {
1371 o <<
"~[" << v[0];
for(
int i=1;i<M;++i) o<<
','<<v[i]; o<<
']';
return o;
1376 template <
int M,
class E,
int S,
class CHAR,
class TRAITS>
inline
1377 std::basic_istream<CHAR,TRAITS>&
1380 is >> tilde;
if (is.fail())
return is;
1381 if (tilde != CHAR(
'~')) {
1383 is.unget();
if (is.fail())
return is;
1386 CHAR openBracket, closeBracket;
1387 is >> openBracket;
if (is.fail())
return is;
1388 if (openBracket==CHAR(
'('))
1389 closeBracket = CHAR(
')');
1390 else if (openBracket==CHAR(
'['))
1391 closeBracket = CHAR(
']');
1393 closeBracket = CHAR(0);
1394 is.unget();
if (is.fail())
return is;
1399 if (tilde != CHAR(0) && closeBracket == CHAR(0)) {
1400 is.setstate( std::ios::failbit );
1404 for (
int i=0; i < M; ++i) {
1406 if (is.fail())
return is;
1408 CHAR c; is >> c;
if (is.fail())
return is;
1409 if (c !=
',') is.unget();
1410 if (is.fail())
return is;
1416 if (closeBracket != CHAR(0)) {
1417 CHAR closer; is >> closer;
if (is.fail())
return is;
1418 if (closer != closeBracket) {
1419 is.unget();
if (is.fail())
return is;
1420 is.setstate( std::ios::failbit );
1430 #endif //SimTK_SIMMATRIX_SMALLMATRIX_VEC_H_