LAMA
/home/brandes/workspace/LAMA/src/lama/expression/MatrixVectorExpressions.hpp
Go to the documentation of this file.
00001 
00033 #ifndef LAMA_MATRIXVECTOREXPRESSIONS_HPP_
00034 #define LAMA_MATRIXVECTOREXPRESSIONS_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 
00046 /* ------------------------------------------------------------------------- */
00047 
00061 inline Expression<Matrix,Vector,Times> operator*(
00062     const Matrix& matrix,
00063     const Vector& vector)
00064 {
00065     return Expression<Matrix,Vector,Times>(matrix,vector);
00066 }
00067 
00068 // alpha*(A*x)
00077 inline Expression<Scalar,Expression<Matrix,Vector,Times>,Times> operator*(
00078     const Scalar& scalar,
00079     const Expression<Matrix,Vector,Times>& exp)
00080 {
00081     return Expression<Scalar,Expression<Matrix,Vector,Times>,Times>(scalar,exp);
00082 }
00083 
00092 inline Expression<Scalar,Expression<Matrix,Vector,Times>,Times> operator*(
00093     const Expression<Matrix,Vector,Times>& exp,
00094     const Scalar& scalar)
00095 {
00096     return Expression<Scalar,Expression<Matrix,Vector,Times>,Times>(scalar,exp);
00097 }
00106 inline Expression<Scalar,Expression<Matrix,Vector,Times>,Times> operator*(
00107     const Matrix& matrix,
00108     const Expression<Scalar,Vector,Times>& exp)
00109 {
00110     return Expression<Scalar,Expression<Matrix,Vector,Times>,Times>(exp.getArg1(),
00111                             Expression<Matrix,Vector,Times>(matrix, exp.getArg2()) );
00112 }
00113 
00122 inline Expression<Scalar,Expression<Matrix,Vector,Times>,Times> operator*(
00123     const Expression<Scalar,Matrix,Times>& exp,
00124     const Vector& vector)
00125 {
00126     return Expression<Scalar,Expression<Matrix,Vector,Times>,Times>(exp.getArg1(),
00127                             Expression<Matrix,Vector,Times>(exp.getArg2(),vector) );
00128 }
00129 
00130 /* ------------------------------------------------------------------------- */
00131 
00140 inline Expression<Expression<Scalar,
00141                              Expression<Matrix,Vector,Times>,
00142                              Times>,
00143                   Expression<Scalar,Vector,Times>,
00144                   Plus> operator-(
00145     const Expression<Scalar, Expression<Matrix,Vector,Times>, Times>& exp,
00146     const Vector& vector )
00147 {
00148     Expression<Scalar,Vector,Times> exp1( Scalar(-1.0), vector );
00149 
00150     return Expression<Expression<Scalar,
00151                                  Expression<Matrix,Vector,Times>,
00152                                  Times>,
00153                       Expression<Scalar,Vector,Times>,
00154                       Plus>( exp, exp1 );
00155 }
00156 
00165 inline Expression<Expression<Scalar,
00166                              Expression<Matrix,Vector,Times>,
00167                              Times>,
00168                   Expression<Scalar,Vector,Times>,
00169                   Plus> operator-(
00170     const Expression<Matrix, Expression<Vector, Scalar,Times>, Times>& exp,
00171     const Vector& vector )
00172 {
00173     Expression<Scalar,Vector,Times> exp1( Scalar(-1.0), vector );
00174 
00175     Expression<Matrix,Vector,Times> e( exp.getArg1(), exp.getArg2().getArg1() );
00176     Expression<Scalar,
00177                Expression<Matrix,Vector,Times>,
00178                Times> exp2( exp.getArg2().getArg2(), e );
00179     return Expression<Expression<Scalar,
00180                                  Expression<Matrix,Vector,Times>,
00181                                  Times>,
00182                       Expression<Scalar,Vector,Times>,
00183                       Plus>( exp2, exp1 );
00184 }
00185 
00194 inline  Expression< Expression<Scalar,
00195                                Expression< Matrix, Vector, Times>,
00196                                Times>,
00197                     Expression<Scalar, Vector, Times>,
00198                     Plus> operator-(
00199     const Expression< Scalar, Expression< Matrix, Vector, Times>, Times>& exp1,
00200     const Expression< Scalar, Vector, Times>& exp2)
00201 {
00202     return Expression< Expression<Scalar,
00203                                   Expression< Matrix, Vector, Times>,
00204                                   Times>,
00205                        Expression<Scalar, Vector, Times>,
00206                        Plus>( exp1, Expression<Scalar, Vector, Times> (exp2.getArg1() * -1.0, exp2.getArg2() ) );
00207 }
00208 
00217 inline  Expression< Expression<Scalar,
00218                                Expression<Matrix, Vector, Times>,
00219                                Times>,
00220                     Expression<Scalar, Vector, Times>,
00221                     Plus> operator-(
00222     const Expression< Scalar, Vector, Times>& exp2,
00223     const Expression< Scalar, Expression< Matrix, Vector, Times>, Times>& exp1)
00224 {
00225 
00226     return Expression< Expression<Scalar,
00227                                   Expression<Matrix, Vector, Times>,
00228                                   Times>,
00229                        Expression<Scalar, Vector, Times>,
00230                        Plus> (
00231                        Expression<Scalar, Expression< Matrix, Vector, Times>, Times>(exp1.getArg1()*-1.0, exp1.getArg2()), exp2 );
00232 }
00233 
00242 inline Expression<Expression<Scalar,
00243                              Expression<Matrix,Vector,Times>,
00244                              Times>,
00245                   Expression<Scalar,Vector,Times>,
00246                   Plus> operator-(
00247     const Vector& vector,
00248     const Expression<Matrix,Vector,Times>& exp)
00249 {
00250     const Expression<Scalar,Vector,Times> exp1( Scalar(1.0), vector );
00251     const Expression<Scalar,
00252                      Expression<Matrix,Vector,Times>,
00253                      Times>                             exp2( Scalar(-1.0), exp );
00254 
00255     return Expression<Expression<Scalar,
00256                                  Expression<Matrix,Vector,Times>,
00257                                  Times>,
00258                       Expression<Scalar,Vector,Times>,
00259                       Plus>( exp2, exp1);
00260 }
00261 
00270 inline Expression<Expression<Scalar,
00271                              Expression<Matrix,Vector,Times>,
00272                              Times>,
00273                   Expression<Scalar,Vector,Times>,
00274                   Plus> operator-(
00275     const Expression<Matrix,Vector,Times>& exp,
00276     const Vector& vector )
00277 {
00278     const Expression<Scalar,Vector,Times> exp1( Scalar(-1.0), vector );
00279     const Expression<Scalar,
00280                      Expression<Matrix,Vector,Times>,
00281                      Times>                             exp2( Scalar(1.0), exp );
00282 
00283     return Expression<Expression<Scalar,
00284                                  Expression<Matrix,Vector,Times>,
00285                                  Times>,
00286                       Expression<Scalar,Vector,Times>,
00287                       Plus>( exp2, exp1 );
00288 }
00289 
00298 inline Expression<Expression<Scalar,
00299                              Expression<Matrix,Vector,Times>,
00300                              Times>,
00301                   Expression<Scalar,Vector,Times>,
00302                   Plus> operator-(
00303     const Expression<Matrix,Expression<Scalar,Vector,Times>,Times>& exp,
00304     const Vector& vector )
00305 {
00306     const Expression<Scalar,Vector,Times> exp1( Scalar(-1.0), vector );
00307     Expression<Matrix,Vector,Times> e(exp.getArg1(),exp.getArg2().getArg2());
00308     const Expression<Scalar,
00309                      Expression<Matrix,Vector,Times>,
00310                      Times>                             exp2( exp.getArg2().getArg1(), e );
00311 
00312     return Expression<Expression<Scalar,
00313                                  Expression<Matrix,Vector,Times>,
00314                                  Times>,
00315                       Expression<Scalar,Vector,Times>,
00316                       Plus>( exp2, exp1 );
00317 }
00318 
00319 /* ------------------------------------------------------------------------- */
00320 
00329 inline Expression<Expression<Scalar,
00330                              Expression<Matrix,Vector,Times>,
00331                              Times>,
00332                   Expression<Scalar,Vector,Times>,
00333                   Plus> operator+(
00334     const Vector& vector,
00335     const Expression<Matrix,Vector,Times>& exp)
00336 {
00337     const Expression<Scalar,Vector,Times> exp1( Scalar(1.0), vector );
00338     const Expression<Scalar,
00339                      Expression<Matrix,Vector,Times>,
00340                      Times>                             exp2( Scalar(1.0), exp );
00341     return Expression<Expression<Scalar,
00342                                  Expression<Matrix,Vector,Times>,
00343                                  Times>,
00344                       Expression<Scalar,Vector,Times>,
00345                       Plus>( exp2, exp1);
00346 }
00347 
00356 inline Expression<Expression<Scalar,
00357                              Expression<Matrix,Vector,Times>,
00358                              Times>,
00359                   Expression<Scalar,Vector,Times>,
00360                   Plus> operator+(
00361     const Expression<Scalar,Expression<Matrix,Vector,Times>,Times>& exp,
00362     const Vector& vector)
00363 {
00364     Expression<Scalar,Vector,Times> exp2( 1.0, vector );
00365     return Expression<Expression<Scalar,
00366                                  Expression<Matrix,Vector,Times>,
00367                                  Times>,
00368                       Expression<Scalar,Vector,Times>,
00369                       Plus>( exp, exp2);
00370 }
00371 
00380 inline Expression<Expression<Scalar,
00381                              Expression<Matrix,Vector,Times>,
00382                              Times>,
00383                   Expression<Scalar,Vector,Times>,
00384                   Plus> operator+(
00385     const Expression<Matrix,Expression<Scalar,Vector,Times>,Times>& exp,
00386     const Vector& vector)
00387 {
00388     Expression<Matrix,Vector,Times>exp1(exp.getArg1(),exp.getArg2().getArg2());
00389     Expression<Scalar, Expression<Matrix,Vector,Times>, Times> exp2(exp.getArg2().getArg1(),exp1);
00390     Expression<Scalar,Vector,Times> exp3(1.0,vector);
00391 
00392     return Expression<Expression<Scalar,
00393                                  Expression<Matrix,Vector,Times>,
00394                                  Times>,
00395                       Expression<Scalar,Vector,Times>,
00396                       Plus>( exp2, exp3);
00397 }
00398 
00407 inline Expression<Expression<Scalar,
00408                              Expression<Matrix,Vector,Times>,
00409                              Times>,
00410                   Expression<Scalar,Vector,Times>,
00411                   Plus> operator+(
00412     const Expression<Matrix,Expression<Vector,Scalar,Times>,Times>& exp,
00413     const Vector& vector)
00414 {
00415     Expression<Matrix,Vector,Times>exp1(exp.getArg1(),exp.getArg2().getArg1());
00416     Expression<Scalar, Expression<Matrix,Vector,Times>, Times> exp2(exp.getArg2().getArg2(),exp1);
00417     Expression<Scalar,Vector,Times> exp3( 1.0, vector );
00418 
00419     return Expression<Expression<Scalar,
00420                                  Expression<Matrix,Vector,Times>,
00421                                  Times>,
00422                       Expression<Scalar,Vector,Times>,
00423                       Plus>( exp2, exp3);
00424 }
00425 
00434 inline Expression<Expression<Scalar,
00435                              Expression<Matrix,Vector,Times>,
00436                              Times>,
00437                   Expression<Scalar,Vector,Times>,
00438                   Plus> operator+(
00439     const Expression<Matrix,Vector,Times>& exp,
00440     const Vector& vector)
00441 {
00442     Expression<Matrix,Vector,Times>exp1(exp.getArg1(),exp.getArg2());
00443     Expression<Scalar, Expression<Matrix,Vector,Times>, Times> exp2(1.0,exp1);
00444     Expression<Scalar,Vector,Times> exp3(1.0,vector);
00445     return Expression<Expression<Scalar,
00446                                  Expression<Matrix,Vector,Times>,
00447                                  Times>,
00448                       Expression<Scalar,Vector,Times>,
00449                       Plus>( exp2, exp3);
00450 }
00451 
00460 inline  Expression< Expression< Scalar,
00461                                 Expression< Matrix, Vector, Times>,
00462                                 Times>,
00463                     Expression< Scalar, Vector, Times>,
00464                     Plus> operator+(
00465     const Expression< Scalar, Expression< Matrix, Vector, Times>, Times>& exp1,
00466     const Expression< Scalar, Vector, Times>& exp2)
00467 {
00468     return Expression< Expression< Scalar, Expression< Matrix, Vector, Times>, Times>, Expression< Scalar, Vector, Times>, Plus>(exp1,exp2);
00469 }
00470 
00479 inline  Expression< Expression< Scalar,
00480                                 Expression< Matrix, Vector, Times>,
00481                                 Times>,
00482                     Expression< Scalar, Vector, Times>,
00483                     Plus> operator+(
00484     const Expression< Scalar, Vector, Times>& exp2,
00485     const Expression< Scalar, Expression< Matrix, Vector, Times>, Times>& exp1)
00486 {
00487     return Expression< Expression< Scalar, Expression< Matrix, Vector, Times>, Times>,
00488                        Expression< Scalar, Vector, Times>,
00489                        Plus>(exp1,exp2);
00490 }
00491 
00500 inline  Expression< Expression< Scalar,
00501                                 Expression< Matrix, Vector, Times>,
00502                                 Times>,
00503                     Expression< Scalar, Vector, Times>,
00504                     Plus> operator+(
00505     const Expression< Matrix, Vector, Times>& exp2,
00506     const Expression< Scalar, Vector, Times>& exp1)
00507 {
00508     Expression<Scalar, Expression<Matrix,Vector,Times>, Times > exp(1.0, exp2);
00509     return Expression< Expression< Scalar, Expression< Matrix, Vector, Times>, Times>,
00510                        Expression< Scalar, Vector, Times>,
00511                        Plus>(exp,exp1);
00512 }
00513 
00514 }
00515 
00516 
00517 
00518 #endif // LAMA_MATRIXVECTOREXPRESSIONS_HPP_