#pragma once #include //uint64_t #include // std::abs #include "utils/vector.h" #include "utils/matrix.h" #include "numerics/mean.h" namespace numerics::detail{ template inline T standard_deviation_serial(const utils::Vector& v) { const uint64_t n = v.size(); if (n == 0){ throw std::runtime_error("std_serial: empty vector"); } const T mean_value = numerics::mean(v); T sum_squared_diff = T{0}; for (uint64_t i = 0; i < n; ++i){ const T diff = v[i] - mean_value; sum_squared_diff += diff * diff; } const T variance = sum_squared_diff / static_cast(n); return numerics::sqrt(variance); } template inline T standard_deviation_serial(const utils::Matrix& A) { const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); const T mean_value = numerics::mean(A); T sum_squared_diff = T{0}; for (uint64_t i = 0; i < rows; ++i){ for (uint64_t j = 0; j < cols; ++j){ const T diff = A(i,j) - mean_value; sum_squared_diff += diff * diff; } } const T variance = sum_squared_diff / static_cast(rows*cols); return numerics::sqrt(variance); } } // namespace numerics