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
MatrixEval.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: MatrixEval.h,v 1.18 2007-06-23 15:58:58 opetzold Exp $ 00022 */ 00023 00024 #ifndef TVMET_MATRIX_EVAL_H 00025 #define TVMET_MATRIX_EVAL_H 00026 00027 namespace tvmet { 00028 00029 00030 /** 00031 * \fn bool all_elements(const XprMatrix<E, Rows, Cols>& e) 00032 * \brief check on statements for all elements 00033 * \ingroup _unary_function 00034 * This is for use with boolean operators like 00035 * \par Example: 00036 * \code 00037 * all_elements(matrix > 0) { 00038 * // true branch 00039 * } else { 00040 * // false branch 00041 * } 00042 * \endcode 00043 * \sa \ref compare 00044 */ 00045 template<class E, std::size_t Rows, std::size_t Cols> 00046 inline 00047 bool all_elements(const XprMatrix<E, Rows, Cols>& e) { 00048 return meta::Matrix<Rows, Cols, 0, 0>::all_elements(e); 00049 } 00050 00051 00052 /** 00053 * \fn bool any_elements(const XprMatrix<E, Rows, Cols>& e) 00054 * \brief check on statements for any elements 00055 * \ingroup _unary_function 00056 * This is for use with boolean operators like 00057 * \par Example: 00058 * \code 00059 * any_elements(matrix > 0) { 00060 * // true branch 00061 * } else { 00062 * // false branch 00063 * } 00064 * \endcode 00065 * \sa \ref compare 00066 */ 00067 template<class E, std::size_t Rows, std::size_t Cols> 00068 inline 00069 bool any_elements(const XprMatrix<E, Rows, Cols>& e) { 00070 return meta::Matrix<Rows, Cols, 0, 0>::any_elements(e); 00071 } 00072 00073 00074 /* 00075 * trinary evaluation functions with matrizes and xpr of 00076 * 00077 * XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : Matrix<T3, Rows, Cols> 00078 * XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : XprMatrix<E3, Rows, Cols> 00079 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : Matrix<T3, Rows, Cols> 00080 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : XprMatrix<E3, Rows, Cols> 00081 */ 00082 00083 /** 00084 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const Matrix<T2, Rows, Cols>& m2, const Matrix<T3, Rows, Cols>& m3) 00085 * \brief Evals the matrix expressions. 00086 * \ingroup _trinary_function 00087 * This eval is for the a?b:c syntax, since it's not allowed to overload 00088 * these operators. 00089 */ 00090 template<class E1, class T2, class T3, std::size_t Rows, std::size_t Cols> 00091 inline 00092 XprMatrix< 00093 XprEval< 00094 XprMatrix<E1, Rows, Cols>, 00095 MatrixConstReference<T2, Rows, Cols>, 00096 MatrixConstReference<T3, Rows, Cols> 00097 >, 00098 Rows, Cols 00099 > 00100 eval(const XprMatrix<E1, Rows, Cols>& e1, 00101 const Matrix<T2, Rows, Cols>& m2, 00102 const Matrix<T3, Rows, Cols>& m3) { 00103 typedef XprEval< 00104 XprMatrix<E1, Rows, Cols>, 00105 MatrixConstReference<T2, Rows, Cols>, 00106 MatrixConstReference<T3, Rows, Cols> 00107 > expr_type; 00108 return XprMatrix<expr_type, Rows, Cols>( 00109 expr_type(e1, m2.const_ref(), m3.const_ref())); 00110 } 00111 00112 00113 /** 00114 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const Matrix<T2, Rows, Cols>& m2, const XprMatrix<E3, Rows, Cols>& e3) 00115 * \brief Evals the matrix expressions. 00116 * \ingroup _trinary_function 00117 * This eval is for the a?b:c syntax, since it's not allowed to overload 00118 * these operators. 00119 */ 00120 template<class E1, class T2, class E3, std::size_t Rows, std::size_t Cols> 00121 inline 00122 XprMatrix< 00123 XprEval< 00124 XprMatrix<E1, Rows, Cols>, 00125 MatrixConstReference<T2, Rows, Cols>, 00126 XprMatrix<E3, Rows, Cols> 00127 >, 00128 Rows, Cols 00129 > 00130 eval(const XprMatrix<E1, Rows, Cols>& e1, 00131 const Matrix<T2, Rows, Cols>& m2, 00132 const XprMatrix<E3, Rows, Cols>& e3) { 00133 typedef XprEval< 00134 XprMatrix<E1, Rows, Cols>, 00135 MatrixConstReference<T2, Rows, Cols>, 00136 XprMatrix<E3, Rows, Cols> 00137 > expr_type; 00138 return XprMatrix<expr_type, Rows, Cols>( 00139 expr_type(e1, m2.const_ref(), e3)); 00140 } 00141 00142 00143 /** 00144 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const Matrix<T3, Rows, Cols>& m3) 00145 * \brief Evals the matrix expressions. 00146 * \ingroup _trinary_function 00147 * This eval is for the a?b:c syntax, since it's not allowed to overload 00148 * these operators. 00149 */ 00150 template<class E1, class E2, class T3, std::size_t Rows, std::size_t Cols> 00151 inline 00152 XprMatrix< 00153 XprEval< 00154 XprMatrix<E1, Rows, Cols>, 00155 XprMatrix<E2, Rows, Cols>, 00156 MatrixConstReference<T3, Rows, Cols> 00157 >, 00158 Rows, Cols 00159 > 00160 eval(const XprMatrix<E1, Rows, Cols>& e1, 00161 const XprMatrix<E2, Rows, Cols>& e2, 00162 const Matrix<T3, Rows, Cols>& m3) { 00163 typedef XprEval< 00164 XprMatrix<E1, Rows, Cols>, 00165 XprMatrix<E2, Rows, Cols>, 00166 MatrixConstReference<T3, Rows, Cols> 00167 > expr_type; 00168 return XprMatrix<expr_type, Rows, Cols>( 00169 expr_type(e1, e2, m3.const_ref())); 00170 } 00171 00172 00173 /** 00174 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const XprMatrix<E3, Rows, Cols>& e3) 00175 * \brief Evals the matrix expressions. 00176 * \ingroup _trinary_function 00177 * This eval is for the a?b:c syntax, since it's not allowed to overload 00178 * these operators. 00179 */ 00180 template<class E1, class E2, class E3, std::size_t Rows, std::size_t Cols> 00181 inline 00182 XprMatrix< 00183 XprEval< 00184 XprMatrix<E1, Rows, Cols>, 00185 XprMatrix<E2, Rows, Cols>, 00186 XprMatrix<E3, Rows, Cols> 00187 >, 00188 Rows, Cols 00189 > 00190 eval(const XprMatrix<E1, Rows, Cols>& e1, 00191 const XprMatrix<E2, Rows, Cols>& e2, 00192 const XprMatrix<E3, Rows, Cols>& e3) { 00193 typedef XprEval< 00194 XprMatrix<E1, Rows, Cols>, 00195 XprMatrix<E2, Rows, Cols>, 00196 XprMatrix<E3, Rows, Cols> 00197 > expr_type; 00198 return XprMatrix<expr_type, Rows, Cols>(expr_type(e1, e2, e3)); 00199 } 00200 00201 00202 /* 00203 * trinary evaluation functions with matrizes, xpr of and POD 00204 * 00205 * XprMatrix<E, Rows, Cols> ? POD1 : POD2 00206 * XprMatrix<E1, Rows, Cols> ? POD : XprMatrix<E3, Rows, Cols> 00207 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : POD 00208 */ 00209 #define TVMET_IMPLEMENT_MACRO(POD) \ 00210 template<class E, std::size_t Rows, std::size_t Cols> \ 00211 inline \ 00212 XprMatrix< \ 00213 XprEval< \ 00214 XprMatrix<E, Rows, Cols>, \ 00215 XprLiteral< POD >, \ 00216 XprLiteral< POD > \ 00217 >, \ 00218 Rows, Cols \ 00219 > \ 00220 eval(const XprMatrix<E, Rows, Cols>& e, POD x2, POD x3) { \ 00221 typedef XprEval< \ 00222 XprMatrix<E, Rows, Cols>, \ 00223 XprLiteral< POD >, \ 00224 XprLiteral< POD > \ 00225 > expr_type; \ 00226 return XprMatrix<expr_type, Rows, Cols>( \ 00227 expr_type(e, XprLiteral< POD >(x2), XprLiteral< POD >(x3))); \ 00228 } \ 00229 \ 00230 template<class E1, class E3, std::size_t Rows, std::size_t Cols> \ 00231 inline \ 00232 XprMatrix< \ 00233 XprEval< \ 00234 XprMatrix<E1, Rows, Cols>, \ 00235 XprLiteral< POD >, \ 00236 XprMatrix<E3, Rows, Cols> \ 00237 >, \ 00238 Rows, Cols \ 00239 > \ 00240 eval(const XprMatrix<E1, Rows, Cols>& e1, POD x2, const XprMatrix<E3, Rows, Cols>& e3) { \ 00241 typedef XprEval< \ 00242 XprMatrix<E1, Rows, Cols>, \ 00243 XprLiteral< POD >, \ 00244 XprMatrix<E3, Rows, Cols> \ 00245 > expr_type; \ 00246 return XprMatrix<expr_type, Rows, Cols>( \ 00247 expr_type(e1, XprLiteral< POD >(x2), e3)); \ 00248 } \ 00249 \ 00250 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \ 00251 inline \ 00252 XprMatrix< \ 00253 XprEval< \ 00254 XprMatrix<E1, Rows, Cols>, \ 00255 XprMatrix<E2, Rows, Cols>, \ 00256 XprLiteral< POD > \ 00257 >, \ 00258 Rows, Cols \ 00259 > \ 00260 eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, POD x3) { \ 00261 typedef XprEval< \ 00262 XprMatrix<E1, Rows, Cols>, \ 00263 XprMatrix<E2, Rows, Cols>, \ 00264 XprLiteral< POD > \ 00265 > expr_type; \ 00266 return XprMatrix<expr_type, Rows, Cols>( \ 00267 expr_type(e1, e2, XprLiteral< POD >(x3))); \ 00268 } 00269 00270 TVMET_IMPLEMENT_MACRO(int) 00271 00272 #if defined(TVMET_HAVE_LONG_LONG) 00273 TVMET_IMPLEMENT_MACRO(long long int) 00274 #endif 00275 00276 TVMET_IMPLEMENT_MACRO(float) 00277 TVMET_IMPLEMENT_MACRO(double) 00278 00279 #if defined(TVMET_HAVE_LONG_DOUBLE) 00280 TVMET_IMPLEMENT_MACRO(long double) 00281 #endif 00282 00283 #undef TVMET_IMPLEMENT_MACRO 00284 00285 00286 /* 00287 * trinary evaluation functions with matrizes, xpr of and complex<> types 00288 * 00289 * XprMatrix<E, Rows, Cols> e, std::complex<T> z2, std::complex<T> z3 00290 * XprMatrix<E1, Rows, Cols> e1, std::complex<T> z2, XprMatrix<E3, Rows, Cols> e3 00291 * XprMatrix<E1, Rows, Cols> e1, XprMatrix<E2, Rows, Cols> e2, std::complex<T> z3 00292 */ 00293 #if defined(TVMET_HAVE_COMPLEX) 00294 00295 /** 00296 * \fn eval(const XprMatrix<E, Rows, Cols>& e, const std::complex<T>& x2, const std::complex<T>& x3) 00297 * \brief Evals the matrix expressions. 00298 * \ingroup _trinary_function 00299 * This eval is for the a?b:c syntax, since it's not allowed to overload 00300 * these operators. 00301 */ 00302 template<class E, std::size_t Rows, std::size_t Cols, class T> 00303 inline 00304 XprMatrix< 00305 XprEval< 00306 XprMatrix<E, Rows, Cols>, 00307 XprLiteral< std::complex<T> >, 00308 XprLiteral< std::complex<T> > 00309 >, 00310 Rows, Cols 00311 > 00312 eval(const XprMatrix<E, Rows, Cols>& e, const std::complex<T>& x2, const std::complex<T>& x3) { 00313 typedef XprEval< 00314 XprMatrix<E, Rows, Cols>, 00315 XprLiteral< std::complex<T> >, 00316 XprLiteral< std::complex<T> > 00317 > expr_type; 00318 return XprMatrix<expr_type, Rows, Cols>( 00319 expr_type(e, XprLiteral< std::complex<T> >(x2), XprLiteral< std::complex<T> >(x3))); 00320 } 00321 00322 00323 /** 00324 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const std::complex<T>& x2, const XprMatrix<E3, Rows, Cols>& e3) 00325 * \brief Evals the matrix expressions. 00326 * \ingroup _trinary_function 00327 * This eval is for the a?b:c syntax, since it's not allowed to overload 00328 * these operators. 00329 */ 00330 template<class E1, class E3, std::size_t Rows, std::size_t Cols, class T> 00331 inline 00332 XprMatrix< 00333 XprEval< 00334 XprMatrix<E1, Rows, Cols>, 00335 XprLiteral< std::complex<T> >, 00336 XprMatrix<E3, Rows, Cols> 00337 >, 00338 Rows, Cols 00339 > 00340 eval(const XprMatrix<E1, Rows, Cols>& e1, const std::complex<T>& x2, const XprMatrix<E3, Rows, Cols>& e3) { 00341 typedef XprEval< 00342 XprMatrix<E1, Rows, Cols>, 00343 XprLiteral< std::complex<T> >, 00344 XprMatrix<E3, Rows, Cols> 00345 > expr_type; 00346 return XprMatrix<expr_type, Rows, Cols>( 00347 expr_type(e1, XprLiteral< std::complex<T> >(x2), e3)); 00348 } 00349 00350 00351 /** 00352 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const std::complex<T>& x3) 00353 * \brief Evals the matrix expressions. 00354 * \ingroup _trinary_function 00355 * This eval is for the a?b:c syntax, since it's not allowed to overload 00356 * these operators. 00357 */ 00358 template<class E1, class E2, std::size_t Rows, std::size_t Cols, class T> 00359 inline 00360 XprMatrix< 00361 XprEval< 00362 XprMatrix<E1, Rows, Cols>, 00363 XprMatrix<E2, Rows, Cols>, 00364 XprLiteral< std::complex<T> > 00365 >, 00366 Rows, Cols 00367 > 00368 eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const std::complex<T>& x3) { 00369 typedef XprEval< 00370 XprMatrix<E1, Rows, Cols>, 00371 XprMatrix<E2, Rows, Cols>, 00372 XprLiteral< std::complex<T> > 00373 > expr_type; 00374 return XprMatrix<expr_type, Rows, Cols>( 00375 expr_type(e1, e2, XprLiteral< std::complex<T> >(x3))); 00376 } 00377 #endif // defined(TVMET_HAVE_COMPLEX) 00378 00379 00380 } // namespace tvmet 00381 00382 #endif // TVMET_MATRIX_EVAL_H 00383 00384 // Local Variables: 00385 // mode:C++ 00386 // tab-width:8 00387 // End:
Generated on Tue Jul 12 2022 21:02:13 by
1.7.2
