45 virtual double&
operator()(
size_t row,
size_t col = 0) = 0;
54 virtual const double&
operator[](
size_t row)
const = 0;
64 virtual const double&
operator()(
size_t row,
size_t col = 0)
const = 0;
92 virtual double det()
const = 0;
93 virtual double norm()
const = 0;
94 virtual double sum()
const = 0;
95 virtual size_t rows()
const = 0;
96 virtual size_t cols()
const = 0;
103 for(
size_t rr=0; rr<
rows(); rr++) {
104 for(
size_t cc=0; cc<
cols(); cc++) {
105 if(rhs(rr,cc) != (*this)(rr,cc))
113 return !(*
this == rhs);
118 template <
int D1,
int D2>
127 for(
size_t ii=0; ii<D1; ii++) {
128 for(
size_t jj=0; jj<D2; jj++) {
129 data[ii][jj] = (ii==jj);
141 for(
size_t ii=0; ii<D1; ii++) {
142 for(
size_t jj=0; jj<D2; jj++) {
157 for(
size_t ii=0; ii<D1; ii++) {
158 for(
size_t jj=0; jj<D2; jj++) {
160 data[ii][jj] = v[kk++];
176 for(
size_t ii=0; ii<D1; ii++) {
177 for(
size_t jj=0; jj<D2; jj++) {
179 data[ii][jj] = v[kk++];
192 Matrix(std::initializer_list<double> v) {
194 for(
size_t ii=0; ii<D1; ii++) {
195 for(
size_t jj=0; jj<D2; jj++) {
214 for(
size_t ii=0; ii<D1; ii++) {
215 for(
size_t jj=0; jj<D2; jj++) {
217 data[ii][jj] = v[kk++];
232 for(
size_t ii=0; ii<D1; ii++) {
233 for(
size_t jj=0; jj<D2; jj++) {
235 data[ii][jj] = v[kk++];
250 for(
size_t ii=0; ii<D1; ii++) {
251 for(
size_t jj=0; jj<D2; jj++) {
253 data[ii][jj] = v[kk++];
267 for(
size_t ii=0; ii<D1; ii++) {
268 for(
size_t jj=0; jj<D2; jj++) {
269 data[ii][jj] = m.data[ii][jj];
297 assert(row < D1 && col < D2);
298 return data[row][col];
324 assert(row < D1 && col < D2);
325 return data[row][col];
356 virtual double det()
const;
357 virtual double norm()
const;
358 virtual double sum()
const;
360 size_t rows()
const {
return D1;};
361 size_t cols()
const {
return D2;};
376 template <
int D1,
int D2>
384 for(
size_t ii=0; ii<D1; ii++) {
386 for(
size_t jj=0; jj<D2; jj++) {
387 ov[ii] += m(ii,jj)*iv[jj];
391 std::cerr <<
"Error, failed dynamic_cast for matrix-vector product"
392 " check the input to mvproduct matrix.h:" << __LINE__ << std::endl;
397 template <
int D1,
int D2>
400 assert(&rhs != &out);
405 for(
size_t ii=0; ii<D1; ii++) {
407 for(
size_t jj=0; jj<D2; jj++) {
408 ov[ii] += m(ii,jj)*iv[jj];
412 std::cerr <<
"Error, failed dynamic_cast for matrix-vector product"
413 " check the input to mvproduct matrix.h:" << __LINE__ << std::endl;
451 template <
int D1,
int D2>
452 std::ostream& operator<<(std::ostream& os, const Matrix<D1,D2>& b)
454 for(
size_t rr=0; rr<b.rows(); rr++) {
456 for(
size_t cc=0; cc<b.cols(); cc++) {
457 os << std::setw(11) << std::setprecision(5) << b(rr,cc);
459 os <<
" ];" << std::endl;
467 for(
size_t rr=0; rr<b.
rows(); rr++) {
469 for(
size_t cc=0; cc<b.
cols(); cc++) {
470 os << std::setw(11) << std::setprecision(5) << b(rr,cc);
472 os <<
" ];" << std::endl;
479 template <
int D1,
int D2>
482 for(
size_t ii=0; ii<D1; ii++) {
483 for(
size_t jj=0; jj<D2; jj++) {
484 lhs(ii,jj) += rhs(ii,jj);
490 template <
int D1,
int D2>
494 for(
size_t ii=0; ii<D1; ii++) {
495 for(
size_t jj=0; jj<D2; jj++) {
496 out(ii,jj) = lhs(ii,jj)+rhs(ii,jj);
502 template <
int D1,
int D2>
506 for(
size_t ii=0; ii<D1; ii++) {
507 for(
size_t jj=0; jj<D2; jj++) {
508 out(ii,jj) = lhs(ii,jj)-rhs(ii,jj);
514 template <
int D1,
int D2>
518 for(
size_t ii=0; ii<D1; ii++) {
519 for(
size_t jj=0; jj<D2; jj++) {
520 out(ii,jj) = -rhs(ii,jj);
526 template <
int D1,
int D2,
int D3>
530 for(
size_t ii=0; ii<D1; ii++) {
531 for(
size_t jj=0; jj<D3; jj++) {
533 for(
size_t kk=0; kk<D2; kk++) {
534 out(ii,jj) += lhs(ii, kk)*rhs(kk, jj);
553 template <
int D1,
int D2>
560 for(
size_t rr=0; rr<D1; rr++) {
561 for(
size_t cc=0; cc<D1; cc++) {
562 out(rr,cc) = tl(rr,cc);
567 for(
size_t rr=0; rr<D1; rr++) {
568 for(
size_t cc=0; cc<D2; cc++) {
569 out(rr,cc+D1) = tr(rr,cc);
574 for(
size_t rr=0; rr<D2; rr++) {
575 for(
size_t cc=0; cc<D1; cc++) {
576 out(rr+D1,cc) = bl(rr,cc);
581 for(
size_t rr=0; rr<D2; rr++) {
582 for(
size_t cc=0; cc<D2; cc++) {
583 out(rr+D1,cc+D1) = br(rr,cc);
590 template <
int D1,
int D2>
596 for(
size_t rr=0; rr<D1; rr++) {
597 for(
size_t cc=0; cc<D1; cc++) {
598 tl(rr,cc) = input(rr,cc);
603 for(
size_t rr=0; rr<D1; rr++) {
604 for(
size_t cc=0; cc<D2; cc++) {
605 tr(rr,cc)= input(rr, cc+D1);
610 for(
size_t rr=0; rr<D2; rr++) {
611 for(
size_t cc=0; cc<D1; cc++) {
612 bl(rr,cc) = input(rr+D1,cc);
617 for(
size_t rr=0; rr<D2; rr++) {
618 for(
size_t cc=0; cc<D2; cc++) {
619 br(rr,cc) = input(rr+D1,cc+D1);
632 return trg(0,0)*trg(1,1) - trg(1,0)*trg(0,1);
646 return (a*e*i + b*f*g + c*d*h) - (c*e*g + b*d*i + a*f*h);
655 Matrix<DIM/2,(DIM+1)/2> B;
656 Matrix<(DIM+1)/2,DIM/2> C;
657 Matrix<(DIM+1)/2,(DIM+1)/2> D;
658 split(trg, A, B, C, D);
661 double a =
det(A)*
det(D-C*AI*B);
665 double b =
det(D)*
det(A-B*DI*C);
667 std::cerr <<
"Determinant failed " << std::endl;
675 template <
int D1,
int D2>
679 throw std::length_error(
"Matrix Passed to Norm Function");
687 for(
size_t ii=0; ii<DIM; ii++)
688 sum += trg[ii]*trg[ii];
696 for(
size_t ii=0; ii<DIM; ii++)
697 sum += trg(0,ii)*trg(0,ii);
701 template <
int D1,
int D2>
704 return npl::norm<D1,D2>(*this);
707 template <
int D1,
int D2>
710 const size_t DIM = D1 < D2 ? D1 : D2;
712 for(
size_t ii=0;ii<DIM; ii++){
713 for(
size_t jj=0;jj<DIM; jj++){
714 tmp(ii,jj) = data[ii][jj];
718 return npl::det<DIM>(tmp);
721 template <
int D1,
int D2>
725 for(
size_t ii=0; ii<D1; ii++) {
726 for(
size_t jj=0; jj<D2; jj++) {
743 double det = trg(0,0)*trg(1,1)-trg(1,0)*trg(0,1);
745 std::cerr <<
"Error non-invertible matrix!" << std::endl;
749 tmp(0,0) = trg(1,1)/
det;
750 tmp(1,1) = trg(0,0)/
det;
751 tmp(1,0) = -trg(1,0)/
det;
752 tmp(0,1) = -trg(0,1)/
det;
762 Matrix<DIM/2,(DIM+1)/2> B;
763 Matrix<(DIM+1)/2,DIM/2> C;
764 Matrix<(DIM+1)/2,(DIM+1)/2> D;
765 split(trg, A, B, C, D);
768 auto betaI =
inverse(D-C*AI*B);
770 auto tl = AI + AI*B*betaI*C*AI;
771 auto tr = -AI*B*betaI;
772 auto bl = -betaI*C*AI;
775 auto ret =
join(tl, tr, bl, br);
const double & operator()(size_t row, size_t col=0) const
Returns value at given row/column.
virtual double norm() const
Matrix(const std::vector< int64_t > &v)
Initialize matrix with vector, any missing values will be assumed zero, extra values are ignored...
virtual double & operator[](size_t row)=0
Returns row in column 0.
double norm(const Matrix< D1, D2 > &trg)
Matrix< D1+D2, D1+D2 > join(const Matrix< D1, D1 > &tl, const Matrix< D1, D2 > &tr, const Matrix< D2, D1 > &bl, const Matrix< D2, D2 > &br)
Join together 4 matrices from a blockwise decomposition.
Matrix(const std::vector< double > &v)
Initialize matrix with vector, any missing values will be assumed zero, extra values are ignored...
virtual size_t cols() const =0
virtual double sum() const =0
Matrix< D1, D2 > operator+(const Matrix< D1, D2 > &lhs, const Matrix< D1, D2 > &rhs)
double & operator()(size_t row, size_t col=0)
Returns value at given row/column.
const double & operator[](size_t row) const
Returns row in column 0.
Matrix(double v)
Constructor, sets the entire matrix to the given constant.
virtual void mvproduct(const MatrixP *rhs, MatrixP *out) const =0
Performs matrix-vector product of right hand side (rhs) and the current matrix, writing the result in...
virtual double & operator()(size_t row, size_t col=0)=0
Returns value at given row/column.
virtual size_t rows() const =0
std::ostream & operator<<(std::ostream &os, const Matrix< D1, D2 > &b)
double & operator[](size_t row)
Returns row in column 0.
virtual double sum() const
virtual double det() const
double det(const Matrix< 1, 1 > &trg)
Matrix< D1, D3 > operator*(const Matrix< D1, D2 > &lhs, const Matrix< D2, D3 > &rhs)
bool operator!=(const MatrixP &rhs)
virtual double norm() const =0
Matrix(size_t l, const int64_t *v)
Initialize a matrix from array of length l, made up of an array at v*. Missing values are assumed to ...
Matrix(std::initializer_list< double > v)
Initialize matrix with vector, any missing values will be assumed zero, extra values are ignored...
Matrix(size_t l, const double *v)
Initialize a matrix from array of length l, made up of an array at v*. Missing values are assumed to ...
void mvproduct(const MatrixP *rhs, MatrixP *out) const
Performs matrix-vector product of right hand side (rhs) and the current matrix, writing the result in...
Matrix(const Matrix &m)
Copy constructor, copies all the elements of the other vector.
Matrix(const std::vector< size_t > &v)
Initialize matrix with vector, any missing values will be assumed zero, extra values are ignored...
virtual double det() const =0
bool operator==(const MatrixP &rhs)
Matrix< 1, 1 > inverse(const Matrix< 1, 1 > &trg)
Matrix< D1, D2 > operator+=(Matrix< D1, D2 > &lhs, const Matrix< D1, D2 > &rhs)
void split(const Matrix< D1+D2, D1+D2 > &input, Matrix< D1, D1 > &tl, Matrix< D1, D2 > &tr, Matrix< D2, D1 > &bl, Matrix< D2, D2 > &br)
Matrix< D1, D2 > operator-(const Matrix< D1, D2 > &lhs, const Matrix< D1, D2 > &rhs)
Matrix()
Default constructor, sets the matrix to the identity matrix.