13#ifndef FR2_MATRIX_CT_HPP
14#define FR2_MATRIX_CT_HPP
27template <
class T, const
int nrows, const
int ncols>
32 inline T* operator[](
size_t i) {
return data[i]; }
33 inline T
const* operator[](
size_t i)
const {
return data[i]; }
47 inline int numRows()
const {
return nrows; }
48 inline int numCols()
const {
return ncols; }
49 inline void setZero() { memset(data,0,nrows*ncols*
sizeof(T)); }
98 mat[0][0]=1.0; mat[0][1]=0.0; mat[0][2]=0.0;
99 mat[1][0]=0.0; mat[1][1]=ct; mat[1][2]=-st;
100 mat[2][0]=0.0; mat[2][1]=st; mat[2][2]=ct;
107FR2MatrixCTC<T,3,3> rotMatrixYCT(T angle)
109 T ct = (T)cos(angle);
110 T st = (T)sin(angle);
112 FR2MatrixCTC<T,3,3> mat;
113 mat[0][0]=ct; mat[0][1]=0.0; mat[0][2]=st;
114 mat[1][0]=0.0; mat[1][1]=1.0; mat[1][2]=0.0;
115 mat[2][0]=-st; mat[2][1]=0.0; mat[2][2]=ct;
122FR2MatrixCTC<T,3,3> rotMatrixZCT(T angle)
124 T ct = (T)cos(angle);
125 T st = (T)sin(angle);
127 FR2MatrixCTC<T,3,3> mat;
128 mat[0][0]=ct; mat[0][1]=-st; mat[0][2]=0.0;
129 mat[1][0]=st; mat[1][1]=ct; mat[1][2]=0.0;
130 mat[2][0]=0.0; mat[2][1]=0.0; mat[2][2]=1.0;
137FR2MatrixCTC<T,3,3> rotMatrixKCT(T angle,
const FR2Vect3TC<T> &k)
139 T ct = (T)cos(angle);
140 T st = (T)sin(angle);
143 FR2MatrixCTC<T,3,3> mat;
144 mat[0][0] = k.x1*k.x1*vt + ct;
145 mat[0][1] = k.x1*k.x2*vt - k.x3*st;
146 mat[0][2] = k.x1*k.x3*vt + k.x2*st;
148 mat[1][0] = k.x1*k.x2*vt + k.x3*st;
149 mat[1][1] = k.x2*k.x2*vt + ct;
150 mat[1][2] = k.x2*k.x3*vt - k.x1*st;
152 mat[2][0] = k.x1*k.x3*vt - k.x2*st;
153 mat[2][1] = k.x2*k.x3*vt + k.x1*st;
154 mat[2][2] = k.x3*k.x3*vt + ct;
164inline FR2MatrixCTC<T,1,2> rowVector2T(
const FR2Vect2TC<T>& v)
166 FR2MatrixCTC<T,1,2> mat;
174inline FR2MatrixCTC<T,1,3> rowVector3T(
const FR2Vect3TC<T>& v)
176 FR2MatrixCTC<T,1,3> mat;
184template <
class T, const
int ncols>
185inline FR2MatrixCTC<T,1,ncols> rowVectorCT(T
const v[])
187 FR2MatrixCTC<T,1,ncols> mat;
188 for (
int ii=0; ii<ncols; ii++)
198inline FR2MatrixCTC<T,2,1> columnVector2T(
const FR2Vect2TC<T>& v)
200 FR2MatrixCTC<T,2,1> mat;
208inline FR2MatrixCTC<T,3,1> columnVector3T(
const FR2Vect3TC<T>& v)
210 FR2MatrixCTC<T,3,1> mat;
218template <
class T, const
int nrows>
219inline FR2MatrixCTC<T,nrows,1> columnVectorCT(T
const v[])
221 FR2MatrixCTC<T,nrows,1> mat;
222 for (
int ii=0; ii<nrows; ii++)
232inline FR2MatrixCTC<T,2,2> diagMatrix2T(
const FR2Vect2TC<T> &v)
234 FR2MatrixCTC<T,2,2> mat;
244inline FR2MatrixCTC<T,3,3> diagMatrix3T(
const FR2Vect3TC<T> &v)
246 FR2MatrixCTC<T,3,3> mat;
256template <
class T, const
int nrows>
257inline FR2MatrixCTC<T,nrows,nrows> diagMatrixCT(T
const v[nrows])
259 FR2MatrixCTC<T,nrows,nrows> mat;
262 for (
int ii=0; ii<nrows; ii++)
272FR2Vect3TC<T> operator*(
const FR2MatrixCTC<T,3,3> &m,
const FR2Vect3TC<T> &v)
276 v2.x1 = m[0][0] * v.x1 + m[0][1] * v.x2 + m[0][2] * v.x3;
277 v2.x2 = m[1][0] * v.x1 + m[1][1] * v.x2 + m[1][2] * v.x3;
278 v2.x3 = m[2][0] * v.x1 + m[2][1] * v.x2 + m[2][2] * v.x3;
284FR2Vect2TC<T> operator*(
const FR2MatrixCTC<T,2,3> &m,
const FR2Vect3TC<T> &v)
288 v2.x1 = m[0][0] * v.x1 + m[0][1] * v.x2 + m[0][2] * v.x3;
289 v2.x2 = m[1][0] * v.x1 + m[1][1] * v.x2 + m[1][2] * v.x3;
295FR2Vect2TC<T> operator*(
const FR2MatrixCTC<T,2,2> &m,
const FR2Vect2TC<T> &v)
299 v2.x1 = m[0][0] * v.x1 + m[0][1] * v.x2;
300 v2.x2 = m[1][0] * v.x1 + m[1][1] * v.x2;
308template <
class T, const
int nrows, const
int ncols, const
int ncols2>
309FR2MatrixCTC<T,nrows,ncols2> fr2MatMulCT(
310 const FR2MatrixCTC<T,nrows,ncols>& m1,
311 const FR2MatrixCTC<T,ncols,ncols2>& m2)
313 FR2MatrixCTC<T,nrows,ncols2> newMat;
315 for (
int ii=0; ii<nrows; ii++)
316 for (
int jj=0; jj<ncols2; jj++)
318 newMat[ii][jj] = 0.0;
319 for (
int kk=0; kk<ncols; kk++)
320 newMat[ii][jj] += m1[ii][kk] * m2[kk][jj];
334template <
class T, const
int nrows, const
int ncols>
335FR2MatrixCTC<T,nrows,nrows> FR2MatrixCTC<T,nrows,ncols>::operator*(
336 const FR2MatrixCTC<T,ncols,nrows>& m)
const
338 FR2MatrixCTC<T,nrows,nrows> newMat;
340 for (
int ii=0; ii<nrows; ii++)
341 for (
int jj=0; jj<nrows; jj++)
343 newMat[ii][jj] = T(0);
344 for (
int kk=0; kk<ncols; kk++)
345 newMat[ii][jj] += data[ii][kk] * m[kk][jj];
355template <
class T,const
int nrows, const
int ncols>
356inline FR2MatrixCTC<T,nrows,ncols> FR2MatrixCTC<T,nrows,ncols>::operator*(
359 FR2MatrixCTC<T,nrows,ncols> newMat;
361 for (
int ii=0; ii<nrows; ii++)
362 for (
int jj=0; jj<ncols; jj++)
363 newMat.data[ii][jj] = data[ii][jj] * v;
372template <
class T,const
int nrows, const
int ncols>
373inline FR2MatrixCTC<T,nrows,ncols> FR2MatrixCTC<T,nrows,ncols>::operator+(
374 const FR2MatrixCTC<T,nrows,ncols>& m)
const
376 FR2MatrixCTC<T,nrows,ncols> newMat;
378 for (
int ii=0; ii<nrows; ii++)
379 for (
int jj=0; jj<ncols; jj++)
380 newMat.data[ii][jj] = data[ii][jj] + m.data[ii][jj];
389template <
class T,const
int nrows, const
int ncols>
390inline FR2MatrixCTC<T,nrows,ncols> FR2MatrixCTC<T,nrows,ncols>::operator-(
391 const FR2MatrixCTC<T,nrows,ncols>& m)
const
393 FR2MatrixCTC<T,nrows,ncols> newMat;
395 for (
int ii=0; ii<nrows; ii++)
396 for (
int jj=0; jj<ncols; jj++)
397 newMat.data[ii][jj] = data[ii][jj] - m.data[ii][jj];
402template <
class T,const
int nrows,const
int ncols>
403inline FR2MatrixCTC<T,nrows,ncols> FR2MatrixCTC<T,nrows,ncols>::operator-()
const
405 FR2MatrixCTC<T,nrows,ncols> retval;
407 for (
int ii=0; ii<nrows; ii++)
408 for (
int jj=0; jj<ncols; jj++)
409 retval.data[ii][jj] = - data[ii][jj];
417template <
class T,const
int nrows, const
int ncols>
418inline FR2MatrixCTC<T,nrows,ncols>& FR2MatrixCTC<T,nrows,ncols>::operator*=(
421 for (
int ii=0; ii<nrows; ii++)
422 for (
int jj=0; jj<ncols; jj++)
432template <
class T,const
int nrows, const
int ncols>
433inline FR2MatrixCTC<T,nrows,ncols>& FR2MatrixCTC<T,nrows,ncols>::operator+=(
434 const FR2MatrixCTC<T,nrows,ncols>& m)
436 for (
int ii=0; ii<nrows; ii++)
437 for (
int jj=0; jj<ncols; jj++)
438 data[ii][jj] += m.data[ii][jj];
447template <
class T,const
int nrows, const
int ncols>
448inline FR2MatrixCTC<T,nrows,ncols>& FR2MatrixCTC<T,nrows,ncols>::operator-=(
449 const FR2MatrixCTC<T,nrows,ncols>& m)
451 for (
int ii=0; ii<nrows; ii++)
452 for (
int jj=0; jj<ncols; jj++)
453 data[ii][jj] -= m.data[ii][jj];
461template <
class T,const
int nrows, const
int ncols>
462inline bool FR2MatrixCTC<T,nrows,ncols>::operator==(
464 const FR2MatrixCTC& v)
468 for (uint row=0; row<nrows; row++)
470 for (uint col=0; col<ncols; col++)
471 retval = retval && (data[row][col] == v.data[row][col]);
479template <
class T,const
int nrows, const
int ncols>
480inline void FR2MatrixCTC<T,nrows,ncols>::setOne()
482 for (
int ii=0; ii<nrows; ii++)
483 for (
int jj=0; jj<ncols; jj++)
491template <
class T,const
int nrows, const
int ncols>
492inline void FR2MatrixCTC<T,nrows,ncols>::setIdentity()
495 int nn = (nrows < ncols) ? nrows : ncols;
496 for (
int ii=0; ii<nn; ii++)
504template <
class T,const
int nrows, const
int ncols>
505inline FR2MatrixCTC<T,ncols,nrows> FR2MatrixCTC<T,nrows,ncols>::transpose()
508 FR2MatrixCTC<T,ncols,nrows> tMat;
510 for (
int ii=0; ii<nrows; ii++)
511 for (
int jj=0; jj<ncols; jj++)
512 tMat[jj][ii] = data[ii][jj];
522static FR2MatrixCTC<T,2,2> futMatInverse22(
524 const FR2MatrixCTC<T,2,2>& m)
526 FR2MatrixCTC<T,2,2> retval;
528 T fac = (m.data[0][0] * m.data[1][1] - m.data[0][1] * m.data[1][0]);
529 FGASSERT_FAST(fac != T(0));
532 retval.data[0][0] = m.data[1][1] * fac;
533 retval.data[0][1] = - m.data[0][1] * fac;
534 retval.data[1][0] = - m.data[1][0] * fac;
535 retval.data[1][1] = m.data[0][0] * fac;
544inline FR2MatrixCTC<float,2,2> futMatInverse(
const FR2MatrixCTC<float,2,2>& m)
545 {
return futMatInverse22<float>(m);}
547inline FR2MatrixCTC<double,2,2> futMatInverse(
const FR2MatrixCTC<double,2,2>& m)
548 {
return futMatInverse22<double>(m);}
555template <
class T,const
int r,const
int c>
556std::ostream& operator<<(std::ostream& s,FR2MatrixCTC<T,r,c> m)
558 for (
int i=0; i<r; i++)
560 for (
int j=0; j<c; j++)