#pragma once #include "Array.h" #include "FullColumn.h" #include "FullMatrix.h" namespace MbD { template class DiagonalMatrix : public Array { // public: DiagonalMatrix(int count) : Array(count) {} DiagonalMatrix(int count, const T& value) : Array(count, value) {} DiagonalMatrix(std::initializer_list list) : Array{ list } {} void atiputDiagonalMatrix(int i, std::shared_ptr < DiagonalMatrix> diagMat); std::shared_ptr> times(T factor); std::shared_ptr> timesFullColumn(std::shared_ptr> fullCol); std::shared_ptr> timesFullMatrix(std::shared_ptr> fullMat); int nrow() { return (int) this->size(); } int ncol() { return (int) this->size(); } double sumOfSquares() override; int numberOfElements() override; void zeroSelf() override; }; template inline void DiagonalMatrix::atiputDiagonalMatrix(int i, std::shared_ptr> diagMat) { for (int ii = 0; ii < diagMat->size(); ii++) { this->at(i + ii) = diagMat->at(ii); } } template inline std::shared_ptr> DiagonalMatrix::times(T factor) { auto nrow = (int)this->size(); auto answer = std::make_shared>(nrow); for (int i = 0; i < nrow; i++) { answer->at(i) = this->at(i) * factor; } return answer; } template inline std::shared_ptr> DiagonalMatrix::timesFullColumn(std::shared_ptr> fullCol) { //"a*b = a(i,j)b(j) sum j." auto nrow = (int) this->size(); auto answer = std::make_shared>(nrow); for (int i = 0; i < nrow; i++) { answer->at(i) = this->at(i) * fullCol->at(i); } return answer; } template inline std::shared_ptr> DiagonalMatrix::timesFullMatrix(std::shared_ptr> fullMat) { auto nrow = (int)this->size(); auto answer = std::make_shared>(nrow); for (int i = 0; i < nrow; i++) { answer->at(i) = fullMat->at(i)->times(this->at(i)); } return answer; } template<> inline double DiagonalMatrix::sumOfSquares() { double sum = 0.0; for (int i = 0; i < this->size(); i++) { double element = this->at(i); sum += element * element; } return sum; } template inline int DiagonalMatrix::numberOfElements() { auto n = (int) this->size(); return n * n; } template<> inline void DiagonalMatrix::zeroSelf() { for (int i = 0; i < this->size(); i++) { this->at(i) = 0.0; } } }