1 #ifndef __MATRIXFUNCTIONS_HH
2 #define __MATRIXFUNCTIONS_HH
34 template <
class T,
unsigned int D1,
unsigned int D2>
38 for(
unsigned int i=0; i<D1; ++i) {
39 const unsigned int rpos = i*D2;
40 for(
unsigned int j=0; j<D2; ++j) {
52 template <
unsigned int I>
54 template <
class A,
class B>
55 static inline typename A::value_type
f(
const A& lhs,
const B& rhs,
56 const unsigned int offset) {
67 template <
class A,
class B>
68 static inline typename A::value_type
f(
const A& lhs,
const B& rhs,
69 const unsigned int offset) {
70 return lhs.apply(offset) * rhs.apply(0);
77 template <
class Matrix,
class Vector,
unsigned int D2>
88 inline typename Matrix::value_type
apply(
unsigned int i)
const {
101 template <
unsigned int I>
103 template <
class Matrix,
class Vector>
104 static inline typename Matrix::value_type
f(
const Matrix& lhs,
const Vector& rhs,
105 const unsigned int offset) {
106 return lhs.apply(Matrix::cols*I+offset) * rhs.apply(I) +
117 template <
class Matrix,
class Vector>
118 static inline typename Matrix::value_type
f(
const Matrix& lhs,
const Vector& rhs,
119 const unsigned int offset) {
120 return lhs.apply(offset) * rhs.apply(0);
127 template <
class Vector,
class Matrix,
unsigned int D1>
138 inline typename Matrix::value_type
apply(
unsigned int i)
const {
150 template <
class T,
unsigned int D1,
unsigned int D2>
161 template <
class A,
class T,
unsigned int D1,
unsigned int D2>
172 template <
class A,
class T,
unsigned int D1,
unsigned int D2>
183 template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D2>
194 template <
class T,
unsigned int D1,
unsigned int D2>
205 template <
class A,
class T,
unsigned int D1,
unsigned int D2>
216 template <
class A,
class T,
unsigned int D1,
unsigned int D2>
227 template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D2>
238 template <
unsigned int I>
240 template <
class MatrixA,
class MatrixB>
241 static inline typename MatrixA::value_type
f(
const MatrixA& lhs,
const MatrixB& rhs,
242 const unsigned int offset) {
243 return lhs.apply(offset/MatrixB::cols*MatrixA::cols + I) *
244 rhs.apply(MatrixB::cols*I + offset%MatrixB::cols) +
255 template <
class MatrixA,
class MatrixB>
256 static inline typename MatrixA::value_type
f(
const MatrixA& lhs,
const MatrixB& rhs,
257 const unsigned int offset) {
258 return lhs.apply(offset/MatrixB::cols*MatrixA::cols) *
259 rhs.apply(offset%MatrixB::cols);
266 template <
class MatrixA,
class MatrixB,
class T,
unsigned int D>
277 inline T
apply(
unsigned int i)
const {
290 template <
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
291 inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
SMatrix<T,D,D2>,T,D>, T, D1, D2>
301 template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
302 inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
Expr<A,T,D,D2>,T,D>, T, D1, D2>
312 template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
313 inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
SMatrix<T,D,D2>,T,D>, T, D1, D2>
323 template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
324 inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
Expr<B,T,D,D2>,T,D>, T, D1, D2>
336 template <
class MatrixA,
class MatrixB,
unsigned int D>
340 MatrixMulOp(
const MatrixA& lhs,
const MatrixB& rhs) :
347 inline typename MatrixA::value_type
apply(
unsigned int i)
const {
360 template <
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
371 template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
372 inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
Expr<A,T,D,D2>, D>, T, D1, D2>
382 template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
383 inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
SMatrix<T,D,D2>, D>, T, D1, D2>
393 template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
394 inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
Expr<B,T,D,D2>, D>, T, D1, D2>
405 template <
class Matrix,
class T,
unsigned int D1,
unsigned int D2=D1>
416 inline T
apply(
unsigned int i)
const {
417 return rhs_.apply( (i%D1)*D2 + i/D1);
428 template <
class T,
unsigned int D1,
unsigned int D2>
439 template <
class A,
class T,
unsigned int D1,
unsigned int D2>
450 template <
class T,
unsigned int D>
452 return dot(rhs, lhs * rhs);
458 template <
class T,
unsigned int D>
460 return dot(lhs, rhs * lhs);
466 template <
class A,
class T,
unsigned int D>
468 return dot(rhs, lhs * rhs);
474 template <
class A,
class T,
unsigned int D>
476 return dot(lhs, rhs * lhs);
482 template <
class A,
class T,
unsigned int D>
484 return dot(lhs, rhs * lhs);
490 template <
class A,
class T,
unsigned int D>
492 return dot(rhs, lhs * rhs);
498 template <
class A,
class B,
class T,
unsigned int D>
500 return dot(rhs, lhs * rhs);
506 template <
class A,
class B,
class T,
unsigned int D>
508 return dot(lhs, rhs * lhs);
T dot(const SVector< T, D > &lhs, const SVector< T, D > &rhs)
Definition: Functions.hh:132
Expr< TransposeOp< SMatrix< T, D1, D2 >, T, D1, D2 >, T, D2, D1 > transpose(const SMatrix< T, D1, D2 > &rhs)
Definition: MatrixFunctions.hh:430
T product(const SMatrix< T, D > &lhs, const SVector< T, D > &rhs)
Definition: MatrixFunctions.hh:451
Expr< VectorMatrixRowOp< SMatrix< T, D1, D2 >, SVector< T, D2 >, D2 >, T, D1 > operator*(const SMatrix< T, D1, D2 > &lhs, const SVector< T, D2 > &rhs)
Definition: MatrixFunctions.hh:152
Definition: Expression.hh:43
Definition: MatrixFunctions.hh:267
const MatrixB & rhs_
Definition: MatrixFunctions.hh:283
MatrixMulOp(const MatrixA &lhs, const MatrixB &rhs)
Definition: MatrixFunctions.hh:270
T apply(unsigned int i) const
calc $\sum_{j} a_{ik} * b_{kj}$
Definition: MatrixFunctions.hh:277
const MatrixA & lhs_
Definition: MatrixFunctions.hh:282
~MatrixMulOp()
Definition: MatrixFunctions.hh:274
Definition: SMatrix.hh:53
T apply(unsigned int i) const
access the parse tree
Definition: SVector.hh:51
T apply(unsigned int i) const
access the parse tree
Definition: MatrixFunctions.hh:406
T apply(unsigned int i) const
Definition: MatrixFunctions.hh:416
TransposeOp(const Matrix &rhs)
Definition: MatrixFunctions.hh:409
const Matrix & rhs_
Definition: MatrixFunctions.hh:421
~TransposeOp()
Definition: MatrixFunctions.hh:413
Definition: MatrixFunctions.hh:128
VectorMatrixColOp(const Vector &lhs, const Matrix &rhs)
Definition: MatrixFunctions.hh:131
const Vector & lhs_
Definition: MatrixFunctions.hh:143
Matrix::value_type apply(unsigned int i) const
calc $\sum_{j} a_{ij} * v_j$
Definition: MatrixFunctions.hh:138
~VectorMatrixColOp()
Definition: MatrixFunctions.hh:135
const Matrix & rhs_
Definition: MatrixFunctions.hh:144
Definition: MatrixFunctions.hh:78
~VectorMatrixRowOp()
Definition: MatrixFunctions.hh:85
const Matrix & lhs_
Definition: MatrixFunctions.hh:93
VectorMatrixRowOp(const Matrix &lhs, const Vector &rhs)
Definition: MatrixFunctions.hh:81
Matrix::value_type apply(unsigned int i) const
calc $\sum_{j} a_{ij} * v_j$
Definition: MatrixFunctions.hh:88
const Vector & rhs_
Definition: MatrixFunctions.hh:94