Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of Eurobot_2012_Secondary by
MatrixFunctions.h
00001 /* 00002 * Tiny Vector Matrix Library 00003 * Dense Vector Matrix Libary of Tiny size using Expression Templates 00004 * 00005 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net> 00006 * 00007 * This library is free software; you can redistribute it and/or 00008 * modify it under the terms of the GNU lesser General Public 00009 * License as published by the Free Software Foundation; either 00010 * version 2.1 of the License, or (at your option) any later version. 00011 * 00012 * This library is distributed in the hope that it will be useful, 00013 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00014 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00015 * lesser General Public License for more details. 00016 * 00017 * You should have received a copy of the GNU lesser General Public 00018 * License along with this library; if not, write to the Free Software 00019 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00020 * 00021 * $Id: MatrixFunctions.h,v 1.44 2007-06-23 15:59:00 opetzold Exp $ 00022 */ 00023 00024 #ifndef TVMET_XPR_MATRIX_FUNCTIONS_H 00025 #define TVMET_XPR_MATRIX_FUNCTIONS_H 00026 00027 namespace tvmet { 00028 00029 00030 /* forwards */ 00031 template<class T, std::size_t Rows, std::size_t Cols> class Matrix; 00032 template<class T, std::size_t Sz> class Vector; 00033 template<class E, std::size_t Sz> class XprVector; 00034 template<class E> class XprMatrixTranspose; 00035 template<class E, std::size_t Sz> class XprMatrixDiag; 00036 template<class E, std::size_t Rows, std::size_t Cols> class XprMatrixRow; 00037 template<class E, std::size_t Rows, std::size_t Cols> class XprMatrixCol; 00038 00039 00040 /********************************************************* 00041 * PART I: DECLARATION 00042 *********************************************************/ 00043 00044 00045 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00046 * Matrix arithmetic functions add, sub, mul and div 00047 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00048 00049 00050 /* 00051 * function(XprMatrix<E1, Rows, Cols>, XprMatrix<E2, Rows, Cols>) 00052 */ 00053 #define TVMET_DECLARE_MACRO(NAME) \ 00054 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \ 00055 XprMatrix< \ 00056 XprBinOp< \ 00057 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \ 00058 XprMatrix<E1, Rows, Cols>, \ 00059 XprMatrix<E2, Rows, Cols> \ 00060 >, \ 00061 Rows, Cols \ 00062 > \ 00063 NAME (const XprMatrix<E1, Rows, Cols>& lhs, \ 00064 const XprMatrix<E2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; 00065 00066 TVMET_DECLARE_MACRO(add) // per se element wise 00067 TVMET_DECLARE_MACRO(sub) // per se element wise 00068 namespace element_wise { 00069 TVMET_DECLARE_MACRO(mul) // not defined for matrizes 00070 TVMET_DECLARE_MACRO(div) // not defined for matrizes 00071 } 00072 00073 #undef TVMET_DECLARE_MACRO 00074 00075 00076 /* 00077 * function(XprMatrix<E, Rows, Cols>, POD) 00078 * function(POD, XprMatrix<E, Rows, Cols>) 00079 * Note: - operations +,-,*,/ are per se element wise 00080 */ 00081 #define TVMET_DECLARE_MACRO(NAME, POD) \ 00082 template<class E, std::size_t Rows, std::size_t Cols> \ 00083 XprMatrix< \ 00084 XprBinOp< \ 00085 Fcnl_##NAME<typename E::value_type, POD >, \ 00086 XprMatrix<E, Rows, Cols>, \ 00087 XprLiteral< POD > \ 00088 >, \ 00089 Rows, Cols \ 00090 > \ 00091 NAME (const XprMatrix<E, Rows, Cols>& lhs, \ 00092 POD rhs) TVMET_CXX_ALWAYS_INLINE; \ 00093 \ 00094 template<class E, std::size_t Rows, std::size_t Cols> \ 00095 XprMatrix< \ 00096 XprBinOp< \ 00097 Fcnl_##NAME< POD, typename E::value_type>, \ 00098 XprLiteral< POD >, \ 00099 XprMatrix<E, Rows, Cols> \ 00100 >, \ 00101 Rows, Cols \ 00102 > \ 00103 NAME (POD lhs, \ 00104 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; 00105 00106 TVMET_DECLARE_MACRO(add, int) 00107 TVMET_DECLARE_MACRO(sub, int) 00108 TVMET_DECLARE_MACRO(mul, int) 00109 TVMET_DECLARE_MACRO(div, int) 00110 00111 #if defined(TVMET_HAVE_LONG_LONG) 00112 TVMET_DECLARE_MACRO(add, long long int) 00113 TVMET_DECLARE_MACRO(sub, long long int) 00114 TVMET_DECLARE_MACRO(mul, long long int) 00115 TVMET_DECLARE_MACRO(div, long long int) 00116 #endif 00117 00118 TVMET_DECLARE_MACRO(add, float) 00119 TVMET_DECLARE_MACRO(sub, float) 00120 TVMET_DECLARE_MACRO(mul, float) 00121 TVMET_DECLARE_MACRO(div, float) 00122 00123 TVMET_DECLARE_MACRO(add, double) 00124 TVMET_DECLARE_MACRO(sub, double) 00125 TVMET_DECLARE_MACRO(mul, double) 00126 TVMET_DECLARE_MACRO(div, double) 00127 00128 #if defined(TVMET_HAVE_LONG_DOUBLE) 00129 TVMET_DECLARE_MACRO(add, long double) 00130 TVMET_DECLARE_MACRO(sub, long double) 00131 TVMET_DECLARE_MACRO(mul, long double) 00132 TVMET_DECLARE_MACRO(div, long double) 00133 #endif 00134 00135 #undef TVMET_DECLARE_MACRO 00136 00137 00138 #if defined(TVMET_HAVE_COMPLEX) 00139 /* 00140 * function(XprMatrix<E, Rows, Cols>, complex<T>) 00141 * function(complex<T>, XprMatrix<E, Rows, Cols>) 00142 * Note: - operations +,-,*,/ are per se element wise 00143 * \todo type promotion 00144 */ 00145 #define TVMET_DECLARE_MACRO(NAME) \ 00146 template<class E, class T, std::size_t Rows, std::size_t Cols> \ 00147 XprMatrix< \ 00148 XprBinOp< \ 00149 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \ 00150 XprMatrix<E, Rows, Cols>, \ 00151 XprLiteral< std::complex<T> > \ 00152 >, \ 00153 Rows, Cols \ 00154 > \ 00155 NAME (const XprMatrix<E, Rows, Cols>& lhs, \ 00156 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \ 00157 \ 00158 template<class T, class E, std::size_t Rows, std::size_t Cols> \ 00159 XprMatrix< \ 00160 XprBinOp< \ 00161 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \ 00162 XprLiteral< std::complex<T> >, \ 00163 XprMatrix<E, Rows, Cols> \ 00164 >, \ 00165 Rows, Cols \ 00166 > \ 00167 NAME (const std::complex<T>& lhs, \ 00168 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; 00169 00170 TVMET_DECLARE_MACRO(add) 00171 TVMET_DECLARE_MACRO(sub) 00172 TVMET_DECLARE_MACRO(mul) 00173 TVMET_DECLARE_MACRO(div) 00174 00175 #undef TVMET_DECLARE_MACRO 00176 00177 #endif // defined(TVMET_HAVE_COMPLEX) 00178 00179 00180 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00181 * matrix prod( ... ) functions 00182 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00183 00184 00185 template<class E1, std::size_t Rows1, std::size_t Cols1, 00186 class E2, std::size_t Cols2> 00187 XprMatrix< 00188 XprMMProduct< 00189 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00190 XprMatrix<E2, Cols1, Cols2>, Cols2 00191 >, 00192 Rows1, Cols2 // return Dim 00193 > 00194 prod(const XprMatrix<E1, Rows1, Cols1>& lhs, 00195 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE; 00196 00197 00198 template<class E1, std::size_t Rows1, std::size_t Cols1, 00199 class E2, std::size_t Cols2> 00200 XprMatrix< 00201 XprMMProductTransposed< 00202 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00203 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2) 00204 >, 00205 Cols2, Rows1 // return Dim 00206 > 00207 trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, 00208 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE; 00209 00210 00211 template<class E1, std::size_t Rows1, std::size_t Cols1, 00212 class E2, std::size_t Cols2> // Rows2 = Rows1 00213 XprMatrix< 00214 XprMtMProduct< 00215 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00216 XprMatrix<E2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2) 00217 >, 00218 Cols1, Cols2 // return Dim 00219 > 00220 MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, 00221 const XprMatrix<E2, Rows1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE; 00222 00223 00224 template<class E1, std::size_t Rows1, std::size_t Cols1, 00225 class E2, std::size_t Rows2> // Cols2 = Cols1 00226 XprMatrix< 00227 XprMMtProduct< 00228 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00229 XprMatrix<E2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1) 00230 >, 00231 Rows1, Rows2 // return Dim 00232 > 00233 MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, 00234 const XprMatrix<E2, Rows2, Cols1>& rhs) TVMET_CXX_ALWAYS_INLINE; 00235 00236 00237 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00238 * matrix-vector specific prod( ... ) functions 00239 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00240 00241 00242 template<class E1, std::size_t Rows, std::size_t Cols, 00243 class E2> 00244 XprVector< 00245 XprMVProduct< 00246 XprMatrix<E1, Rows, Cols>, Rows, Cols, 00247 XprVector<E2, Cols> 00248 >, 00249 Rows 00250 > 00251 prod(const XprMatrix<E1, Rows, Cols>& lhs, 00252 const XprVector<E2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; 00253 00254 00255 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00256 * matrix specific functions 00257 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00258 00259 00260 template<class E, std::size_t Rows, std::size_t Cols> 00261 XprMatrix< 00262 XprMatrixTranspose< 00263 XprMatrix<E, Rows, Cols> 00264 >, 00265 Cols, Rows 00266 > 00267 trans(const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; 00268 00269 00270 template<class E, std::size_t Sz> 00271 typename NumericTraits<typename E::value_type>::sum_type 00272 trace(const XprMatrix<E, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE; 00273 00274 00275 template<class E, std::size_t Rows, std::size_t Cols> 00276 XprVector< 00277 XprMatrixRow< 00278 XprMatrix<E, Rows, Cols>, 00279 Rows, Cols 00280 >, 00281 Cols 00282 > 00283 row(const XprMatrix<E, Rows, Cols>& m, 00284 std::size_t no) TVMET_CXX_ALWAYS_INLINE; 00285 00286 00287 template<class E, std::size_t Rows, std::size_t Cols> 00288 XprVector< 00289 XprMatrixCol< 00290 XprMatrix<E, Rows, Cols>, 00291 Rows, Cols 00292 >, 00293 Rows 00294 > 00295 col(const XprMatrix<E, Rows, Cols>& m, std::size_t no) TVMET_CXX_ALWAYS_INLINE; 00296 00297 00298 template<class E, std::size_t Sz> 00299 XprVector< 00300 XprMatrixDiag< 00301 XprMatrix<E, Sz, Sz>, 00302 Sz 00303 >, 00304 Sz 00305 > 00306 diag(const XprMatrix<E, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE; 00307 00308 00309 /********************************************************* 00310 * PART II: IMPLEMENTATION 00311 *********************************************************/ 00312 00313 00314 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00315 * Matrix arithmetic functions add, sub, mul and div 00316 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00317 00318 00319 /* 00320 * function(XprMatrix<E1, Rows, Cols>, XprMatrix<E2, Rows, Cols>) 00321 */ 00322 #define TVMET_IMPLEMENT_MACRO(NAME) \ 00323 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \ 00324 inline \ 00325 XprMatrix< \ 00326 XprBinOp< \ 00327 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \ 00328 XprMatrix<E1, Rows, Cols>, \ 00329 XprMatrix<E2, Rows, Cols> \ 00330 >, \ 00331 Rows, Cols \ 00332 > \ 00333 NAME (const XprMatrix<E1, Rows, Cols>& lhs, \ 00334 const XprMatrix<E2, Rows, Cols>& rhs) { \ 00335 typedef XprBinOp< \ 00336 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \ 00337 XprMatrix<E1, Rows, Cols>, \ 00338 XprMatrix<E2, Rows, Cols> \ 00339 > expr_type; \ 00340 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs, rhs)); \ 00341 } 00342 00343 TVMET_IMPLEMENT_MACRO(add) // per se element wise 00344 TVMET_IMPLEMENT_MACRO(sub) // per se element wise 00345 namespace element_wise { 00346 TVMET_IMPLEMENT_MACRO(mul) // not defined for matrizes 00347 TVMET_IMPLEMENT_MACRO(div) // not defined for matrizes 00348 } 00349 00350 #undef TVMET_IMPLEMENT_MACRO 00351 00352 00353 /* 00354 * function(XprMatrix<E, Rows, Cols>, POD) 00355 * function(POD, XprMatrix<E, Rows, Cols>) 00356 * Note: - operations +,-,*,/ are per se element wise 00357 */ 00358 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \ 00359 template<class E, std::size_t Rows, std::size_t Cols> \ 00360 inline \ 00361 XprMatrix< \ 00362 XprBinOp< \ 00363 Fcnl_##NAME<typename E::value_type, POD >, \ 00364 XprMatrix<E, Rows, Cols>, \ 00365 XprLiteral< POD > \ 00366 >, \ 00367 Rows, Cols \ 00368 > \ 00369 NAME (const XprMatrix<E, Rows, Cols>& lhs, POD rhs) { \ 00370 typedef XprBinOp< \ 00371 Fcnl_##NAME<typename E::value_type, POD >, \ 00372 XprMatrix<E, Rows, Cols>, \ 00373 XprLiteral< POD > \ 00374 > expr_type; \ 00375 return XprMatrix<expr_type, Rows, Cols>( \ 00376 expr_type(lhs, XprLiteral< POD >(rhs))); \ 00377 } \ 00378 \ 00379 template<class E, std::size_t Rows, std::size_t Cols> \ 00380 inline \ 00381 XprMatrix< \ 00382 XprBinOp< \ 00383 Fcnl_##NAME< POD, typename E::value_type>, \ 00384 XprLiteral< POD >, \ 00385 XprMatrix<E, Rows, Cols> \ 00386 >, \ 00387 Rows, Cols \ 00388 > \ 00389 NAME (POD lhs, const XprMatrix<E, Rows, Cols>& rhs) { \ 00390 typedef XprBinOp< \ 00391 Fcnl_##NAME< POD, typename E::value_type>, \ 00392 XprLiteral< POD >, \ 00393 XprMatrix<E, Rows, Cols> \ 00394 > expr_type; \ 00395 return XprMatrix<expr_type, Rows, Cols>( \ 00396 expr_type(XprLiteral< POD >(lhs), rhs)); \ 00397 } 00398 00399 TVMET_IMPLEMENT_MACRO(add, int) 00400 TVMET_IMPLEMENT_MACRO(sub, int) 00401 TVMET_IMPLEMENT_MACRO(mul, int) 00402 TVMET_IMPLEMENT_MACRO(div, int) 00403 00404 #if defined(TVMET_HAVE_LONG_LONG) 00405 TVMET_IMPLEMENT_MACRO(add, long long int) 00406 TVMET_IMPLEMENT_MACRO(sub, long long int) 00407 TVMET_IMPLEMENT_MACRO(mul, long long int) 00408 TVMET_IMPLEMENT_MACRO(div, long long int) 00409 #endif 00410 00411 TVMET_IMPLEMENT_MACRO(add, float) 00412 TVMET_IMPLEMENT_MACRO(sub, float) 00413 TVMET_IMPLEMENT_MACRO(mul, float) 00414 TVMET_IMPLEMENT_MACRO(div, float) 00415 00416 TVMET_IMPLEMENT_MACRO(add, double) 00417 TVMET_IMPLEMENT_MACRO(sub, double) 00418 TVMET_IMPLEMENT_MACRO(mul, double) 00419 TVMET_IMPLEMENT_MACRO(div, double) 00420 00421 #if defined(TVMET_HAVE_LONG_DOUBLE) 00422 TVMET_IMPLEMENT_MACRO(add, long double) 00423 TVMET_IMPLEMENT_MACRO(sub, long double) 00424 TVMET_IMPLEMENT_MACRO(mul, long double) 00425 TVMET_IMPLEMENT_MACRO(div, long double) 00426 #endif 00427 00428 #undef TVMET_IMPLEMENT_MACRO 00429 00430 00431 #if defined(TVMET_HAVE_COMPLEX) 00432 /* 00433 * function(XprMatrix<E, Rows, Cols>, complex<T>) 00434 * function(complex<T>, XprMatrix<E, Rows, Cols>) 00435 * Note: - operations +,-,*,/ are per se element wise 00436 * \todo type promotion 00437 */ 00438 #define TVMET_IMPLEMENT_MACRO(NAME) \ 00439 template<class E, class T, std::size_t Rows, std::size_t Cols> \ 00440 inline \ 00441 XprMatrix< \ 00442 XprBinOp< \ 00443 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \ 00444 XprMatrix<E, Rows, Cols>, \ 00445 XprLiteral< std::complex<T> > \ 00446 >, \ 00447 Rows, Cols \ 00448 > \ 00449 NAME (const XprMatrix<E, Rows, Cols>& lhs, \ 00450 const std::complex<T>& rhs) { \ 00451 typedef XprBinOp< \ 00452 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \ 00453 XprMatrix<E, Rows, Cols>, \ 00454 XprLiteral< std::complex<T> > \ 00455 > expr_type; \ 00456 return XprMatrix<expr_type, Rows, Cols>( \ 00457 expr_type(lhs, XprLiteral< std::complex<T> >(rhs))); \ 00458 } \ 00459 \ 00460 template<class T, class E, std::size_t Rows, std::size_t Cols> \ 00461 inline \ 00462 XprMatrix< \ 00463 XprBinOp< \ 00464 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \ 00465 XprLiteral< std::complex<T> >, \ 00466 XprMatrix<E, Rows, Cols> \ 00467 >, \ 00468 Rows, Cols \ 00469 > \ 00470 NAME (const std::complex<T>& lhs, \ 00471 const XprMatrix<E, Rows, Cols>& rhs) { \ 00472 typedef XprBinOp< \ 00473 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \ 00474 XprLiteral< std::complex<T> >, \ 00475 XprMatrix<E, Rows, Cols> \ 00476 > expr_type; \ 00477 return XprMatrix<expr_type, Rows, Cols>( \ 00478 expr_type(XprLiteral< std::complex<T> >(lhs), rhs)); \ 00479 } 00480 00481 TVMET_IMPLEMENT_MACRO(add) 00482 TVMET_IMPLEMENT_MACRO(sub) 00483 TVMET_IMPLEMENT_MACRO(mul) 00484 TVMET_IMPLEMENT_MACRO(div) 00485 00486 #undef TVMET_IMPLEMENT_MACRO 00487 00488 #endif // defined(TVMET_HAVE_COMPLEX) 00489 00490 00491 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00492 * matrix prod( ... ) functions 00493 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00494 00495 00496 /** 00497 * \fn prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) 00498 * \brief Evaluate the product of two XprMatrix. 00499 * Perform on given Matrix M1 and M2: 00500 * \f[ 00501 * M_1\,M_2 00502 * \f] 00503 * \note The numer of Rows2 has to be equal to Cols1. 00504 * \ingroup _binary_function 00505 */ 00506 template<class E1, std::size_t Rows1, std::size_t Cols1, 00507 class E2, std::size_t Cols2> 00508 inline 00509 XprMatrix< 00510 XprMMProduct< 00511 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00512 XprMatrix<E2, Cols1, Cols2>, Cols2 00513 >, 00514 Rows1, Cols2 // return Dim 00515 > 00516 prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) { 00517 typedef XprMMProduct< 00518 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, 00519 XprMatrix<E2, Cols1, Cols2>, Cols2 00520 > expr_type; 00521 return XprMatrix<expr_type, Rows1, Cols2>(expr_type(lhs, rhs)); 00522 } 00523 00524 00525 /** 00526 * \fn trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) 00527 * \brief Function for the trans(matrix-matrix-product) 00528 * Perform on given Matrix M1 and M2: 00529 * \f[ 00530 * (M_1\,M_2)^T 00531 * \f] 00532 * \note The numer of Rows2 has to be equal to Cols1. 00533 * \ingroup _binary_function 00534 */ 00535 template<class E1, std::size_t Rows1, std::size_t Cols1, 00536 class E2, std::size_t Cols2> 00537 inline 00538 XprMatrix< 00539 XprMMProductTransposed< 00540 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00541 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2) 00542 >, 00543 Cols2, Rows1 // return Dim 00544 > 00545 trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) { 00546 typedef XprMMProductTransposed< 00547 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, 00548 XprMatrix<E2, Cols1, Cols2>, Cols2 00549 > expr_type; 00550 return XprMatrix<expr_type, Cols2, Rows1>(expr_type(lhs, rhs)); 00551 } 00552 00553 00554 /** 00555 * \fn MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows1, Cols2>& rhs) 00556 * \brief Function for the trans(matrix)-matrix-product. 00557 * using formula 00558 * \f[ 00559 * M_1^{T}\,M_2 00560 * \f] 00561 * \note The number of cols of matrix 2 have to be equal to number of rows of 00562 * matrix 1, since matrix 1 is trans - the result is a (Cols1 x Cols2) 00563 * matrix. 00564 * \ingroup _binary_function 00565 */ 00566 template<class E1, std::size_t Rows1, std::size_t Cols1, 00567 class E2, std::size_t Cols2> // Rows2 = Rows1 00568 inline 00569 XprMatrix< 00570 XprMtMProduct< 00571 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00572 XprMatrix<E2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2) 00573 >, 00574 Cols1, Cols2 // return Dim 00575 > 00576 MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows1, Cols2>& rhs) { 00577 typedef XprMtMProduct< 00578 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, 00579 XprMatrix<E2, Rows1, Cols2>, Cols2 00580 > expr_type; 00581 return XprMatrix<expr_type, Cols1, Cols2>(expr_type(lhs, rhs)); 00582 } 00583 00584 00585 /** 00586 * \fn MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows2, Cols1>& rhs) 00587 * \brief Function for the matrix-trans(matrix)-product. 00588 * \ingroup _binary_function 00589 * \note The cols2 has to be equal to cols1. 00590 */ 00591 template<class E1, std::size_t Rows1, std::size_t Cols1, 00592 class E2, std::size_t Rows2> // Cols2 = Cols1 00593 inline 00594 XprMatrix< 00595 XprMMtProduct< 00596 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1) 00597 XprMatrix<E2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1) 00598 >, 00599 Rows1, Rows2 // return Dim 00600 > 00601 MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows2, Cols1>& rhs) { 00602 typedef XprMMtProduct< 00603 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, 00604 XprMatrix<E2, Rows2, Cols1>, Cols1 00605 > expr_type; 00606 return XprMatrix<expr_type, Rows1, Rows2>(expr_type(lhs, rhs)); 00607 } 00608 00609 00610 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00611 * matrix-vector specific prod( ... ) functions 00612 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00613 00614 00615 /** 00616 * \fn prod(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) 00617 * \brief Evaluate the product of XprMatrix and XprVector. 00618 * \ingroup _binary_function 00619 */ 00620 template<class E1, std::size_t Rows, std::size_t Cols, 00621 class E2> 00622 inline 00623 XprVector< 00624 XprMVProduct< 00625 XprMatrix<E1, Rows, Cols>, Rows, Cols, 00626 XprVector<E2, Cols> 00627 >, 00628 Rows 00629 > 00630 prod(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) { 00631 typedef XprMVProduct< 00632 XprMatrix<E1, Rows, Cols>, Rows, Cols, 00633 XprVector<E2, Cols> 00634 > expr_type; 00635 return XprVector<expr_type, Rows>(expr_type(lhs, rhs)); 00636 } 00637 00638 00639 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 00640 * matrix specific functions 00641 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ 00642 00643 00644 /** 00645 * \fn trans(const XprMatrix<E, Rows, Cols>& rhs) 00646 * \brief Transpose an expression matrix. 00647 * \ingroup _unary_function 00648 */ 00649 template<class E, std::size_t Rows, std::size_t Cols> 00650 inline 00651 XprMatrix< 00652 XprMatrixTranspose< 00653 XprMatrix<E, Rows, Cols> 00654 >, 00655 Cols, Rows 00656 > 00657 trans(const XprMatrix<E, Rows, Cols>& rhs) { 00658 typedef XprMatrixTranspose< 00659 XprMatrix<E, Rows, Cols> 00660 > expr_type; 00661 return XprMatrix<expr_type, Cols, Rows>(expr_type(rhs)); 00662 } 00663 00664 00665 /* 00666 * \fn trace(const XprMatrix<E, Sz, Sz>& m) 00667 * \brief Compute the trace of a square matrix. 00668 * \ingroup _unary_function 00669 * 00670 * Simply compute the trace of the given matrix expression as: 00671 * \f[ 00672 * \sum_{k = 0}^{Sz-1} m(k, k) 00673 * \f] 00674 */ 00675 template<class E, std::size_t Sz> 00676 inline 00677 typename NumericTraits<typename E::value_type>::sum_type 00678 trace(const XprMatrix<E, Sz, Sz>& m) { 00679 return meta::Matrix<Sz, Sz, 0, 0>::trace(m); 00680 } 00681 00682 00683 /** 00684 * \fn row(const XprMatrix<E, Rows, Cols>& m, std::size_t no) 00685 * \brief Returns a row vector of the given matrix. 00686 * \ingroup _binary_function 00687 */ 00688 template<class E, std::size_t Rows, std::size_t Cols> 00689 inline 00690 XprVector< 00691 XprMatrixRow< 00692 XprMatrix<E, Rows, Cols>, 00693 Rows, Cols 00694 >, 00695 Cols 00696 > 00697 row(const XprMatrix<E, Rows, Cols>& m, std::size_t no) { 00698 typedef XprMatrixRow< 00699 XprMatrix<E, Rows, Cols>, 00700 Rows, Cols 00701 > expr_type; 00702 00703 return XprVector<expr_type, Cols>(expr_type(m, no)); 00704 } 00705 00706 00707 /** 00708 * \fn col(const XprMatrix<E, Rows, Cols>& m, std::size_t no) 00709 * \brief Returns a column vector of the given matrix. 00710 * \ingroup _binary_function 00711 */ 00712 template<class E, std::size_t Rows, std::size_t Cols> 00713 inline 00714 XprVector< 00715 XprMatrixCol< 00716 XprMatrix<E, Rows, Cols>, 00717 Rows, Cols 00718 >, 00719 Rows 00720 > 00721 col(const XprMatrix<E, Rows, Cols>& m, std::size_t no) { 00722 typedef XprMatrixCol< 00723 XprMatrix<E, Rows, Cols>, 00724 Rows, Cols 00725 > expr_type; 00726 00727 return XprVector<expr_type, Cols>(expr_type(m, no)); 00728 } 00729 00730 00731 /** 00732 * \fn diag(const XprMatrix<E, Sz, Sz>& m) 00733 * \brief Returns the diagonal vector of the given square matrix. 00734 * \ingroup _unary_function 00735 */ 00736 template<class E, std::size_t Sz> 00737 inline 00738 XprVector< 00739 XprMatrixDiag< 00740 XprMatrix<E, Sz, Sz>, 00741 Sz 00742 >, 00743 Sz 00744 > 00745 diag(const XprMatrix<E, Sz, Sz>& m) { 00746 typedef XprMatrixDiag< 00747 XprMatrix<E, Sz, Sz>, 00748 Sz> expr_type; 00749 00750 return XprVector<expr_type, Sz>(expr_type(m)); 00751 } 00752 00753 00754 } // namespace tvmet 00755 00756 #endif // TVMET_XPR_MATRIX_FUNCTIONS_H 00757 00758 // Local Variables: 00759 // mode:C++ 00760 // tab-width:8 00761 // End:
Generated on Tue Jul 12 2022 21:02:13 by
