#pragma once #include #include #include "FullVector.h" //#include "FullRow.h" namespace MbD { template class FullRow; template class FullColumn : public FullVector { public: FullColumn(std::vector vec) : FullVector(vec) {} FullColumn(int count) : FullVector(count) {} FullColumn(int count, const T& value) : FullVector(count, value) {} FullColumn(std::vector::iterator begin, std::vector::iterator end) : FullVector(begin, end) {} FullColumn(std::initializer_list list) : FullVector{ list } {} std::shared_ptr> plusFullColumn(std::shared_ptr> fullCol); std::shared_ptr> minusFullColumn(std::shared_ptr> fullCol); std::shared_ptr> times(double a); std::shared_ptr> negated(); void atiputFullColumn(int i, std::shared_ptr> fullCol); void atiplusFullColumn(int i, std::shared_ptr> fullCol); void equalSelfPlusFullColumnAt(std::shared_ptr> fullCol, int i); void atiminusFullColumn(int i, std::shared_ptr> fullCol); void equalFullColumnAt(std::shared_ptr> fullCol, int i); std::shared_ptr> copy(); std::shared_ptr> transpose(); void atiplusFullColumntimes(int i, std::shared_ptr> fullCol, T factor); T transposeTimesFullColumn(const std::shared_ptr> fullCol); virtual std::ostream& printOn(std::ostream& s) const; friend std::ostream& operator<<(std::ostream& s, const FullColumn& fullCol) { return fullCol.printOn(s); } }; using FColDsptr = std::shared_ptr>; template inline std::shared_ptr> FullColumn::plusFullColumn(std::shared_ptr> fullCol) { int n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) + fullCol->at(i); } return answer; } template inline std::shared_ptr> FullColumn::minusFullColumn(std::shared_ptr> fullCol) { int n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) - fullCol->at(i); } return answer; } template inline std::shared_ptr> FullColumn::times(double a) { int n = (int) this->size(); auto answer = std::make_shared(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i) * a; } return answer; } template inline std::shared_ptr> FullColumn::negated() { return this->times(-1.0); } template inline void FullColumn::atiputFullColumn(int i, std::shared_ptr> fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { this->at(i + ii) = fullCol->at(ii); } } template inline void FullColumn::atiplusFullColumn(int i, std::shared_ptr> fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { this->at(i + ii) += fullCol->at(ii); } } template inline void FullColumn::equalSelfPlusFullColumnAt(std::shared_ptr> fullCol, int ii) { //self is subcolumn of fullCol for (int i = 0; i < this->size(); i++) { this->at(i) += fullCol->at(ii + i); } } template inline void FullColumn::atiminusFullColumn(int i1, std::shared_ptr> fullCol) { for (int ii = 0; ii < fullCol->size(); ii++) { int i = i1 + ii; this->at(i) -= fullCol->at(ii); } } template inline void FullColumn::equalFullColumnAt(std::shared_ptr> fullCol, int i) { this->equalArrayAt(fullCol, i); //for (int ii = 0; ii < this->size(); ii++) //{ // this->at(ii) = fullCol->at(i + ii); //} } template<> inline std::shared_ptr> FullColumn::copy() { auto n = (int) this->size(); auto answer = std::make_shared>(n); for (int i = 0; i < n; i++) { answer->at(i) = this->at(i); } return answer; } template inline std::shared_ptr> FullColumn::transpose() { return std::make_shared>(*this); } template inline void FullColumn::atiplusFullColumntimes(int i1, std::shared_ptr> fullCol, T factor) { for (int ii = 0; ii < fullCol->size(); ii++) { int i = i1 + ii; this->at(i) += fullCol->at(ii) * factor; } } template inline T FullColumn::transposeTimesFullColumn(const std::shared_ptr> fullCol) { return this->dot(fullCol); } template inline std::ostream& FullColumn::printOn(std::ostream& s) const { s << "{"; s << this->at(0); for (int i = 1; i < this->size(); i++) { s << ", " << this->at(i); } s << "}"; return s; } }