This is the Tiny Vector Matrix Expression Templates library found at http://tvmet.sourceforge.net. It is the fastest and most compact matrix lib out there (for < 10x10 matricies). I have done some minor tweaks to make it compile for mbed. For examples and hints on how to use, see: http://tvmet.sourceforge.net/usage.html

Dependents:   Eurobot_2012_Secondary

Committer:
madcowswe
Date:
Wed Mar 28 15:53:45 2012 +0000
Revision:
0:feb4117d16d8

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
madcowswe 0:feb4117d16d8 1 /*
madcowswe 0:feb4117d16d8 2 * Tiny Vector Matrix Library
madcowswe 0:feb4117d16d8 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
madcowswe 0:feb4117d16d8 4 *
madcowswe 0:feb4117d16d8 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
madcowswe 0:feb4117d16d8 6 *
madcowswe 0:feb4117d16d8 7 * This library is free software; you can redistribute it and/or
madcowswe 0:feb4117d16d8 8 * modify it under the terms of the GNU lesser General Public
madcowswe 0:feb4117d16d8 9 * License as published by the Free Software Foundation; either
madcowswe 0:feb4117d16d8 10 * version 2.1 of the License, or (at your option) any later version.
madcowswe 0:feb4117d16d8 11 *
madcowswe 0:feb4117d16d8 12 * This library is distributed in the hope that it will be useful,
madcowswe 0:feb4117d16d8 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
madcowswe 0:feb4117d16d8 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
madcowswe 0:feb4117d16d8 15 * lesser General Public License for more details.
madcowswe 0:feb4117d16d8 16 *
madcowswe 0:feb4117d16d8 17 * You should have received a copy of the GNU lesser General Public
madcowswe 0:feb4117d16d8 18 * License along with this library; if not, write to the Free Software
madcowswe 0:feb4117d16d8 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
madcowswe 0:feb4117d16d8 20 *
madcowswe 0:feb4117d16d8 21 * $Id: MatrixEval.h,v 1.18 2007-06-23 15:58:58 opetzold Exp $
madcowswe 0:feb4117d16d8 22 */
madcowswe 0:feb4117d16d8 23
madcowswe 0:feb4117d16d8 24 #ifndef TVMET_MATRIX_EVAL_H
madcowswe 0:feb4117d16d8 25 #define TVMET_MATRIX_EVAL_H
madcowswe 0:feb4117d16d8 26
madcowswe 0:feb4117d16d8 27 namespace tvmet {
madcowswe 0:feb4117d16d8 28
madcowswe 0:feb4117d16d8 29
madcowswe 0:feb4117d16d8 30 /**
madcowswe 0:feb4117d16d8 31 * \fn bool all_elements(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 32 * \brief check on statements for all elements
madcowswe 0:feb4117d16d8 33 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 34 * This is for use with boolean operators like
madcowswe 0:feb4117d16d8 35 * \par Example:
madcowswe 0:feb4117d16d8 36 * \code
madcowswe 0:feb4117d16d8 37 * all_elements(matrix > 0) {
madcowswe 0:feb4117d16d8 38 * // true branch
madcowswe 0:feb4117d16d8 39 * } else {
madcowswe 0:feb4117d16d8 40 * // false branch
madcowswe 0:feb4117d16d8 41 * }
madcowswe 0:feb4117d16d8 42 * \endcode
madcowswe 0:feb4117d16d8 43 * \sa \ref compare
madcowswe 0:feb4117d16d8 44 */
madcowswe 0:feb4117d16d8 45 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 46 inline
madcowswe 0:feb4117d16d8 47 bool all_elements(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 48 return meta::Matrix<Rows, Cols, 0, 0>::all_elements(e);
madcowswe 0:feb4117d16d8 49 }
madcowswe 0:feb4117d16d8 50
madcowswe 0:feb4117d16d8 51
madcowswe 0:feb4117d16d8 52 /**
madcowswe 0:feb4117d16d8 53 * \fn bool any_elements(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 54 * \brief check on statements for any elements
madcowswe 0:feb4117d16d8 55 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 56 * This is for use with boolean operators like
madcowswe 0:feb4117d16d8 57 * \par Example:
madcowswe 0:feb4117d16d8 58 * \code
madcowswe 0:feb4117d16d8 59 * any_elements(matrix > 0) {
madcowswe 0:feb4117d16d8 60 * // true branch
madcowswe 0:feb4117d16d8 61 * } else {
madcowswe 0:feb4117d16d8 62 * // false branch
madcowswe 0:feb4117d16d8 63 * }
madcowswe 0:feb4117d16d8 64 * \endcode
madcowswe 0:feb4117d16d8 65 * \sa \ref compare
madcowswe 0:feb4117d16d8 66 */
madcowswe 0:feb4117d16d8 67 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 68 inline
madcowswe 0:feb4117d16d8 69 bool any_elements(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 70 return meta::Matrix<Rows, Cols, 0, 0>::any_elements(e);
madcowswe 0:feb4117d16d8 71 }
madcowswe 0:feb4117d16d8 72
madcowswe 0:feb4117d16d8 73
madcowswe 0:feb4117d16d8 74 /*
madcowswe 0:feb4117d16d8 75 * trinary evaluation functions with matrizes and xpr of
madcowswe 0:feb4117d16d8 76 *
madcowswe 0:feb4117d16d8 77 * XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : Matrix<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 78 * XprMatrix<E1, Rows, Cols> ? Matrix<T2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 79 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : Matrix<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 80 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 81 */
madcowswe 0:feb4117d16d8 82
madcowswe 0:feb4117d16d8 83 /**
madcowswe 0:feb4117d16d8 84 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const Matrix<T2, Rows, Cols>& m2, const Matrix<T3, Rows, Cols>& m3)
madcowswe 0:feb4117d16d8 85 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 86 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 87 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 88 * these operators.
madcowswe 0:feb4117d16d8 89 */
madcowswe 0:feb4117d16d8 90 template<class E1, class T2, class T3, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 91 inline
madcowswe 0:feb4117d16d8 92 XprMatrix<
madcowswe 0:feb4117d16d8 93 XprEval<
madcowswe 0:feb4117d16d8 94 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 95 MatrixConstReference<T2, Rows, Cols>,
madcowswe 0:feb4117d16d8 96 MatrixConstReference<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 97 >,
madcowswe 0:feb4117d16d8 98 Rows, Cols
madcowswe 0:feb4117d16d8 99 >
madcowswe 0:feb4117d16d8 100 eval(const XprMatrix<E1, Rows, Cols>& e1,
madcowswe 0:feb4117d16d8 101 const Matrix<T2, Rows, Cols>& m2,
madcowswe 0:feb4117d16d8 102 const Matrix<T3, Rows, Cols>& m3) {
madcowswe 0:feb4117d16d8 103 typedef XprEval<
madcowswe 0:feb4117d16d8 104 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 105 MatrixConstReference<T2, Rows, Cols>,
madcowswe 0:feb4117d16d8 106 MatrixConstReference<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 107 > expr_type;
madcowswe 0:feb4117d16d8 108 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 109 expr_type(e1, m2.const_ref(), m3.const_ref()));
madcowswe 0:feb4117d16d8 110 }
madcowswe 0:feb4117d16d8 111
madcowswe 0:feb4117d16d8 112
madcowswe 0:feb4117d16d8 113 /**
madcowswe 0:feb4117d16d8 114 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const Matrix<T2, Rows, Cols>& m2, const XprMatrix<E3, Rows, Cols>& e3)
madcowswe 0:feb4117d16d8 115 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 116 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 117 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 118 * these operators.
madcowswe 0:feb4117d16d8 119 */
madcowswe 0:feb4117d16d8 120 template<class E1, class T2, class E3, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 121 inline
madcowswe 0:feb4117d16d8 122 XprMatrix<
madcowswe 0:feb4117d16d8 123 XprEval<
madcowswe 0:feb4117d16d8 124 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 125 MatrixConstReference<T2, Rows, Cols>,
madcowswe 0:feb4117d16d8 126 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 127 >,
madcowswe 0:feb4117d16d8 128 Rows, Cols
madcowswe 0:feb4117d16d8 129 >
madcowswe 0:feb4117d16d8 130 eval(const XprMatrix<E1, Rows, Cols>& e1,
madcowswe 0:feb4117d16d8 131 const Matrix<T2, Rows, Cols>& m2,
madcowswe 0:feb4117d16d8 132 const XprMatrix<E3, Rows, Cols>& e3) {
madcowswe 0:feb4117d16d8 133 typedef XprEval<
madcowswe 0:feb4117d16d8 134 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 135 MatrixConstReference<T2, Rows, Cols>,
madcowswe 0:feb4117d16d8 136 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 137 > expr_type;
madcowswe 0:feb4117d16d8 138 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 139 expr_type(e1, m2.const_ref(), e3));
madcowswe 0:feb4117d16d8 140 }
madcowswe 0:feb4117d16d8 141
madcowswe 0:feb4117d16d8 142
madcowswe 0:feb4117d16d8 143 /**
madcowswe 0:feb4117d16d8 144 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const Matrix<T3, Rows, Cols>& m3)
madcowswe 0:feb4117d16d8 145 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 146 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 147 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 148 * these operators.
madcowswe 0:feb4117d16d8 149 */
madcowswe 0:feb4117d16d8 150 template<class E1, class E2, class T3, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 151 inline
madcowswe 0:feb4117d16d8 152 XprMatrix<
madcowswe 0:feb4117d16d8 153 XprEval<
madcowswe 0:feb4117d16d8 154 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 155 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 156 MatrixConstReference<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 157 >,
madcowswe 0:feb4117d16d8 158 Rows, Cols
madcowswe 0:feb4117d16d8 159 >
madcowswe 0:feb4117d16d8 160 eval(const XprMatrix<E1, Rows, Cols>& e1,
madcowswe 0:feb4117d16d8 161 const XprMatrix<E2, Rows, Cols>& e2,
madcowswe 0:feb4117d16d8 162 const Matrix<T3, Rows, Cols>& m3) {
madcowswe 0:feb4117d16d8 163 typedef XprEval<
madcowswe 0:feb4117d16d8 164 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 165 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 166 MatrixConstReference<T3, Rows, Cols>
madcowswe 0:feb4117d16d8 167 > expr_type;
madcowswe 0:feb4117d16d8 168 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 169 expr_type(e1, e2, m3.const_ref()));
madcowswe 0:feb4117d16d8 170 }
madcowswe 0:feb4117d16d8 171
madcowswe 0:feb4117d16d8 172
madcowswe 0:feb4117d16d8 173 /**
madcowswe 0:feb4117d16d8 174 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const XprMatrix<E3, Rows, Cols>& e3)
madcowswe 0:feb4117d16d8 175 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 176 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 177 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 178 * these operators.
madcowswe 0:feb4117d16d8 179 */
madcowswe 0:feb4117d16d8 180 template<class E1, class E2, class E3, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 181 inline
madcowswe 0:feb4117d16d8 182 XprMatrix<
madcowswe 0:feb4117d16d8 183 XprEval<
madcowswe 0:feb4117d16d8 184 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 185 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 186 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 187 >,
madcowswe 0:feb4117d16d8 188 Rows, Cols
madcowswe 0:feb4117d16d8 189 >
madcowswe 0:feb4117d16d8 190 eval(const XprMatrix<E1, Rows, Cols>& e1,
madcowswe 0:feb4117d16d8 191 const XprMatrix<E2, Rows, Cols>& e2,
madcowswe 0:feb4117d16d8 192 const XprMatrix<E3, Rows, Cols>& e3) {
madcowswe 0:feb4117d16d8 193 typedef XprEval<
madcowswe 0:feb4117d16d8 194 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 195 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 196 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 197 > expr_type;
madcowswe 0:feb4117d16d8 198 return XprMatrix<expr_type, Rows, Cols>(expr_type(e1, e2, e3));
madcowswe 0:feb4117d16d8 199 }
madcowswe 0:feb4117d16d8 200
madcowswe 0:feb4117d16d8 201
madcowswe 0:feb4117d16d8 202 /*
madcowswe 0:feb4117d16d8 203 * trinary evaluation functions with matrizes, xpr of and POD
madcowswe 0:feb4117d16d8 204 *
madcowswe 0:feb4117d16d8 205 * XprMatrix<E, Rows, Cols> ? POD1 : POD2
madcowswe 0:feb4117d16d8 206 * XprMatrix<E1, Rows, Cols> ? POD : XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 207 * XprMatrix<E1, Rows, Cols> ? XprMatrix<E2, Rows, Cols> : POD
madcowswe 0:feb4117d16d8 208 */
madcowswe 0:feb4117d16d8 209 #define TVMET_IMPLEMENT_MACRO(POD) \
madcowswe 0:feb4117d16d8 210 template<class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 211 inline \
madcowswe 0:feb4117d16d8 212 XprMatrix< \
madcowswe 0:feb4117d16d8 213 XprEval< \
madcowswe 0:feb4117d16d8 214 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 215 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 216 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 217 >, \
madcowswe 0:feb4117d16d8 218 Rows, Cols \
madcowswe 0:feb4117d16d8 219 > \
madcowswe 0:feb4117d16d8 220 eval(const XprMatrix<E, Rows, Cols>& e, POD x2, POD x3) { \
madcowswe 0:feb4117d16d8 221 typedef XprEval< \
madcowswe 0:feb4117d16d8 222 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 223 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 224 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 225 > expr_type; \
madcowswe 0:feb4117d16d8 226 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 227 expr_type(e, XprLiteral< POD >(x2), XprLiteral< POD >(x3))); \
madcowswe 0:feb4117d16d8 228 } \
madcowswe 0:feb4117d16d8 229 \
madcowswe 0:feb4117d16d8 230 template<class E1, class E3, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 231 inline \
madcowswe 0:feb4117d16d8 232 XprMatrix< \
madcowswe 0:feb4117d16d8 233 XprEval< \
madcowswe 0:feb4117d16d8 234 XprMatrix<E1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 235 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 236 XprMatrix<E3, Rows, Cols> \
madcowswe 0:feb4117d16d8 237 >, \
madcowswe 0:feb4117d16d8 238 Rows, Cols \
madcowswe 0:feb4117d16d8 239 > \
madcowswe 0:feb4117d16d8 240 eval(const XprMatrix<E1, Rows, Cols>& e1, POD x2, const XprMatrix<E3, Rows, Cols>& e3) { \
madcowswe 0:feb4117d16d8 241 typedef XprEval< \
madcowswe 0:feb4117d16d8 242 XprMatrix<E1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 243 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 244 XprMatrix<E3, Rows, Cols> \
madcowswe 0:feb4117d16d8 245 > expr_type; \
madcowswe 0:feb4117d16d8 246 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 247 expr_type(e1, XprLiteral< POD >(x2), e3)); \
madcowswe 0:feb4117d16d8 248 } \
madcowswe 0:feb4117d16d8 249 \
madcowswe 0:feb4117d16d8 250 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 251 inline \
madcowswe 0:feb4117d16d8 252 XprMatrix< \
madcowswe 0:feb4117d16d8 253 XprEval< \
madcowswe 0:feb4117d16d8 254 XprMatrix<E1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 255 XprMatrix<E2, Rows, Cols>, \
madcowswe 0:feb4117d16d8 256 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 257 >, \
madcowswe 0:feb4117d16d8 258 Rows, Cols \
madcowswe 0:feb4117d16d8 259 > \
madcowswe 0:feb4117d16d8 260 eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, POD x3) { \
madcowswe 0:feb4117d16d8 261 typedef XprEval< \
madcowswe 0:feb4117d16d8 262 XprMatrix<E1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 263 XprMatrix<E2, Rows, Cols>, \
madcowswe 0:feb4117d16d8 264 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 265 > expr_type; \
madcowswe 0:feb4117d16d8 266 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 267 expr_type(e1, e2, XprLiteral< POD >(x3))); \
madcowswe 0:feb4117d16d8 268 }
madcowswe 0:feb4117d16d8 269
madcowswe 0:feb4117d16d8 270 TVMET_IMPLEMENT_MACRO(int)
madcowswe 0:feb4117d16d8 271
madcowswe 0:feb4117d16d8 272 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 273 TVMET_IMPLEMENT_MACRO(long long int)
madcowswe 0:feb4117d16d8 274 #endif
madcowswe 0:feb4117d16d8 275
madcowswe 0:feb4117d16d8 276 TVMET_IMPLEMENT_MACRO(float)
madcowswe 0:feb4117d16d8 277 TVMET_IMPLEMENT_MACRO(double)
madcowswe 0:feb4117d16d8 278
madcowswe 0:feb4117d16d8 279 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 280 TVMET_IMPLEMENT_MACRO(long double)
madcowswe 0:feb4117d16d8 281 #endif
madcowswe 0:feb4117d16d8 282
madcowswe 0:feb4117d16d8 283 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 284
madcowswe 0:feb4117d16d8 285
madcowswe 0:feb4117d16d8 286 /*
madcowswe 0:feb4117d16d8 287 * trinary evaluation functions with matrizes, xpr of and complex<> types
madcowswe 0:feb4117d16d8 288 *
madcowswe 0:feb4117d16d8 289 * XprMatrix<E, Rows, Cols> e, std::complex<T> z2, std::complex<T> z3
madcowswe 0:feb4117d16d8 290 * XprMatrix<E1, Rows, Cols> e1, std::complex<T> z2, XprMatrix<E3, Rows, Cols> e3
madcowswe 0:feb4117d16d8 291 * XprMatrix<E1, Rows, Cols> e1, XprMatrix<E2, Rows, Cols> e2, std::complex<T> z3
madcowswe 0:feb4117d16d8 292 */
madcowswe 0:feb4117d16d8 293 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 294
madcowswe 0:feb4117d16d8 295 /**
madcowswe 0:feb4117d16d8 296 * \fn eval(const XprMatrix<E, Rows, Cols>& e, const std::complex<T>& x2, const std::complex<T>& x3)
madcowswe 0:feb4117d16d8 297 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 298 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 299 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 300 * these operators.
madcowswe 0:feb4117d16d8 301 */
madcowswe 0:feb4117d16d8 302 template<class E, std::size_t Rows, std::size_t Cols, class T>
madcowswe 0:feb4117d16d8 303 inline
madcowswe 0:feb4117d16d8 304 XprMatrix<
madcowswe 0:feb4117d16d8 305 XprEval<
madcowswe 0:feb4117d16d8 306 XprMatrix<E, Rows, Cols>,
madcowswe 0:feb4117d16d8 307 XprLiteral< std::complex<T> >,
madcowswe 0:feb4117d16d8 308 XprLiteral< std::complex<T> >
madcowswe 0:feb4117d16d8 309 >,
madcowswe 0:feb4117d16d8 310 Rows, Cols
madcowswe 0:feb4117d16d8 311 >
madcowswe 0:feb4117d16d8 312 eval(const XprMatrix<E, Rows, Cols>& e, const std::complex<T>& x2, const std::complex<T>& x3) {
madcowswe 0:feb4117d16d8 313 typedef XprEval<
madcowswe 0:feb4117d16d8 314 XprMatrix<E, Rows, Cols>,
madcowswe 0:feb4117d16d8 315 XprLiteral< std::complex<T> >,
madcowswe 0:feb4117d16d8 316 XprLiteral< std::complex<T> >
madcowswe 0:feb4117d16d8 317 > expr_type;
madcowswe 0:feb4117d16d8 318 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 319 expr_type(e, XprLiteral< std::complex<T> >(x2), XprLiteral< std::complex<T> >(x3)));
madcowswe 0:feb4117d16d8 320 }
madcowswe 0:feb4117d16d8 321
madcowswe 0:feb4117d16d8 322
madcowswe 0:feb4117d16d8 323 /**
madcowswe 0:feb4117d16d8 324 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const std::complex<T>& x2, const XprMatrix<E3, Rows, Cols>& e3)
madcowswe 0:feb4117d16d8 325 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 326 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 327 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 328 * these operators.
madcowswe 0:feb4117d16d8 329 */
madcowswe 0:feb4117d16d8 330 template<class E1, class E3, std::size_t Rows, std::size_t Cols, class T>
madcowswe 0:feb4117d16d8 331 inline
madcowswe 0:feb4117d16d8 332 XprMatrix<
madcowswe 0:feb4117d16d8 333 XprEval<
madcowswe 0:feb4117d16d8 334 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 335 XprLiteral< std::complex<T> >,
madcowswe 0:feb4117d16d8 336 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 337 >,
madcowswe 0:feb4117d16d8 338 Rows, Cols
madcowswe 0:feb4117d16d8 339 >
madcowswe 0:feb4117d16d8 340 eval(const XprMatrix<E1, Rows, Cols>& e1, const std::complex<T>& x2, const XprMatrix<E3, Rows, Cols>& e3) {
madcowswe 0:feb4117d16d8 341 typedef XprEval<
madcowswe 0:feb4117d16d8 342 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 343 XprLiteral< std::complex<T> >,
madcowswe 0:feb4117d16d8 344 XprMatrix<E3, Rows, Cols>
madcowswe 0:feb4117d16d8 345 > expr_type;
madcowswe 0:feb4117d16d8 346 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 347 expr_type(e1, XprLiteral< std::complex<T> >(x2), e3));
madcowswe 0:feb4117d16d8 348 }
madcowswe 0:feb4117d16d8 349
madcowswe 0:feb4117d16d8 350
madcowswe 0:feb4117d16d8 351 /**
madcowswe 0:feb4117d16d8 352 * \fn eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const std::complex<T>& x3)
madcowswe 0:feb4117d16d8 353 * \brief Evals the matrix expressions.
madcowswe 0:feb4117d16d8 354 * \ingroup _trinary_function
madcowswe 0:feb4117d16d8 355 * This eval is for the a?b:c syntax, since it's not allowed to overload
madcowswe 0:feb4117d16d8 356 * these operators.
madcowswe 0:feb4117d16d8 357 */
madcowswe 0:feb4117d16d8 358 template<class E1, class E2, std::size_t Rows, std::size_t Cols, class T>
madcowswe 0:feb4117d16d8 359 inline
madcowswe 0:feb4117d16d8 360 XprMatrix<
madcowswe 0:feb4117d16d8 361 XprEval<
madcowswe 0:feb4117d16d8 362 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 363 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 364 XprLiteral< std::complex<T> >
madcowswe 0:feb4117d16d8 365 >,
madcowswe 0:feb4117d16d8 366 Rows, Cols
madcowswe 0:feb4117d16d8 367 >
madcowswe 0:feb4117d16d8 368 eval(const XprMatrix<E1, Rows, Cols>& e1, const XprMatrix<E2, Rows, Cols>& e2, const std::complex<T>& x3) {
madcowswe 0:feb4117d16d8 369 typedef XprEval<
madcowswe 0:feb4117d16d8 370 XprMatrix<E1, Rows, Cols>,
madcowswe 0:feb4117d16d8 371 XprMatrix<E2, Rows, Cols>,
madcowswe 0:feb4117d16d8 372 XprLiteral< std::complex<T> >
madcowswe 0:feb4117d16d8 373 > expr_type;
madcowswe 0:feb4117d16d8 374 return XprMatrix<expr_type, Rows, Cols>(
madcowswe 0:feb4117d16d8 375 expr_type(e1, e2, XprLiteral< std::complex<T> >(x3)));
madcowswe 0:feb4117d16d8 376 }
madcowswe 0:feb4117d16d8 377 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 378
madcowswe 0:feb4117d16d8 379
madcowswe 0:feb4117d16d8 380 } // namespace tvmet
madcowswe 0:feb4117d16d8 381
madcowswe 0:feb4117d16d8 382 #endif // TVMET_MATRIX_EVAL_H
madcowswe 0:feb4117d16d8 383
madcowswe 0:feb4117d16d8 384 // Local Variables:
madcowswe 0:feb4117d16d8 385 // mode:C++
madcowswe 0:feb4117d16d8 386 // tab-width:8
madcowswe 0:feb4117d16d8 387 // End: