44 #ifndef GNSSTK_MATRIX_BASE_HPP
45 #define GNSSTK_MATRIX_BASE_HPP
64 template <
class T,
class BaseClass>
76 {
return static_cast<const BaseClass*
>(
this)->
size(); }
79 {
return static_cast<const BaseClass*
>(
this)->
cols(); }
82 {
return static_cast<const BaseClass*
>(
this)->
rows(); }
97 for (i = 1; i <
rows(); i++)
98 for (j = 0; j < i; j++)
99 if ((*
this)(i,j) != T(0))
109 for (i = 0; i <
rows(); i++)
110 for (j = i+1; j <
cols(); j++)
111 if ((*
this)(i,j) != T(0))
122 for (i = 0; i <
rows(); i++)
123 for (j = 0; j <
cols(); j++)
125 if ((*
this)(i,j) != T(0))
136 for (i = 0; i <
rows(); i++)
137 for (j = i + 1; j <
cols(); j++)
138 if ((*
this)(i,j) != (*
this)(j,i))
151 MatrixException e(
"Invalid ConstMatrixBase index for colCopy");
157 for (i = r; i <
rows(); i++)
158 toReturn(i - r) = (*this)(i, c);
170 MatrixException e(
"Invalid ConstMatrixBase index for rowCopy");
176 for (i = c; i <
cols(); i++)
177 toReturn(i - c) = (*this)(r, i);
190 toReturn(i) = (*this)(i,i);
200 const BaseClass& b =
static_cast<const BaseClass&
>(*this);
202 if ((i >= b.rows()) || (j > b.cols()))
204 MatrixException e(
"Invalid ConstMatrixBase index for ref");
216 template <
class T,
class BaseClass>
228 {
return static_cast<BaseClass*
>(
this)->
operator()(i,j); }
232 {
return static_cast<const BaseClass*
>(
this)->
size(); }
235 {
return static_cast<const BaseClass*
>(
this)->
cols(); }
238 {
return static_cast<const BaseClass*
>(
this)->
rows(); }
243 BaseClass& me =
static_cast<BaseClass&
>(*this);
245 for (i=0; i < me.rows(); i++)
246 for (j=0; j < me.cols(); j++)
255 BaseClass& me =
static_cast<BaseClass&
>(*this);
257 for (j=0; j < me.cols(); j++)
266 BaseClass& me =
static_cast<BaseClass&
>(*this);
268 for (i=0; i < me.rows(); i++)
291 BaseClass& me =
static_cast<BaseClass&
>(*this);
293 if(x.
rows() != me.rows() || x.
cols() != me.cols()) {
294 MatrixException e(
"Invalid dimensions for Matrix assignFrom(Matrix)");
299 for (i=0; i < me.rows(); i++)
300 for (j=0; j < me.cols(); j++)
311 BaseClass& me =
static_cast<BaseClass&
>(*this);
313 if(x.
size() != me.rows() * me.cols()) {
314 MatrixException e(
"Invalid dimensions for Matrix assignFrom(Vector)");
319 for (i=0; i < me.rows(); i++)
320 for (j=0; j < me.cols(); j++)
321 me(i,j) = x[i*me.cols()+j];
331 BaseClass& me =
static_cast<BaseClass&
>(*this);
333 if(x.size() != me.rows() * me.cols()) {
334 MatrixException e(
"Invalid dimensions for Matrix assignFrom(valarray)");
339 for (i=0; i < me.rows(); i++)
340 for (j=0; j < me.cols(); j++)
341 me(i,j) = x[i*me.cols()+j];
349 BaseClass& me =
static_cast<BaseClass&
>(*this);
351 for (i=0; i < me.rows(); i++)
352 for (j=0; j < me.cols(); j++)
353 me(i,j) = x[i*me.cols()+j];
360 BaseClass& me =
static_cast<BaseClass&
>(*this);
362 for (i=0; i < me.rows(); i++)
363 for (j=0; j < me.cols(); j++)
376 BaseClass& me =
static_cast<BaseClass&
>(*this);
378 if(x.
rows() != me.rows() || x.
cols() != me.cols()) {
379 MatrixException e(
"Invalid dimensions for Matrix operator+=(Matrix)");
384 for (i=0; i < me.rows(); i++)
385 for (j=0; j < me.cols(); j++)
396 BaseClass& me =
static_cast<BaseClass&
>(*this);
398 if(x.
size() != me.rows() * me.cols()) {
399 MatrixException e(
"Invalid dimensions for Matrix operator+=(Vector)");
404 for (i=0; i < me.rows(); i++)
405 for (j=0; j < me.cols(); j++)
406 me(i,j) += x[i*me.cols()+j];
416 BaseClass& me =
static_cast<BaseClass&
>(*this);
418 if(x.size() != me.rows() * me.cols()) {
419 MatrixException e(
"Invalid dimensions for Matrix operator+=(valarray)");
424 for (i=0; i < me.rows(); i++)
425 for (j=0; j < me.cols(); j++)
426 me(i,j) += x[i*me.cols()+j];
434 BaseClass& me =
static_cast<BaseClass&
>(*this);
436 for (i=0; i < me.rows(); i++)
437 for (j=0; j < me.cols(); j++)
438 me(i,j) += x[i*me.cols()+j];
445 BaseClass& me =
static_cast<BaseClass&
>(*this);
447 for (i=0; i < me.rows(); i++)
448 for (j=0; j < me.cols(); j++)
462 BaseClass& me =
static_cast<BaseClass&
>(*this);
464 if(x.
rows() != me.rows() || x.
cols() != me.cols()) {
465 MatrixException e(
"Invalid dimensions for Matrix operator-=(Matrix)");
470 for (i=0; i < me.rows(); i++)
471 for (j=0; j < me.cols(); j++)
482 BaseClass& me =
static_cast<BaseClass&
>(*this);
484 if(x.
size() != me.rows() * me.cols()) {
485 MatrixException e(
"Invalid dimensions for Matrix operator-=(Vector)");
490 for (i=0; i < me.rows(); i++)
491 for (j=0; j < me.cols(); j++)
492 me(i,j) -= x[i*me.cols()+j];
502 BaseClass& me =
static_cast<BaseClass&
>(*this);
504 if(x.size() != me.rows() * me.cols()) {
505 MatrixException e(
"Invalid dimensions for Matrix operator-=(valarray)");
510 for (i=0; i < me.rows(); i++)
511 for (j=0; j < me.cols(); j++)
512 me(i,j) -= x[i*me.cols()+j];
520 BaseClass& me =
static_cast<BaseClass&
>(*this);
522 for (i=0; i < me.rows(); i++)
523 for (j=0; j < me.cols(); j++)
524 me(i,j) -= x[i*me.cols()+j];
531 BaseClass& me =
static_cast<BaseClass&
>(*this);
533 for (i=0; i < me.rows(); i++)
534 for (j=0; j < me.cols(); j++)
544 BaseClass& me =
static_cast<BaseClass&
>(*this);
546 for (i=0; i < me.rows(); i++)
547 for (j=0; j < me.cols(); j++)
556 BaseClass& me =
static_cast<BaseClass&
>(*this);
558 for (i=0; i < me.rows(); i++)
559 for (j=0; j < me.cols(); j++)
568 BaseClass me =
static_cast<BaseClass
>(*this);
570 for (i=0; i < me.rows(); i++)
571 for (j=0; j < me.cols(); j++)
581 BaseClass& me =
static_cast<BaseClass&
>(*this);
583 if ( (row1 >= me.rows()) || (row2 >= me.rows()) )
585 MatrixException e(
"Invalid rows for swapRows");
591 for (i = 0; i < me.cols(); i++)
594 me(row1,i) = me(row2,i);
605 BaseClass& me =
static_cast<BaseClass&
>(*this);
607 if ( (col1 >= me.cols()) || (col2 >= me.cols()) )
609 MatrixException e(
"Invalid columns for swapCols");
615 for (i = 0; i < me.rows(); i++)
618 me(i, col1) = me(i, col2);
628 template <
class T,
class BaseClass>
633 {
return static_cast<const BaseClass*
>(
this)->
rowSize(); }
636 {
return static_cast<const BaseClass*
>(
this)->
rowStart(); }
639 {
return static_cast<const BaseClass*
>(
this)->
rowStride(); }
642 {
return static_cast<const BaseClass*
>(
this)->
colSize(); }
645 {
return static_cast<const BaseClass*
>(
this)->
colStart(); }
648 {
return static_cast<const BaseClass*
>(
this)->
colStride(); }
655 size_t sourceColSize)
const
660 if ( (
rowStart() >= sourceRowSize) ||
663 MatrixException e(
"Invalid row range for slice");
669 if ( (
colStart() >= sourceColSize) ||
672 MatrixException e(
"Invalid col range for slice");
681 template <
class T,
class BaseClass>
690 template <
class T,
class BaseClass>