44 #ifndef GNSSTK_MATRIX_OPERATORS_HPP
45 #define GNSSTK_MATRIX_OPERATORS_HPP
61 template <
class T,
class BaseClass1,
class BaseClass2>
67 MatrixException e(
"Incompatible dimensions for Matrix && Matrix");
72 size_t cols = l.
cols();
75 for (rows = 0; rows < l.
rows(); rows++)
76 for (cols = 0; cols < l.
cols(); cols++)
77 toReturn(rows, cols) = l(rows, cols);
79 for (rows = 0; rows < r.
rows(); rows++)
80 for (cols = 0; cols < l.
cols(); cols++)
81 toReturn(rows + l.
rows(), cols) = r(rows, cols);
91 template <
class T,
class BaseClass1,
class BaseClass2>
97 MatrixException e(
"Incompatible dimensions for Matrix && Vector");
101 size_t rows = t.
rows() + 1;
102 size_t cols = t.
cols();
105 for (rows = 0; rows < t.
rows(); rows++)
106 for (cols = 0; cols < t.
cols(); cols++)
107 toReturn(rows, cols) = t(rows, cols);
109 for (cols = 0; cols < t.
cols(); cols++)
110 toReturn(t.
rows(), cols) = b(cols);
120 template <
class T,
class BaseClass1,
class BaseClass2>
126 MatrixException e(
"Incompatible dimensions for Vector && Matrix");
130 size_t rows = 1 + b.
rows();
131 size_t cols = b.
cols();
134 for (cols = 0; cols < b.
cols(); cols++)
135 toReturn(0, cols) = t(cols);
137 for (rows = 1; rows < b.
rows()+1; rows++)
138 for (cols = 0; cols < b.
cols(); cols++)
139 toReturn(rows, cols) = b(rows, cols);
149 template <
class T,
class BaseClass1,
class BaseClass2>
155 MatrixException e(
"Incompatible dimensions for Matrix || Matrix");
159 size_t rows = l.
rows();
163 for (cols = 0; cols < l.
cols(); cols++)
164 for (rows = 0; rows < l.
rows(); rows++)
165 toReturn(rows, cols) = l(rows, cols);
167 for (cols = 0; cols < r.
cols(); cols++)
168 for (rows = 0; rows < l.
rows(); rows++)
169 toReturn(rows, cols + l.
cols()) = r(rows,cols);
179 template <
class T,
class BaseClass1,
class BaseClass2>
185 MatrixException e(
"Incompatible dimensions for Matrix || Vector");
189 size_t rows = l.
rows();
190 size_t cols = l.
cols() + 1;
193 for (cols = 0; cols < l.
cols(); cols++)
194 for (rows = 0; rows < l.
rows(); rows++)
195 toReturn(rows, cols) = l(rows, cols);
197 for (rows = 0; rows < l.
rows(); rows++)
198 toReturn(rows, l.
cols()) = r(rows);
208 template <
class T,
class BaseClass1,
class BaseClass2>
214 MatrixException e(
"Incompatible dimensions for Vector || Matrix");
218 size_t rows = r.
rows();
219 size_t cols = r.
cols() + 1;
222 for (rows = 0; rows < r.
rows(); rows++)
223 toReturn(rows, 0) = l(rows);
225 for (cols = 1; cols < r.
cols()+1; cols++)
226 for (rows = 0; rows < r.
rows(); rows++)
227 toReturn(rows, cols) = r(rows, cols);
237 template <
class T,
class BaseClass1,
class BaseClass2>
243 MatrixException e(
"Incompatible dimensions for Vector || Vector");
247 size_t rows = r.
size();
250 for (rows = 0; rows < r.
size(); rows++)
252 toReturn(rows, 0) = l(rows);
253 toReturn(rows, 1) = r(rows);
265 template <
class T,
class BaseClass>
267 size_t row,
size_t col)
269 if ((row >= l.
rows()) || (col >= l.
cols()))
271 MatrixException e(
"Invalid row or column for minorMatrix()");
281 else if (col == (l.
cols() - 1))
291 else if (row == (l.
rows() - 1))
297 else if (col == (l.
cols() - 1))
312 else if (col == (l.
cols() - 1))
329 template <
class T,
class BaseClass>
334 for (i = 0; i < m.
rows(); i++)
335 for (j = 0; j < m.
cols(); j++)
344 template <
class T,
class BaseClass>
353 catch(MatrixException& e)
355 e.addText(
"in det()");
363 template <
class T,
class BaseClass>
372 smallNum = svd.
S(svd.
S.size()-1);
373 if(smallNum <= std::numeric_limits<T>::epsilon())
375 return bigNum/smallNum;
382 template <
class T,
class BaseClass>
387 return condNum(m, bigNum, smallNum);
399 MatrixException e(
"Invalid (0) dimension for ident()");
404 for (i = 0; i < toReturn.
rows(); i++)
405 toReturn(i,i) = T(1);
413 template <
class T,
class BaseClass>
418 MatrixException e(
"invalid matrix dimensions for m");
422 const size_t dim = m.
rows();
425 for (
size_t i = 0; i < dim; i++)
435 template <
class T,
class BaseClass>
442 MatrixException e(
"Invalid matrix dimensions of input.");
446 const size_t dim1 = m1.
rows();
447 const size_t dim2 = m2.
rows();
450 for (
size_t i = 0; i < dim1; i++)
452 for(
size_t j = 0; j < dim1; j++)
457 for (
size_t i = 0; i < dim2; i++)
459 for(
size_t j = 0; j < dim2; j++)
461 temp(i+dim1,j+dim1) = m2(i,j);
471 template <
class T,
class BaseClass>
480 template <
class T,
class BaseClass>
497 if (axis < 1 || axis > 3)
499 MatrixException e(
"Invalid axis (must be 1,2, or 3)");
506 toReturn(i1,i1) = 1.0;
507 toReturn(i2,i2) = toReturn(i3,i3) =
::cos(angle);
508 toReturn(i3,i2) = -(toReturn(i2,i3) =
::sin(angle));
518 template <
class T,
class BaseClass>
523 MatrixException e(
"inverse() requires non-trivial square matrix");
544 for (r = 0; r < m.
rows(); r++)
548 if (toReturn(r,r) == 0)
551 while ( (t < m.
rows()) && (toReturn(t,r) == 0) )
556 SingularMatrixException e(
"Singular matrix");
560 for (j = r; j < toReturn.
cols(); j++)
561 toReturn(r,j) += (toReturn(t,j) / toReturn(t,r));
565 temp = toReturn(r,r);
566 for (j = r; j < toReturn.
cols(); j++)
567 toReturn(r,j) /=
temp;
570 for (t = 0; t < m.
rows(); t++)
574 temp = toReturn(t,r);
575 for (j = r; j < toReturn.
cols(); j++)
576 toReturn(t,j) -=
temp/toReturn(r,r) * toReturn(r,j);
590 template <
class T,
class BaseClass>
594 MatrixException e(
"inverseLUD() requires non-trivial square matrix");
598 size_t i,j,N=m.
rows();
607 for(i=0; i<N; i++) inv(i,j)=V(i);
619 template <
class T,
class BaseClass>
623 MatrixException e(
"inverseLUD() requires non-trivial square matrix");
627 size_t i,j,N=m.
rows();
634 for(i = 0; i < m.
rows(); i++) determ *= LU.
LU(i,i);
640 for(i=0; i<N; i++) inv(i,j)=V(i);
651 template <
class T,
class BaseClass>
653 const T tol=T(1.e-8))
656 MatrixException e(
"inverseSVD() requires non-trivial square matrix");
660 size_t i,j,N=m.
rows();
666 if(svd.
S(0) == T(0)) {
667 MatrixException e(
"Input is the zero matrix");
671 for(i=1; i<N; i++)
if(svd.
S(i) < tol*svd.
S(0)) svd.
S(i)=T(0);
678 for(i=0; i<N; i++) inv(i,j)=V(i);
690 template <
class T,
class BaseClass>
692 T& bigNum, T& smallNum,
const T tol=T(1.e-8))
695 MatrixException e(
"inverseSVD() requires non-trivial square matrix");
699 size_t i,j,N=m.
rows();
705 if(svd.
S(0) == T(0)) {
706 MatrixException e(
"Input is the zero matrix");
712 smallNum = svd.
S(svd.
S.size()-1);
715 for(i=1; i<N; i++)
if(svd.
S(i) < tol*svd.
S(0)) svd.
S(i)=T(0);
723 for(i=0; i<N; i++) inv(i,j)=V(i);
735 template <
class T,
class BaseClass>
740 MatrixException e(
"inverseSVD() requires non-trivial square matrix");
744 size_t i,j,N=m.
rows();
750 if(svd.
S(0) == T(0)) {
751 MatrixException e(
"Input is the zero matrix");
757 for(i=0; i<N; i++) sv(i) = svd.
S(i);
760 for(i=1; i<N; i++)
if(svd.
S(i) < tol*svd.
S(0)) svd.
S(i)=T(0);
768 for(i=0; i<N; i++) inv(i,j)=V(i);
781 template <
class T,
class BaseClass>
784 int N = m.
rows(), i, j, k;
794 LI(i,i) = 1.0 / CC.
L(i,i);
797 for(k=i; k>=0; k-- )
sum += CC.
L(i,k)*LI(k,j);
798 LI(i,j) = -
sum*LI(i,i);
813 template <
class T,
class BaseClass1,
class BaseClass2>
819 MatrixException e(
"Incompatible dimensions for Matrix * Matrix");
825 for (i = 0; i < toReturn.
rows(); i++)
826 for (j = 0; j < toReturn.
cols(); j++)
827 for (k = 0; k < l.
cols(); k++)
828 toReturn(i,j) += l(i,k) * r(k,j);
837 template <
class T,
class BaseClass1,
class BaseClass2>
843 gnsstk::MatrixException e(
"Incompatible dimensions for Vector * Matrix");
849 for (i = 0; i < m.
rows(); i++)
852 for (j = 0; j < m.
cols(); j++)
853 toReturn[i] += m(i, j) * v[j];
861 template <
class T,
class BaseClass1,
class BaseClass2>
867 gnsstk::MatrixException e(
"Incompatible dimensions for Vector * Matrix");
873 for (i = 0; i < m.
cols(); i++)
876 for (j = 0; j < m.
rows(); j++)
877 toReturn[i] += m(j,i) * v[j];
886 template <
class T,
class BaseClass1,
class BaseClass2>
892 MatrixException e(
"Incompatible dimensions for Matrix + Matrix");
898 for (i = 0; i < toReturn.
rows(); i++)
899 for (j = 0; j < toReturn.
cols(); j++)
900 toReturn(i,j) = l(i,j) + r(i,j);
909 template <
class T,
class BaseClass1,
class BaseClass2>
915 MatrixException e(
"Incompatible dimensions for Matrix - Matrix");
921 for (i = 0; i < toReturn.
rows(); i++)
922 for (j = 0; j < toReturn.
cols(); j++)
923 toReturn(i,j) = l(i,j) - r(i,j);
932 template <
class T,
class BaseClass>
937 MatrixException e(
"Zero length vector(s)");
941 for(
size_t i=0; i<v.
size(); i++)
942 for(
size_t j=0; j<w.
size(); j++)
950 template <
class T,
class BaseClass>
955 for(
int i = 0; i < a.rows(); i++)
957 for(
int j = 0; j < a.cols(); j++)
959 T mag = std::abs(a(i,j));
969 template <
class T,
class BaseClass>
977 template <
class T,
class BaseClass>
985 template <
class T,
class BaseClass>
993 template <
class T,
class BaseClass>
1001 template <
class T,
class BaseClass>
1009 template <
class T,
class BaseClass>
1017 template <
class T,
class BaseClass>
1025 template <
class T,
class BaseClass>