12 #define MATHTER_VECMAT_ARRAY_1 result = vec(0) * mat.stripes[0]; 13 #define MATHTER_VECMAT_ARRAY_2 MATHTER_VECMAT_ARRAY_1 result += vec(1) * mat.stripes[1]; 14 #define MATHTER_VECMAT_ARRAY_3 MATHTER_VECMAT_ARRAY_2 result += vec(2) * mat.stripes[2]; 15 #define MATHTER_VECMAT_ARRAY_4 MATHTER_VECMAT_ARRAY_3 result += vec(3) * mat.stripes[3]; 16 #define MATHTER_VECMAT_UNROLL(S) \ 17 if (result.Dimension() == S) { \ 18 MATHTER_MATMUL_EXPAND(MATHTER_VECMAT_ARRAY_##S) \ 22 #define MATHTER_VECMAT_DOT_ARRAY_1 result(0) = Dot(vec, mat.stripes[0]); 23 #define MATHTER_VECMAT_DOT_ARRAY_2 MATHTER_VECMAT_DOT_ARRAY_1 result(1) = Dot(vec, mat.stripes[1]); 24 #define MATHTER_VECMAT_DOT_ARRAY_3 MATHTER_VECMAT_DOT_ARRAY_2 result(2) = Dot(vec, mat.stripes[2]); 25 #define MATHTER_VECMAT_DOT_ARRAY_4 MATHTER_VECMAT_DOT_ARRAY_3 result(3) = Dot(vec, mat.stripes[3]); 26 #define MATHTER_VECMAT_DOT_UNROLL(S) \ 27 if (result.Dimension() == S) { \ 28 MATHTER_MATMUL_EXPAND(MATHTER_VECMAT_DOT_ARRAY_##S) \ 34 template <
class Vt,
class Mt,
int Vd,
int Mcol, eMatrixOrder Morder,
bool Packed,
class Rt>
35 inline Vector<Rt, Mcol, Packed> operator*(
const Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd, Mcol, Morder, eMatrixLayout::ROW_MAJOR, Packed>& mat) {
43 result = vec(0) * mat.
stripes[0];
44 for (
int i = 1; i < Vd; ++i) {
45 result += vec(i) * mat.
stripes[i];
50 template <
class Vt,
class Mt,
int Vd,
int Mcol, eMatrixOrder Morder,
bool Packed,
class Rt>
51 inline Vector<Rt, Mcol, Packed> operator*(
const Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd, Mcol, Morder, eMatrixLayout::COLUMN_MAJOR, Packed>& mat) {
59 for (
int i = 0; i < Vd; ++i) {
65 template <
class Vt,
class Mt,
int Vd,
int Mcol, eMatrixOrder Morder, eMatrixLayout Mlayout,
bool Packed>
66 inline Vector<traits::MatMulElemT<Vt, Mt>, Mcol, Packed>
operator*(
const Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd, Mcol, Morder, Mlayout, Packed>& mat) {
68 return operator*<Vt, Mt, Vd, Mcol, Morder, Packed, Rt>(vec, mat);
73 template <
class Vt,
class Mt,
int Vd, eMatrixLayout Mlayout, eMatrixOrder Morder,
bool Packed,
class Rt = traits::MatMulElemT<Vt, Mt>>
74 Vector<Rt, Vd, Packed> operator*(
const Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd + 1, Vd, Morder, Mlayout, Packed>& mat) {
75 return (vec | Vt(1)) * mat;
78 template <
class Vt,
class Mt,
int Vd, eMatrixLayout Mlayout, eMatrixOrder Morder,
bool Packed,
class Rt = traits::MatMulElemT<Vt, Mt>>
79 Vector<Rt, Vd, Packed> operator*(
const Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd + 1, Vd + 1, Morder, Mlayout, Packed>& mat) {
80 auto res = (vec | Vt(1)) * mat;
81 res /= res(res.Dimension() - 1);
86 template <
class Vt,
class Mt,
int Vd,
int Mrow, eMatrixOrder Morder,
bool Packed,
class Rt>
87 inline Vector<Rt, Mrow, Packed> operator*(
const Matrix<Mt, Mrow, Vd, Morder, eMatrixLayout::ROW_MAJOR, Packed>& mat,
const Vector<Vt, Vd, Packed>& vec) {
95 for (
int i = 0; i < Mrow; ++i) {
101 template <
class Vt,
class Mt,
int Vd,
int Mrow, eMatrixOrder Morder,
bool Packed,
class Rt>
102 inline Vector<Rt, Mrow, Packed> operator*(
const Matrix<Mt, Mrow, Vd, Morder, eMatrixLayout::COLUMN_MAJOR, Packed>& mat,
const Vector<Vt, Vd, Packed>& vec) {
110 result = vec(0) * mat.
stripes[0];
111 for (
int i = 1; i < Vd; ++i) {
112 result += vec(i) * mat.
stripes[i];
117 template <
class Vt,
class Mt,
int Vd,
int Mrow, eMatrixOrder Morder, eMatrixLayout Mlayout,
bool Packed>
118 Vector<traits::MatMulElemT<Vt, Mt>, Mrow, Packed>
operator*(
const Matrix<Mt, Mrow, Vd, Morder, Mlayout, Packed>& mat,
const Vector<Vt, Vd, Packed>& vec) {
120 return operator*<Vt, Mt, Vd, Mrow, Morder, Packed, Rt>(mat, vec);
126 template <
class Vt,
class Mt,
int Vd, eMatrixLayout Mlayout, eMatrixOrder Morder,
bool Packed,
class Rt = traits::MatMulElemT<Vt, Mt>>
127 Vector<Rt, Vd, Packed> operator*(
const Matrix<Mt, Vd, Vd + 1, Morder, Mlayout, Packed>& mat,
const Vector<Vt, Vd, Packed>& vec) {
128 return mat * (vec | Vt(1));
131 template <
class Vt,
class Mt,
int Vd, eMatrixLayout Mlayout, eMatrixOrder Morder,
bool Packed,
class Rt = traits::MatMulElemT<Vt, Mt>>
132 Vector<Rt, Vd, Packed> operator*(
const Matrix<Mt, Vd + 1, Vd + 1, Morder, Mlayout, Packed>& mat,
const Vector<Vt, Vd, Packed>& vec) {
133 auto res = (vec | Vt(1)) * mat;
134 res /= res(res.Dimension() - 1);
139 template <
class Vt,
class Mt,
int Vd, eMatrixOrder Morder, eMatrixLayout Layout,
bool Packed>
140 Vector<Vt, Vd, Packed>&
operator*=(
Vector<Vt, Vd, Packed>& vec,
const Matrix<Mt, Vd, Vd, Morder, Layout, Packed>& mat) {
141 vec =
operator*<Vt, Mt, Vd, Vd, Morder, Packed, Vt>(vec, mat);
auto operator*(const Matrix< T, Rows1, Match, Order1, eMatrixLayout::ROW_MAJOR, Packed > &lhs, const Matrix< U, Match, Columns2, Order2, eMatrixLayout::ROW_MAJOR, Packed > &rhs) -> Matrix< V, Rows1, Columns2, Order1, eMatrixLayout::ROW_MAJOR, Packed >
Definition: MatrixArithmetic.hpp:78
#define MATHTER_VECMAT_DOT_UNROLL(S)
Definition: MatrixVectorArithmetic.hpp:26
Represents a vector in N-dimensional space.
Definition: Definitions.hpp:57
T Dot(const Vector< T, Dim, Packed > &lhs, const Vector< T, Dim, Packed > &rhs)
Calculates the scalar product (dot product) of the two arguments.
Definition: VectorFunction.hpp:111
std::array< Vector< T, StripeDim, Packed >, StripeCount > stripes
Definition: MatrixImpl.hpp:46
Definition: Approx.hpp:11
#define MATHTER_VECMAT_UNROLL(S)
Definition: MatrixVectorArithmetic.hpp:16
Definition: Definitions.hpp:63
Matrix< T1, Dim, Dim, Order1, Layout1, Packed > & operator*=(Matrix< T1, Dim, Dim, Order1, Layout1, Packed > &lhs, const Matrix< T2, Dim, Dim, Order2, Layout2, Packed > &rhs)
Definition: MatrixArithmetic.hpp:198
decltype(T() *U()+T()+U()) MatMulElemT
Definition: Traits.hpp:60