1 #ifndef SimTK_SIMMATRIX_SMALLMATRIX_ROW_H_
2 #define SimTK_SIMMATRIX_SMALLMATRIX_ROW_H_
44 template <
class E1,
int S1,
class E2,
int S2>
void
47 result[0] = r1[0] + r2[0];
49 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
53 reinterpret_cast<const Row<N-1,E2,S2
>&>(r2),
55 template Result<E2>::Add
>&>(result));
56 result[N-1] = r1[N-1] + r2[N-1];
59 template <
class E1,
int S1,
class E2,
int S2>
void
62 result[0] = r1[0] - r2[0];
64 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
68 reinterpret_cast<const Row<N-1,E2,S2
>&>(r2),
70 template Result<E2>::Sub
>&>(result));
71 result[N-1] = r1[N-1] - r2[N-1];
74 template <
class E1,
int S1,
class E2,
int S2>
void
77 result[0] = r1[0] * r2[0];
79 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
83 reinterpret_cast<const Row<N-1,E2,S2
>&>(r2),
85 template Result<E2>::Mul
>&>(result));
86 result[N-1] = r1[N-1] * r2[N-1];
89 template <
class E1,
int S1,
class E2,
int S2>
void
92 result[0] = r1[0] / r2[0];
94 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
98 reinterpret_cast<const Row<N-1,E2,S2
>&>(r2),
100 template Result<E2>::Dvd
>&>(result));
101 result[N-1] = r1[N-1] / r2[N-1];
104 template <
class E1,
int S1,
class E2,
int S2>
void
108 template <
int N,
class E1,
int S1,
class E2,
int S2>
void
110 copy(
reinterpret_cast<Row<N-1,E1,S1
>&>(r1),
111 reinterpret_cast<const Row<N-1,E2,S2
>&>(r2));
132 template <
int N,
class ELT,
int STRIDE>
class Row {
216 static int size() {
return N; }
217 static int nrow() {
return 1; }
218 static int ncol() {
return N; }
224 for(
int i=0;i<N;++i) sum += CNT<E>::scalarNormSqr(d[i*STRIDE]);
233 for(
int i=0;i<N;++i) rsqrt[i] = CNT<E>::sqrt(d[i*STRIDE]);
248 for(
int i=0;i<N;++i) rstd[i] = CNT<E>::standardize(d[i*STRIDE]);
256 for (
int i=0;i<N;++i) sum += d[i*STRIDE];
276 typedef typename MulOp::Type
Mul;
281 typedef typename MulOpNonConforming::Type
MulNon;
287 typedef typename DvdOp::Type
Dvd;
292 typedef typename AddOp::Type
Add;
297 typedef typename SubOp::Type
Sub;
344 {
for (
int i=0;i<N;++i) d[i*STRIDE]=e; }
347 explicit Row(
const ENeg& ne)
348 {
for (
int i=0;i<N;++i) d[i*STRIDE]=ne; }
356 Row(
const E& e0,
const E& e1)
357 { assert(N==2);(*this)[0]=e0;(*this)[1]=e1; }
358 Row(
const E& e0,
const E& e1,
const E& e2)
359 { assert(N==3);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2; }
360 Row(
const E& e0,
const E& e1,
const E& e2,
const E& e3)
361 { assert(N==4);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;(*this)[3]=e3; }
362 Row(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4)
363 { assert(N==5);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
364 (*this)[3]=e3;(*this)[4]=e4; }
365 Row(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5)
366 { assert(N==6);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
367 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5; }
368 Row(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5,
const E& e6)
369 { assert(N==7);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
370 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6; }
371 Row(
const E& e0,
const E& e1,
const E& e2,
const E& e3,
const E& e4,
const E& e5,
const E& e6,
const E& e7)
372 { assert(N==8);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
373 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6;(*this)[7]=e7; }
374 Row(
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)
375 { assert(N==9);(*this)[0]=e0;(*this)[1]=e1;(*this)[2]=e2;
376 (*this)[3]=e3;(*this)[4]=e4;(*this)[5]=e5;(*this)[6]=e6;(*this)[7]=e7;(*this)[8]=e8; }
380 template <
class EE>
explicit Row(
const EE* p)
381 { assert(p);
for(
int i=0;i<N;++i) d[i*STRIDE]=p[i]; }
383 { assert(p);
for(
int i=0;i<N;++i) d[i*STRIDE]=p[i];
return *
this; }
391 {
for(
int i=0;i<N;++i) d[i*STRIDE] += r[i];
return *
this; }
393 {
for(
int i=0;i<N;++i) d[i*STRIDE] -= -(r[i]);
return *
this; }
395 {
for(
int i=0;i<N;++i) d[i*STRIDE] -= r[i];
return *
this; }
397 {
for(
int i=0;i<N;++i) d[i*STRIDE] += -(r[i]);
return *
this; }
425 template <
int MatNCol,
class EE,
int CS,
int RS>
449 const E&
operator[](
int i)
const { assert(0 <= i && i < N);
return d[i*STRIDE]; }
450 E&
operator[](
int i) { assert(0 <= i && i < N);
return d[i*STRIDE]; }
473 TNormalize elementwiseNormalized;
474 for (
int j=0; j<N; ++j)
476 return elementwiseNormalized;
488 const TNeg&
negate()
const {
return *
reinterpret_cast<const TNeg*
>(
this); }
489 TNeg&
updNegate() {
return *
reinterpret_cast<TNeg*
>(
this); }
491 const THerm&
transpose()
const {
return *
reinterpret_cast<const THerm*
>(
this); }
495 {
return *
reinterpret_cast<const TPosTrans*
>(
this); }
497 {
return *
reinterpret_cast<TPosTrans*
>(
this); }
505 const EImag* p =
reinterpret_cast<const EImag*
>(
this);
506 return *
reinterpret_cast<const TImag*
>(p+offs);
510 EImag* p =
reinterpret_cast<EImag*
>(
this);
511 return *
reinterpret_cast<TImag*
>(p+offs);
529 for (
int j=0; j<N; ++j) result[j] = (*
this)[j] * e;
535 for (
int j=0; j<N; ++j) result[j] = e * (*
this)[j];
544 for (
int j=0; j<N; ++j) result[j] = (*
this)[j] / e;
550 for (
int j=0; j<N; ++j) result[j] = e / (*
this)[j];
557 for (
int j=0; j<N; ++j) result[j] = (*
this)[j] + e;
565 for (
int j=0; j<N; ++j) result[j] = (*
this)[j] - e;
571 for (
int j=0; j<N; ++j) result[j] = e - (*
this)[j];
587 {
for(
int i=0;i<N;++i) d[i*STRIDE] = ee;
return *
this; }
589 {
for(
int i=0;i<N;++i) d[i*STRIDE] += ee;
return *
this; }
591 {
for(
int i=0;i<N;++i) d[i*STRIDE] -= ee;
return *
this; }
593 {
for(
int i=0;i<N;++i) d[i*STRIDE] = ee - d[i*STRIDE];
return *
this; }
595 {
for(
int i=0;i<N;++i) d[i*STRIDE] *= ee;
return *
this; }
597 {
for(
int i=0;i<N;++i) d[i*STRIDE] = ee * d[i*STRIDE];
return *
this; }
599 {
for(
int i=0;i<N;++i) d[i*STRIDE] /= ee;
return *
this; }
601 {
for(
int i=0;i<N;++i) d[i*STRIDE] = ee / d[i*STRIDE];
return *
this; }
632 assert(0 <= j && j + NN <= N);
642 assert(0 <= j && j + NN <= N);
651 assert(0 <= j && j + N <= NN);
659 assert(0 <= j && j + N <= NN);
667 assert(0 <= p && p < N);
670 for (
int i=0; i<N-1; ++i, ++nxt) {
672 out[i] = (*this)[nxt];
694 assert(0 <= p && p <= N);
698 for (
int i=0; i<N; ++i, ++nxt) {
699 if (i==p) out[nxt++] = v;
700 out[nxt] = (*this)[i];
707 static const Row&
getAs(
const ELT* p) {
return *
reinterpret_cast<const Row*
>(p);}
719 for (
int j=0; j<N; ++j)
728 bool seenInf =
false;
729 for (
int j=0; j<N; ++j) {
730 const ELT& e = (*this)[j];
743 for (
int j=0; j<N; ++j)
755 template <
class E2,
int CS2>
757 for (
int j=0; j<N; ++j)
766 template <
class E2,
int CS2>
780 for (
int j=0; j<N; ++j)
795 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline
796 typename Row<N,E1,S1>::template Result< Row<N,E2,S2> >::Add
799 ::AddOp::perform(l,r);
803 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline
804 typename Row<N,E1,S1>::template Result< Row<N,E2,S2> >::Sub
807 ::SubOp::perform(l,r);
811 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
813 for (
int i=0; i < N; ++i)
if (l[i] != r[i])
return false;
817 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
821 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
823 {
for (
int i=0; i < N; ++i) if (l[i] >= r[i])
return false;
826 template <
int N,
class E1,
int S1,
class E2>
inline bool
827 operator<(const Row<N,E1,S1>& v,
const E2& e)
828 {
for (
int i=0; i < N; ++i) if (v[i] >= e)
return false;
832 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
834 {
for (
int i=0; i < N; ++i)
if (l[i] <= r[i])
return false;
837 template <
int N,
class E1,
int S1,
class E2>
inline bool
839 {
for (
int i=0; i < N; ++i)
if (v[i] <= e)
return false;
844 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
846 {
for (
int i=0; i < N; ++i) if (l[i] > r[i])
return false;
850 template <
int N,
class E1,
int S1,
class E2>
inline bool
851 operator<=(const Row<N,E1,S1>& v,
const E2& e)
852 {
for (
int i=0; i < N; ++i) if (v[i] > e)
return false;
857 template <
int N,
class E1,
int S1,
class E2,
int S2>
inline bool
859 {
for (
int i=0; i < N; ++i)
if (l[i] < r[i])
return false;
863 template <
int N,
class E1,
int S1,
class E2>
inline bool
865 {
for (
int i=0; i < N; ++i)
if (v[i] < e)
return false;
879 template <
int N,
class E,
int S>
inline
880 typename Row<N,E,S>::template Result<float>::Mul
883 template <
int N,
class E,
int S>
inline
884 typename Row<N,E,S>::template Result<float>::Mul
887 template <
int N,
class E,
int S>
inline
888 typename Row<N,E,S>::template Result<double>::Mul
891 template <
int N,
class E,
int S>
inline
892 typename Row<N,E,S>::template Result<double>::Mul
895 template <
int N,
class E,
int S>
inline
896 typename Row<N,E,S>::template Result<long double>::Mul
899 template <
int N,
class E,
int S>
inline
900 typename Row<N,E,S>::template Result<long double>::Mul
904 template <
int N,
class E,
int S>
inline
905 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Mul
907 template <
int N,
class E,
int S>
inline
908 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Mul
914 template <
int N,
class E,
int S,
class R>
inline
915 typename Row<N,E,S>::template Result<std::complex<R> >::Mul
918 template <
int N,
class E,
int S,
class R>
inline
919 typename Row<N,E,S>::template Result<std::complex<R> >::Mul
923 template <
int N,
class E,
int S,
class R>
inline
924 typename Row<N,E,S>::template Result<std::complex<R> >::Mul
926 template <
int N,
class E,
int S,
class R>
inline
927 typename Row<N,E,S>::template Result<std::complex<R> >::Mul
931 template <
int N,
class E,
int S,
class R>
inline
932 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Mul
934 template <
int N,
class E,
int S,
class R>
inline
935 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Mul
944 template <
int N,
class E,
int S>
inline
945 typename Row<N,E,S>::template Result<float>::Dvd
948 template <
int N,
class E,
int S>
inline
949 typename CNT<float>::template Result<Row<N,E,S> >::Dvd
953 template <
int N,
class E,
int S>
inline
954 typename Row<N,E,S>::template Result<double>::Dvd
957 template <
int N,
class E,
int S>
inline
958 typename CNT<double>::template Result<Row<N,E,S> >::Dvd
962 template <
int N,
class E,
int S>
inline
963 typename Row<N,E,S>::template Result<long double>::Dvd
966 template <
int N,
class E,
int S>
inline
967 typename CNT<long double>::template Result<Row<N,E,S> >::Dvd
972 template <
int N,
class E,
int S>
inline
973 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Dvd
975 template <
int N,
class E,
int S>
inline
976 typename CNT<typename CNT<E>::Precision>::template Result<Row<N,E,S> >::Dvd
983 template <
int N,
class E,
int S,
class R>
inline
984 typename Row<N,E,S>::template Result<std::complex<R> >::Dvd
987 template <
int N,
class E,
int S,
class R>
inline
988 typename CNT<std::complex<R> >::template Result<Row<N,E,S> >::Dvd
993 template <
int N,
class E,
int S,
class R>
inline
994 typename Row<N,E,S>::template Result<std::complex<R> >::Dvd
996 template <
int N,
class E,
int S,
class R>
inline
997 typename CNT<std::complex<R> >::template Result<Row<N,E,S> >::Dvd
1001 template <
int N,
class E,
int S,
class R>
inline
1002 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Dvd
1004 template <
int N,
class E,
int S,
class R>
inline
1005 typename CNT<R>::template Result<Row<N,E,S> >::Dvd
1016 template <
int N,
class E,
int S>
inline
1017 typename Row<N,E,S>::template Result<float>::Add
1020 template <
int N,
class E,
int S>
inline
1021 typename Row<N,E,S>::template Result<float>::Add
1024 template <
int N,
class E,
int S>
inline
1025 typename Row<N,E,S>::template Result<double>::Add
1028 template <
int N,
class E,
int S>
inline
1029 typename Row<N,E,S>::template Result<double>::Add
1032 template <
int N,
class E,
int S>
inline
1033 typename Row<N,E,S>::template Result<long double>::Add
1036 template <
int N,
class E,
int S>
inline
1037 typename Row<N,E,S>::template Result<long double>::Add
1041 template <
int N,
class E,
int S>
inline
1042 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Add
1044 template <
int N,
class E,
int S>
inline
1045 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Add
1051 template <
int N,
class E,
int S,
class R>
inline
1052 typename Row<N,E,S>::template Result<std::complex<R> >::Add
1055 template <
int N,
class E,
int S,
class R>
inline
1056 typename Row<N,E,S>::template Result<std::complex<R> >::Add
1060 template <
int N,
class E,
int S,
class R>
inline
1061 typename Row<N,E,S>::template Result<std::complex<R> >::Add
1063 template <
int N,
class E,
int S,
class R>
inline
1064 typename Row<N,E,S>::template Result<std::complex<R> >::Add
1068 template <
int N,
class E,
int S,
class R>
inline
1069 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Add
1071 template <
int N,
class E,
int S,
class R>
inline
1072 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Add
1078 template <
int N,
class E,
int S>
inline
1079 typename Row<N,E,S>::template Result<float>::Sub
1082 template <
int N,
class E,
int S>
inline
1083 typename CNT<float>::template Result<Row<N,E,S> >::Sub
1087 template <
int N,
class E,
int S>
inline
1088 typename Row<N,E,S>::template Result<double>::Sub
1091 template <
int N,
class E,
int S>
inline
1092 typename CNT<double>::template Result<Row<N,E,S> >::Sub
1096 template <
int N,
class E,
int S>
inline
1097 typename Row<N,E,S>::template Result<long double>::Sub
1100 template <
int N,
class E,
int S>
inline
1101 typename CNT<long double>::template Result<Row<N,E,S> >::Sub
1106 template <
int N,
class E,
int S>
inline
1107 typename Row<N,E,S>::template Result<typename CNT<E>::Precision>::Sub
1109 template <
int N,
class E,
int S>
inline
1110 typename CNT<typename CNT<E>::Precision>::template Result<Row<N,E,S> >::Sub
1117 template <
int N,
class E,
int S,
class R>
inline
1118 typename Row<N,E,S>::template Result<std::complex<R> >::Sub
1121 template <
int N,
class E,
int S,
class R>
inline
1122 typename CNT<std::complex<R> >::template Result<Row<N,E,S> >::Sub
1127 template <
int N,
class E,
int S,
class R>
inline
1128 typename Row<N,E,S>::template Result<std::complex<R> >::Sub
1130 template <
int N,
class E,
int S,
class R>
inline
1131 typename CNT<std::complex<R> >::template Result<Row<N,E,S> >::Sub
1135 template <
int N,
class E,
int S,
class R>
inline
1136 typename Row<N,E,S>::template Result<typename negator<R>::StdNumber>::Sub
1138 template <
int N,
class E,
int S,
class R>
inline
1139 typename CNT<R>::template Result<Row<N,E,S> >::Sub
1144 template <
int N,
class E,
int S,
class CHAR,
class TRAITS>
inline
1145 std::basic_ostream<CHAR,TRAITS>&
1146 operator<<(std::basic_ostream<CHAR,TRAITS>& o,
const Row<N,E,S>& v) {
1147 o <<
"[" << v[0];
for(
int i=1;i<N;++i) o<<
','<<v[i]; o<<
']';
return o;
1152 template <
int N,
class E,
int S,
class CHAR,
class TRAITS>
inline
1153 std::basic_istream<CHAR,TRAITS>&
1155 CHAR openBracket, closeBracket;
1156 is >> openBracket;
if (is.fail())
return is;
1157 if (openBracket==CHAR(
'('))
1158 closeBracket = CHAR(
')');
1159 else if (openBracket==CHAR(
'['))
1160 closeBracket = CHAR(
']');
1162 closeBracket = CHAR(0);
1163 is.unget();
if (is.fail())
return is;
1166 for (
int i=0; i < N; ++i) {
1168 if (is.fail())
return is;
1170 CHAR c; is >> c;
if (is.fail())
return is;
1171 if (c !=
',') is.unget();
1172 if (is.fail())
return is;
1178 if (closeBracket != CHAR(0)) {
1179 CHAR closer; is >> closer;
if (is.fail())
return is;
1180 if (closer != closeBracket) {
1181 is.unget();
if (is.fail())
return is;
1182 is.setstate( std::ios::failbit );
1192 #endif //SimTK_SIMMATRIX_SMALLMATRIX_ROW_H_