LAMA
|
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_