#pragma once #include //uint64_t #include // std::runtime_error #include "../utils/vector.h" #include "../utils/matrix.h" namespace numerics::detail{ // ---------------- Matrix * Matrix ---------------- template inline utils::Matrix matmul_serial(const utils::Matrix& A, const utils::Matrix& B){ const uint64_t m = A.rows(); const uint64_t n = A.cols(); // also B.rows() const uint64_t p = B.cols(); if(n != B.rows()){ throw std::runtime_error("matmul: dimension mismatch"); } T tmp; utils::Matrix C(m, p, T{0}); for (uint64_t i = 0; i < m; ++i){ for (uint64_t j = 0; j < n; ++j){ tmp = A(i,j); for (uint64_t k = 0; k < p; ++k){ C(i,k) += tmp * B(j,k); } } } return C; } } // namespace numerics