#pragma once #include #include #include namespace MbD { template class SparseVector : public std::map { public: int n; SparseVector() {} SparseVector(int n) : std::map(), n(n) {} SparseVector(std::initializer_list> list) : std::map{ list } {} SparseVector(std::initializer_list> list) { for (auto& pair : list) { int i = 0; int index; T value; for (auto& element : pair) { if (i == 0) index = (int)std::round(element); ; if (i == 1) value = element; i++; } this->insert(std::pair(index, value)); } } double rootMeanSquare(); int numberOfElements(); double sumOfSquares(); void atiput(int i, T value); void atiplusNumber(int i, double value); void atiminusNumber(int i, double value); void zeroSelf(); double maxMagnitude(); virtual std::ostream& printOn(std::ostream& s) const; friend std::ostream& operator<<(std::ostream& s, const SparseVector& spVec) { return spVec.printOn(s); } }; template inline double SparseVector::rootMeanSquare() { return std::sqrt(this->sumOfSquares() / this->numberOfElements()); } template inline int SparseVector::numberOfElements() { return n; } template inline double SparseVector::sumOfSquares() { double sum = 0.0; for (auto const& keyValue : *this) { sum += keyValue.second * keyValue.second; } return sum; } template inline void SparseVector::atiput(int i, T value) { (*this)[i] = value; } template<> inline void SparseVector::atiplusNumber(int i, double value) { (*this)[i] += value; } template inline void SparseVector::atiminusNumber(int i, double value) { (*this)[i] -= value; } template<> inline void SparseVector::zeroSelf() { this->clear(); } template inline double SparseVector::maxMagnitude() { double max = 0.0; for (const auto& keyValue : *this) { auto val = keyValue.second; if (val < 0.0) val = -val; if (max < val) max = val; } return max; } template inline std::ostream& SparseVector::printOn(std::ostream& s) const { s << "{"; auto index = 0; for (const auto& keyValue : *this) { if (index > 0) s << ", "; s << keyValue.first; s << "->"; s << keyValue.second; index++; } s << "}"; return s; } }