#pragma once #include //uint64_t //#include // std::runtime_error #include "utils/vector.h" #include "utils/matrix.h" #include "sum_serial.h" namespace numerics::detail{ // ---------------- Matrix -> Scalar ---------------- template T mean_serial(const utils::Matrix& A) { const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); T sum = detail::sum_serial(A); sum /= static_cast(rows*cols); return sum; } // ---------------- Vector -> Scalar ---------------- template T mean_serial(const utils::Vector& v) { const uint64_t N = v.size(); T sum = detail::sum_serial(v); sum /= static_cast(N); return sum; } // ---------------- Matrix -> Vector ---------------- template utils::Vector mean_rowwise_serial(const utils::Matrix& A) { const T cols = static_cast(A.cols()); utils::Vector sum = detail::sum_rowwise_serial(A); const uint64_t N = sum.size(); for (uint64_t i = 0; i < N; ++i){ sum[i] /= cols; } return sum; } template utils::Vector mean_colwise_serial(const utils::Matrix& A) { const T rows = static_cast(A.rows()); utils::Vector sum = detail::sum_colwise_serial(A); const uint64_t N = sum.size(); for (uint64_t i = 0; i < N; ++i){ sum[i] /= rows; } return sum; } } // namespace numerics