#pragma once #include #include namespace MbD { template class SparseVector : public std::map { public: size_t n; SparseVector() {} SparseVector(size_t n) : std::map(), n(n) {} SparseVector(std::initializer_list> list) : std::map{ list } {} SparseVector(std::initializer_list> list) { for (auto& pair : list) { size_t i = 0; size_t index; T value; for (auto& element : pair) { if (i == 0) index = (size_t)std::round(element); ; if (i == 1) value = element; i++; } this->insert(std::pair(index, value)); } } void atiminusNumber(size_t i, double value); double rootMeanSquare(); size_t numberOfElements(); double sumOfSquares(); void atiplusNumber(size_t i, double value); void zeroSelf(); double maxElement(); }; template<> inline void SparseVector::atiminusNumber(size_t i, double value) { //auto val = this->at(i); auto val = (*this)[i]; this->at(i) = val - value; } template inline double SparseVector::rootMeanSquare() { return std::sqrt(this->sumOfSquares() / this->numberOfElements()); } template inline size_t 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::atiplusNumber(size_t i, double value) { this->at(i) += value; } template<> inline void SparseVector::zeroSelf() { this->clear(); } template<> inline double SparseVector::maxElement() { 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; } }