#pragma once #include "./core/omp_config.h" #include "./utils/matrix.h" #include "./utils/vector.h" namespace numerics{ template utils::Vector matdot_row(const utils::Matrix& A, const utils::Matrix& B){ if (A.rows() != B.rows() || A.cols() != B.cols()){ throw std::runtime_error("matmul: dimension mismatch"); } const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); utils::Vector c(rows, T{0}); for (uint64_t i = 0; i < rows; ++i){ T sum = T{0}; for (uint64_t j = 0; j < cols; ++j){ sum += A(i,j) * A(i,j); } c[i] = sum; } return c; } template utils::Vector matdot_col(const utils::Matrix& A, const utils::Matrix& B){ if (A.rows() != B.rows() || A.cols() != B.cols()){ throw std::runtime_error("matmul: dimension mismatch"); } const uint64_t rows = A.rows(); const uint64_t cols = A.cols(); utils::Vector c(cols, T{0}); for (uint64_t j = 0; j < cols; ++j){ T sum = T{0}; for (uint64_t i = 0; i < rows; ++i){ sum += A(i,j) * A(i,j); } c[j] = sum; } return c; } } // namespace numerics