//----------------------------------------------------------------------------- // matrix.h //----------------------------------------------------------------------------- #include #include #include #include #include #include //----------------------------------------------------------------------------- // std::array op T //----------------------------------------------------------------------------- template std::array operator+(const std::array& a, const T& b) { std::array a2; for (std::size_t i = 0; i < a2.size(); ++i) a2[i] = a[i] + b; return std::move(a2); } template std::array operator-(const std::array& a, const T& b) { auto a2 = a; for (std::size_t i = 0; i < a2.size(); ++i) a2[i] -= b; return std::move(a2); } template std::array operator*(const std::array& a, const T& b) { std::array a2; for (std::size_t i = 0; i < a2.size(); ++i) a2[i] = a[i] * b; return std::move(a2); } //----------------------------------------------------------------------------- // std::array //----------------------------------------------------------------------------- template T operator*(const std::array& a, const std::array& b) { return std::inner_product(a.begin(), a.end(), b.begin(), T(0)); } template std::ostream& operator<<(std::ostream& os, const std::array& a) { os << '<'; std::for_each(a.begin(), a.end(), [&](const T& t){ os << t << ' '; }); return os << '>'; } //----------------------------------------------------------------------------- // matrix //----------------------------------------------------------------------------- template using matrix = std::array, R>; template matrix operator+(const matrix& m1, const matrix& m2) { matrix tmp = m1; for (size_t i = 0; i < R; ++i) for (size_t j = 0; j < C; ++j) tmp[i][j] += m2[i][j]; return std::move(tmp); } template matrix operator-(const matrix& m1, const matrix& m2) { matrix tmp = m1; for (size_t i = 0; i < R; ++i) for (size_t j = 0; j < C; ++j) tmp[i][j] -= m2[i][j]; return std::move(tmp); } template matrix operator*(const matrix& m1, const matrix& m2) { matrix tmp = {0}; for (size_t i = 0; i < R; ++i) for (size_t k = 0; k < N; ++k) for (size_t j = 0; j < C; ++j) tmp[i][j] += m1[i][k] * m2[k][j]; return std::move(tmp); } //----------------------------------------------------------------------------- // array op matrix //----------------------------------------------------------------------------- template std::array operator*(const matrix& m, const std::array& a) { std::array tmp = {0}; for (size_t i = 0; i < R; ++i) for (size_t j = 0; j < C; ++j) tmp[i] += m[i][j] * a[j]; return std::move(tmp); } template std::array operator*(const std::array& a, const matrix& m) { std::array tmp = {0}; for (size_t k = 0; k < R; ++k) for (size_t j = 0; j < C; ++j) tmp[j] += a[k] * m[k][j]; return std::move(tmp); } //-----------------------------------------------------------------------------