#pragma once #include #include "RowTypeMatrix.h" #include "SparseRow.h" #include "DiagonalMatrix.h" namespace MbD { template class SparseMatrix : public RowTypeMatrix>> { public: SparseMatrix(int m) : RowTypeMatrix>>(m) { } SparseMatrix(int m, int n) { for (int i = 0; i < m; i++) { auto row = std::make_shared>(n); this->push_back(row); } } SparseMatrix(std::initializer_list>> list2D) { for (auto& rowList : list2D) { auto row = std::make_shared>(rowList); this->push_back(row); } } void atijminusDiagonalMatrix(int i, int j, std::shared_ptr> diagMat); double sumOfSquares() override; void zeroSelf() override; void atijplusFullRow(int i, int j, std::shared_ptr> fullRow); void atijplusFullColumn(int i, int j, std::shared_ptr> fullCol); void atijplusFullMatrix(int i, int j, std::shared_ptr> fullMat); void atijplusTransposeFullMatrix(int i, int j, std::shared_ptr> fullMat); void atijplusFullMatrixtimes(int i, int j, std::shared_ptr> fullMat, T factor); virtual std::ostream& printOn(std::ostream& s) const; friend std::ostream& operator<<(std::ostream& s, const SparseMatrix& spMat) { return spMat.printOn(s); } }; using SpMatDsptr = std::shared_ptr>; template<> inline void SparseMatrix::atijminusDiagonalMatrix(int i1, int j1, std::shared_ptr> diagMat) { auto n = diagMat->nrow(); for (int ii = 0; ii < n; ii++) { (*(this->at(i1 + ii)))[j1 + ii] -= diagMat->at(ii); } } template inline double SparseMatrix::sumOfSquares() { double sum = 0.0; for (int i = 0; i < this->size(); i++) { sum += this->at(i)->sumOfSquares(); } return sum; } template<> inline void SparseMatrix::zeroSelf() { for (int i = 0; i < this->size(); i++) { this->at(i)->zeroSelf(); } } template inline void SparseMatrix::atijplusFullRow(int i, int j, std::shared_ptr> fullRow) { this->at(i)->atiplusFullRow(j, fullRow); } template inline void SparseMatrix::atijplusFullColumn(int i, int j, std::shared_ptr> fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { (*(this->at(i + ii)))[j] += fullCol->at(ii); } } template inline void SparseMatrix::atijplusFullMatrix(int i, int j, std::shared_ptr> fullMat) { for (int ii = 0; ii < fullMat->nrow(); ii++) { this->at(i + ii)->atiplusFullRow(j, fullMat->at(ii)); } } template inline void SparseMatrix::atijplusTransposeFullMatrix(int i, int j, std::shared_ptr> fullMat) { for (int ii = 0; ii < fullMat->nrow(); ii++) { this->atijplusFullColumn(i, j + ii, fullMat->at(ii)->transpose()); } } template inline void SparseMatrix::atijplusFullMatrixtimes(int i, int j, std::shared_ptr> fullMat, T factor) { for (int ii = 0; ii < fullMat->nrow(); ii++) { this->at(i + ii)->atiplusFullRowtimes(j, fullMat->at(ii), factor); } } template inline std::ostream& SparseMatrix::printOn(std::ostream& s) const { s << "SpMat[" << std::endl; for (int i = 0; i < this->size(); i++) { s << *(this->at(i)) << std::endl; } s << "]" << std::endl; return s; } }