// L============================================================================= // L This software is distributed under the MIT license. // L Copyright 2021 Péter Kardos // L============================================================================= #pragma once #include "MatrixImpl.hpp" namespace mathter { //------------------------------------------------------------------------------ // Matrix-vector arithmetic //------------------------------------------------------------------------------ // v*M template auto operator*(const Vector& vec, const Matrix& mat) { using Rt = traits::MatMulElemT; Vector result; result = vec(0) * mat.stripes[0]; for (int i = 1; i < Vd; ++i) { result += vec(i) * mat.stripes[i]; } return result; } template auto operator*(const Vector& vec, const Matrix& mat) { using Rt = traits::MatMulElemT; Vector result; for (int i = 0; i < Mcol; ++i) { result(i) = Dot(vec, mat.stripes[i]); } return result; } // (v|1)*M template auto operator*(const Vector& vec, const Matrix& mat) { return (vec | Vt(1)) * mat; } template auto operator*(const Vector& vec, const Matrix& mat) { using Rt = traits::MatMulElemT; auto res = (vec | Vt(1)) * mat; res /= res(res.Dimension() - 1); return Vector(res); } // M*v template auto operator*(const Matrix& mat, const Vector& vec) { using Rt = traits::MatMulElemT; Vector result; for (int i = 0; i < Mrow; ++i) { result(i) = Dot(vec, mat.stripes[i]); } return result; } template auto operator*(const Matrix& mat, const Vector& vec) { using Rt = traits::MatMulElemT; Vector result; result = vec(0) * mat.stripes[0]; for (int i = 1; i < Vd; ++i) { result += vec(i) * mat.stripes[i]; } return result; } // M*(v|1) template auto operator*(const Matrix& mat, const Vector& vec) { return mat * (vec | Vt(1)); } template auto operator*(const Matrix& mat, const Vector& vec) { using Rt = traits::MatMulElemT; auto res = mat * (vec | Vt(1)); res /= res(res.Dimension() - 1); return (Vector)res; } // v*=M template Vector& operator*=(Vector& vec, const Matrix& mat) { vec = vec * mat; return vec; } template Vector& operator*=(Vector& vec, const Matrix& mat) { vec = vec * mat; return vec; } template Vector& operator*=(Vector& vec, const Matrix& mat) { vec = vec * mat; return vec; } } // namespace mathter