1#ifndef __MATRIXFUNCTIONS_HH
2#define __MATRIXFUNCTIONS_HH
34template <
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) {
52template <
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);
77template <
class Matrix,
class Vector,
unsigned int D2>
88 inline typename Matrix::value_type
apply(
unsigned int i)
const {
101template <
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);
127template <
class Vector,
class Matrix,
unsigned int D1>
138 inline typename Matrix::value_type
apply(
unsigned int i)
const {
150template <
class T,
unsigned int D1,
unsigned int D2>
161template <
class A,
class T,
unsigned int D1,
unsigned int D2>
172template <
class A,
class T,
unsigned int D1,
unsigned int D2>
183template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D2>
194template <
class T,
unsigned int D1,
unsigned int D2>
205template <
class A,
class T,
unsigned int D1,
unsigned int D2>
216template <
class A,
class T,
unsigned int D1,
unsigned int D2>
227template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D2>
238template <
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);
266template <
class MatrixA,
class MatrixB,
class T,
unsigned int D>
277 inline T
apply(
unsigned int i)
const {
290template <
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
291inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
SMatrix<T,D,D2>,T,D>, T, D1, D2>
301template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
302inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
Expr<A,T,D,D2>,T,D>, T, D1, D2>
312template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
313inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
SMatrix<T,D,D2>,T,D>, T, D1, D2>
323template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
324inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
Expr<B,T,D,D2>,T,D>, T, D1, D2>
336template <
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 {
360template <
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
371template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
372inline Expr<MatrixMulOp<SMatrix<T,D1,D>,
Expr<A,T,D,D2>, D>, T, D1, D2>
382template <
class A,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
383inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
SMatrix<T,D,D2>, D>, T, D1, D2>
393template <
class A,
class B,
class T,
unsigned int D1,
unsigned int D,
unsigned int D2>
394inline Expr<MatrixMulOp<Expr<A,T,D1,D>,
Expr<B,T,D,D2>, D>, T, D1, D2>
405template <
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);
428template <
class T,
unsigned int D1,
unsigned int D2>
439template <
class A,
class T,
unsigned int D1,
unsigned int D2>
450template <
class T,
unsigned int D>
452 return dot(rhs, lhs * rhs);
458template <
class T,
unsigned int D>
460 return dot(lhs, rhs * lhs);
466template <
class A,
class T,
unsigned int D>
468 return dot(rhs, lhs * rhs);
474template <
class A,
class T,
unsigned int D>
476 return dot(lhs, rhs * lhs);
482template <
class A,
class T,
unsigned int D>
484 return dot(lhs, rhs * lhs);
490template <
class A,
class T,
unsigned int D>
492 return dot(rhs, lhs * rhs);
498template <
class A,
class B,
class T,
unsigned int D>
500 return dot(rhs, lhs * rhs);
506template <
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< 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
T product(const SMatrix< T, D > &lhs, const SVector< T, D > &rhs)
Definition: MatrixFunctions.hh:451
Expr< TransposeOp< SMatrix< T, D1, D2 >, T, D1, D2 >, T, D2, D1 > transpose(const SMatrix< T, D1, D2 > &rhs)
Definition: MatrixFunctions.hh:430
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