LAMA
|
00001 00033 #ifndef LAMA_MATRIXEXPRESSIONS_HPP_ 00034 #define LAMA_MATRIXEXPRESSIONS_HPP_ 00035 00036 #include <lama/matrix/Matrix.hpp> 00037 00038 #include <lama/Vector.hpp> 00039 #include <lama/Scalar.hpp> 00040 00041 #include <lama/expression/Expression.hpp> 00042 00043 namespace lama 00044 { 00045 00054 inline Expression<Scalar,Matrix,Times> operator*( 00055 const Scalar& scalar, 00056 const Matrix& matrix) 00057 { 00058 return Expression<Scalar,Matrix,Times>(scalar,matrix); 00059 } 00060 00069 inline Expression<Scalar,Matrix,Times> operator*( 00070 const Matrix& matrix, 00071 const Scalar& scalar) 00072 { 00073 return Expression<Scalar,Matrix,Times>(scalar,matrix); 00074 } 00075 00076 //A*B 00085 inline Expression<Matrix,Matrix,Times> operator*(const Matrix& m1, const Matrix& m2) 00086 { 00087 return Expression<Matrix,Matrix,Times>(m1, m2); 00088 } 00089 00090 //alpha times A times B 00091 00100 inline Expression<Scalar,Expression<Matrix,Matrix,Times>,Times> operator*( 00101 const Matrix& m1, 00102 const Expression<Scalar,Matrix,Times>& exp) 00103 { 00104 return Expression<Scalar,Expression<Matrix,Matrix,Times>,Times>(exp.getArg1(),Expression<Matrix,Matrix,Times>(m1,exp.getArg2()) ); 00105 } 00106 00115 inline Expression<Scalar,Expression<Matrix,Matrix,Times>,Times> operator*( 00116 const Expression<Scalar,Matrix,Times>& exp, 00117 const Matrix& m1) 00118 { 00119 return Expression<Scalar,Expression<Matrix,Matrix,Times>,Times>( exp.getArg1(), Expression<Matrix,Matrix,Times>(exp.getArg2(),m1) ); 00120 } 00121 00130 inline Expression<Scalar,Expression<Matrix,Matrix,Times>,Times> operator*( 00131 const Scalar& s1, 00132 const Expression<Matrix,Matrix,Times>& exp) 00133 { 00134 return Expression<Scalar,Expression<Matrix,Matrix,Times>,Times>( s1, exp ); 00135 } 00136 00145 inline Expression<Scalar,Expression<Matrix,Matrix,Times>,Times> operator*( 00146 const Expression<Matrix,Matrix,Times>& exp, 00147 const Scalar& s1) 00148 { 00149 return Expression<Scalar,Expression<Matrix,Matrix,Times>,Times>( s1, exp ); 00150 } 00151 00152 //alpha*A*B + beta*C 00153 00162 inline Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00163 Expression< Scalar, Matrix, Times>, Plus> operator+( 00164 const Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>& exp1, 00165 const Expression< Scalar, Matrix, Times>& exp2) 00166 { 00167 return Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00168 Expression< Scalar, Matrix, Times>, Plus>(exp1,exp2); 00169 } 00170 00179 inline Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00180 Expression< Scalar, Matrix, Times>, Plus> operator+( 00181 const Expression< Scalar, Matrix, Times>& exp2, 00182 const Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>& exp1) 00183 { 00184 return Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00185 Expression< Scalar, Matrix, Times>, Plus>(exp1,exp2); 00186 } 00187 00196 inline Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00197 Expression< Scalar, Matrix, Times>, Plus> operator-( 00198 const Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>& exp1, 00199 const Expression< Scalar, Matrix, Times>& exp2) 00200 { 00201 return Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00202 Expression< Scalar, Matrix, Times>, Plus>(exp1, 00203 Expression< Scalar, Matrix, Times>( exp2.getArg1()*-1.0, exp2.getArg2() ) 00204 ); 00205 } 00206 00215 inline Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00216 Expression< Scalar, Matrix, Times>, Plus> operator-( 00217 const Expression< Scalar, Matrix, Times>& exp2, 00218 const Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>& exp1) 00219 { 00220 Expression<Scalar,Expression<Matrix,Matrix,Times>,Times> e(exp1.getArg1()*-1.0,exp1.getArg2()); 00221 return Expression< Expression< Scalar, Expression< Matrix, Matrix, Times>, Times>, 00222 Expression< Scalar, Matrix, Times>, Plus>( e, exp2 ); 00223 } 00224 00225 } 00226 00227 #endif // LAMA_MATRIXEXPRESSIONS_HPP_