Eurobot2012_Primary

Dependencies:   mbed Eurobot_2012_Primary

Committer:
narshu
Date:
Wed Oct 17 22:22:28 2012 +0000
Revision:
25:143b19c1fb05
Commit before publishing;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
narshu 25:143b19c1fb05 1 /*
narshu 25:143b19c1fb05 2 * Tiny Vector Matrix Library
narshu 25:143b19c1fb05 3 * Dense Vector Matrix Libary of Tiny size using Expression Templates
narshu 25:143b19c1fb05 4 *
narshu 25:143b19c1fb05 5 * Copyright (C) 2001 - 2007 Olaf Petzold <opetzold@users.sourceforge.net>
narshu 25:143b19c1fb05 6 *
narshu 25:143b19c1fb05 7 * This library is free software; you can redistribute it and/or
narshu 25:143b19c1fb05 8 * modify it under the terms of the GNU lesser General Public
narshu 25:143b19c1fb05 9 * License as published by the Free Software Foundation; either
narshu 25:143b19c1fb05 10 * version 2.1 of the License, or (at your option) any later version.
narshu 25:143b19c1fb05 11 *
narshu 25:143b19c1fb05 12 * This library is distributed in the hope that it will be useful,
narshu 25:143b19c1fb05 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
narshu 25:143b19c1fb05 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
narshu 25:143b19c1fb05 15 * lesser General Public License for more details.
narshu 25:143b19c1fb05 16 *
narshu 25:143b19c1fb05 17 * You should have received a copy of the GNU lesser General Public
narshu 25:143b19c1fb05 18 * License along with this library; if not, write to the Free Software
narshu 25:143b19c1fb05 19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
narshu 25:143b19c1fb05 20 *
narshu 25:143b19c1fb05 21 * $Id: MatrixFunctions.h,v 1.44 2007-06-23 15:59:00 opetzold Exp $
narshu 25:143b19c1fb05 22 */
narshu 25:143b19c1fb05 23
narshu 25:143b19c1fb05 24 #ifndef TVMET_XPR_MATRIX_FUNCTIONS_H
narshu 25:143b19c1fb05 25 #define TVMET_XPR_MATRIX_FUNCTIONS_H
narshu 25:143b19c1fb05 26
narshu 25:143b19c1fb05 27 namespace tvmet {
narshu 25:143b19c1fb05 28
narshu 25:143b19c1fb05 29
narshu 25:143b19c1fb05 30 /* forwards */
narshu 25:143b19c1fb05 31 template<class T, std::size_t Rows, std::size_t Cols> class Matrix;
narshu 25:143b19c1fb05 32 template<class T, std::size_t Sz> class Vector;
narshu 25:143b19c1fb05 33 template<class E, std::size_t Sz> class XprVector;
narshu 25:143b19c1fb05 34 template<class E> class XprMatrixTranspose;
narshu 25:143b19c1fb05 35 template<class E, std::size_t Sz> class XprMatrixDiag;
narshu 25:143b19c1fb05 36 template<class E, std::size_t Rows, std::size_t Cols> class XprMatrixRow;
narshu 25:143b19c1fb05 37 template<class E, std::size_t Rows, std::size_t Cols> class XprMatrixCol;
narshu 25:143b19c1fb05 38
narshu 25:143b19c1fb05 39
narshu 25:143b19c1fb05 40 /*********************************************************
narshu 25:143b19c1fb05 41 * PART I: DECLARATION
narshu 25:143b19c1fb05 42 *********************************************************/
narshu 25:143b19c1fb05 43
narshu 25:143b19c1fb05 44
narshu 25:143b19c1fb05 45 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 46 * Matrix arithmetic functions add, sub, mul and div
narshu 25:143b19c1fb05 47 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 48
narshu 25:143b19c1fb05 49
narshu 25:143b19c1fb05 50 /*
narshu 25:143b19c1fb05 51 * function(XprMatrix<E1, Rows, Cols>, XprMatrix<E2, Rows, Cols>)
narshu 25:143b19c1fb05 52 */
narshu 25:143b19c1fb05 53 #define TVMET_DECLARE_MACRO(NAME) \
narshu 25:143b19c1fb05 54 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 55 XprMatrix< \
narshu 25:143b19c1fb05 56 XprBinOp< \
narshu 25:143b19c1fb05 57 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 25:143b19c1fb05 58 XprMatrix<E1, Rows, Cols>, \
narshu 25:143b19c1fb05 59 XprMatrix<E2, Rows, Cols> \
narshu 25:143b19c1fb05 60 >, \
narshu 25:143b19c1fb05 61 Rows, Cols \
narshu 25:143b19c1fb05 62 > \
narshu 25:143b19c1fb05 63 NAME (const XprMatrix<E1, Rows, Cols>& lhs, \
narshu 25:143b19c1fb05 64 const XprMatrix<E2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 65
narshu 25:143b19c1fb05 66 TVMET_DECLARE_MACRO(add) // per se element wise
narshu 25:143b19c1fb05 67 TVMET_DECLARE_MACRO(sub) // per se element wise
narshu 25:143b19c1fb05 68 namespace element_wise {
narshu 25:143b19c1fb05 69 TVMET_DECLARE_MACRO(mul) // not defined for matrizes
narshu 25:143b19c1fb05 70 TVMET_DECLARE_MACRO(div) // not defined for matrizes
narshu 25:143b19c1fb05 71 }
narshu 25:143b19c1fb05 72
narshu 25:143b19c1fb05 73 #undef TVMET_DECLARE_MACRO
narshu 25:143b19c1fb05 74
narshu 25:143b19c1fb05 75
narshu 25:143b19c1fb05 76 /*
narshu 25:143b19c1fb05 77 * function(XprMatrix<E, Rows, Cols>, POD)
narshu 25:143b19c1fb05 78 * function(POD, XprMatrix<E, Rows, Cols>)
narshu 25:143b19c1fb05 79 * Note: - operations +,-,*,/ are per se element wise
narshu 25:143b19c1fb05 80 */
narshu 25:143b19c1fb05 81 #define TVMET_DECLARE_MACRO(NAME, POD) \
narshu 25:143b19c1fb05 82 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 83 XprMatrix< \
narshu 25:143b19c1fb05 84 XprBinOp< \
narshu 25:143b19c1fb05 85 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 25:143b19c1fb05 86 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 87 XprLiteral< POD > \
narshu 25:143b19c1fb05 88 >, \
narshu 25:143b19c1fb05 89 Rows, Cols \
narshu 25:143b19c1fb05 90 > \
narshu 25:143b19c1fb05 91 NAME (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 25:143b19c1fb05 92 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 25:143b19c1fb05 93 \
narshu 25:143b19c1fb05 94 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 95 XprMatrix< \
narshu 25:143b19c1fb05 96 XprBinOp< \
narshu 25:143b19c1fb05 97 Fcnl_##NAME< POD, typename E::value_type>, \
narshu 25:143b19c1fb05 98 XprLiteral< POD >, \
narshu 25:143b19c1fb05 99 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 100 >, \
narshu 25:143b19c1fb05 101 Rows, Cols \
narshu 25:143b19c1fb05 102 > \
narshu 25:143b19c1fb05 103 NAME (POD lhs, \
narshu 25:143b19c1fb05 104 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 105
narshu 25:143b19c1fb05 106 TVMET_DECLARE_MACRO(add, int)
narshu 25:143b19c1fb05 107 TVMET_DECLARE_MACRO(sub, int)
narshu 25:143b19c1fb05 108 TVMET_DECLARE_MACRO(mul, int)
narshu 25:143b19c1fb05 109 TVMET_DECLARE_MACRO(div, int)
narshu 25:143b19c1fb05 110
narshu 25:143b19c1fb05 111 #if defined(TVMET_HAVE_LONG_LONG)
narshu 25:143b19c1fb05 112 TVMET_DECLARE_MACRO(add, long long int)
narshu 25:143b19c1fb05 113 TVMET_DECLARE_MACRO(sub, long long int)
narshu 25:143b19c1fb05 114 TVMET_DECLARE_MACRO(mul, long long int)
narshu 25:143b19c1fb05 115 TVMET_DECLARE_MACRO(div, long long int)
narshu 25:143b19c1fb05 116 #endif
narshu 25:143b19c1fb05 117
narshu 25:143b19c1fb05 118 TVMET_DECLARE_MACRO(add, float)
narshu 25:143b19c1fb05 119 TVMET_DECLARE_MACRO(sub, float)
narshu 25:143b19c1fb05 120 TVMET_DECLARE_MACRO(mul, float)
narshu 25:143b19c1fb05 121 TVMET_DECLARE_MACRO(div, float)
narshu 25:143b19c1fb05 122
narshu 25:143b19c1fb05 123 TVMET_DECLARE_MACRO(add, double)
narshu 25:143b19c1fb05 124 TVMET_DECLARE_MACRO(sub, double)
narshu 25:143b19c1fb05 125 TVMET_DECLARE_MACRO(mul, double)
narshu 25:143b19c1fb05 126 TVMET_DECLARE_MACRO(div, double)
narshu 25:143b19c1fb05 127
narshu 25:143b19c1fb05 128 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 25:143b19c1fb05 129 TVMET_DECLARE_MACRO(add, long double)
narshu 25:143b19c1fb05 130 TVMET_DECLARE_MACRO(sub, long double)
narshu 25:143b19c1fb05 131 TVMET_DECLARE_MACRO(mul, long double)
narshu 25:143b19c1fb05 132 TVMET_DECLARE_MACRO(div, long double)
narshu 25:143b19c1fb05 133 #endif
narshu 25:143b19c1fb05 134
narshu 25:143b19c1fb05 135 #undef TVMET_DECLARE_MACRO
narshu 25:143b19c1fb05 136
narshu 25:143b19c1fb05 137
narshu 25:143b19c1fb05 138 #if defined(TVMET_HAVE_COMPLEX)
narshu 25:143b19c1fb05 139 /*
narshu 25:143b19c1fb05 140 * function(XprMatrix<E, Rows, Cols>, complex<T>)
narshu 25:143b19c1fb05 141 * function(complex<T>, XprMatrix<E, Rows, Cols>)
narshu 25:143b19c1fb05 142 * Note: - operations +,-,*,/ are per se element wise
narshu 25:143b19c1fb05 143 * \todo type promotion
narshu 25:143b19c1fb05 144 */
narshu 25:143b19c1fb05 145 #define TVMET_DECLARE_MACRO(NAME) \
narshu 25:143b19c1fb05 146 template<class E, class T, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 147 XprMatrix< \
narshu 25:143b19c1fb05 148 XprBinOp< \
narshu 25:143b19c1fb05 149 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 25:143b19c1fb05 150 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 151 XprLiteral< std::complex<T> > \
narshu 25:143b19c1fb05 152 >, \
narshu 25:143b19c1fb05 153 Rows, Cols \
narshu 25:143b19c1fb05 154 > \
narshu 25:143b19c1fb05 155 NAME (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 25:143b19c1fb05 156 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
narshu 25:143b19c1fb05 157 \
narshu 25:143b19c1fb05 158 template<class T, class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 159 XprMatrix< \
narshu 25:143b19c1fb05 160 XprBinOp< \
narshu 25:143b19c1fb05 161 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \
narshu 25:143b19c1fb05 162 XprLiteral< std::complex<T> >, \
narshu 25:143b19c1fb05 163 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 164 >, \
narshu 25:143b19c1fb05 165 Rows, Cols \
narshu 25:143b19c1fb05 166 > \
narshu 25:143b19c1fb05 167 NAME (const std::complex<T>& lhs, \
narshu 25:143b19c1fb05 168 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 169
narshu 25:143b19c1fb05 170 TVMET_DECLARE_MACRO(add)
narshu 25:143b19c1fb05 171 TVMET_DECLARE_MACRO(sub)
narshu 25:143b19c1fb05 172 TVMET_DECLARE_MACRO(mul)
narshu 25:143b19c1fb05 173 TVMET_DECLARE_MACRO(div)
narshu 25:143b19c1fb05 174
narshu 25:143b19c1fb05 175 #undef TVMET_DECLARE_MACRO
narshu 25:143b19c1fb05 176
narshu 25:143b19c1fb05 177 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 25:143b19c1fb05 178
narshu 25:143b19c1fb05 179
narshu 25:143b19c1fb05 180 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 181 * matrix prod( ... ) functions
narshu 25:143b19c1fb05 182 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 183
narshu 25:143b19c1fb05 184
narshu 25:143b19c1fb05 185 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 186 class E2, std::size_t Cols2>
narshu 25:143b19c1fb05 187 XprMatrix<
narshu 25:143b19c1fb05 188 XprMMProduct<
narshu 25:143b19c1fb05 189 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 190 XprMatrix<E2, Cols1, Cols2>, Cols2
narshu 25:143b19c1fb05 191 >,
narshu 25:143b19c1fb05 192 Rows1, Cols2 // return Dim
narshu 25:143b19c1fb05 193 >
narshu 25:143b19c1fb05 194 prod(const XprMatrix<E1, Rows1, Cols1>& lhs,
narshu 25:143b19c1fb05 195 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 196
narshu 25:143b19c1fb05 197
narshu 25:143b19c1fb05 198 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 199 class E2, std::size_t Cols2>
narshu 25:143b19c1fb05 200 XprMatrix<
narshu 25:143b19c1fb05 201 XprMMProductTransposed<
narshu 25:143b19c1fb05 202 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 203 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
narshu 25:143b19c1fb05 204 >,
narshu 25:143b19c1fb05 205 Cols2, Rows1 // return Dim
narshu 25:143b19c1fb05 206 >
narshu 25:143b19c1fb05 207 trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs,
narshu 25:143b19c1fb05 208 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 209
narshu 25:143b19c1fb05 210
narshu 25:143b19c1fb05 211 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 212 class E2, std::size_t Cols2> // Rows2 = Rows1
narshu 25:143b19c1fb05 213 XprMatrix<
narshu 25:143b19c1fb05 214 XprMtMProduct<
narshu 25:143b19c1fb05 215 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 216 XprMatrix<E2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2)
narshu 25:143b19c1fb05 217 >,
narshu 25:143b19c1fb05 218 Cols1, Cols2 // return Dim
narshu 25:143b19c1fb05 219 >
narshu 25:143b19c1fb05 220 MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs,
narshu 25:143b19c1fb05 221 const XprMatrix<E2, Rows1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 222
narshu 25:143b19c1fb05 223
narshu 25:143b19c1fb05 224 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 225 class E2, std::size_t Rows2> // Cols2 = Cols1
narshu 25:143b19c1fb05 226 XprMatrix<
narshu 25:143b19c1fb05 227 XprMMtProduct<
narshu 25:143b19c1fb05 228 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 229 XprMatrix<E2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1)
narshu 25:143b19c1fb05 230 >,
narshu 25:143b19c1fb05 231 Rows1, Rows2 // return Dim
narshu 25:143b19c1fb05 232 >
narshu 25:143b19c1fb05 233 MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs,
narshu 25:143b19c1fb05 234 const XprMatrix<E2, Rows2, Cols1>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 235
narshu 25:143b19c1fb05 236
narshu 25:143b19c1fb05 237 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 238 * matrix-vector specific prod( ... ) functions
narshu 25:143b19c1fb05 239 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 240
narshu 25:143b19c1fb05 241
narshu 25:143b19c1fb05 242 template<class E1, std::size_t Rows, std::size_t Cols,
narshu 25:143b19c1fb05 243 class E2>
narshu 25:143b19c1fb05 244 XprVector<
narshu 25:143b19c1fb05 245 XprMVProduct<
narshu 25:143b19c1fb05 246 XprMatrix<E1, Rows, Cols>, Rows, Cols,
narshu 25:143b19c1fb05 247 XprVector<E2, Cols>
narshu 25:143b19c1fb05 248 >,
narshu 25:143b19c1fb05 249 Rows
narshu 25:143b19c1fb05 250 >
narshu 25:143b19c1fb05 251 prod(const XprMatrix<E1, Rows, Cols>& lhs,
narshu 25:143b19c1fb05 252 const XprVector<E2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 253
narshu 25:143b19c1fb05 254
narshu 25:143b19c1fb05 255 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 256 * matrix specific functions
narshu 25:143b19c1fb05 257 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 258
narshu 25:143b19c1fb05 259
narshu 25:143b19c1fb05 260 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 261 XprMatrix<
narshu 25:143b19c1fb05 262 XprMatrixTranspose<
narshu 25:143b19c1fb05 263 XprMatrix<E, Rows, Cols>
narshu 25:143b19c1fb05 264 >,
narshu 25:143b19c1fb05 265 Cols, Rows
narshu 25:143b19c1fb05 266 >
narshu 25:143b19c1fb05 267 trans(const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 268
narshu 25:143b19c1fb05 269
narshu 25:143b19c1fb05 270 template<class E, std::size_t Sz>
narshu 25:143b19c1fb05 271 typename NumericTraits<typename E::value_type>::sum_type
narshu 25:143b19c1fb05 272 trace(const XprMatrix<E, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 273
narshu 25:143b19c1fb05 274
narshu 25:143b19c1fb05 275 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 276 XprVector<
narshu 25:143b19c1fb05 277 XprMatrixRow<
narshu 25:143b19c1fb05 278 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 279 Rows, Cols
narshu 25:143b19c1fb05 280 >,
narshu 25:143b19c1fb05 281 Cols
narshu 25:143b19c1fb05 282 >
narshu 25:143b19c1fb05 283 row(const XprMatrix<E, Rows, Cols>& m,
narshu 25:143b19c1fb05 284 std::size_t no) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 285
narshu 25:143b19c1fb05 286
narshu 25:143b19c1fb05 287 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 288 XprVector<
narshu 25:143b19c1fb05 289 XprMatrixCol<
narshu 25:143b19c1fb05 290 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 291 Rows, Cols
narshu 25:143b19c1fb05 292 >,
narshu 25:143b19c1fb05 293 Rows
narshu 25:143b19c1fb05 294 >
narshu 25:143b19c1fb05 295 col(const XprMatrix<E, Rows, Cols>& m, std::size_t no) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 296
narshu 25:143b19c1fb05 297
narshu 25:143b19c1fb05 298 template<class E, std::size_t Sz>
narshu 25:143b19c1fb05 299 XprVector<
narshu 25:143b19c1fb05 300 XprMatrixDiag<
narshu 25:143b19c1fb05 301 XprMatrix<E, Sz, Sz>,
narshu 25:143b19c1fb05 302 Sz
narshu 25:143b19c1fb05 303 >,
narshu 25:143b19c1fb05 304 Sz
narshu 25:143b19c1fb05 305 >
narshu 25:143b19c1fb05 306 diag(const XprMatrix<E, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE;
narshu 25:143b19c1fb05 307
narshu 25:143b19c1fb05 308
narshu 25:143b19c1fb05 309 /*********************************************************
narshu 25:143b19c1fb05 310 * PART II: IMPLEMENTATION
narshu 25:143b19c1fb05 311 *********************************************************/
narshu 25:143b19c1fb05 312
narshu 25:143b19c1fb05 313
narshu 25:143b19c1fb05 314 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 315 * Matrix arithmetic functions add, sub, mul and div
narshu 25:143b19c1fb05 316 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 317
narshu 25:143b19c1fb05 318
narshu 25:143b19c1fb05 319 /*
narshu 25:143b19c1fb05 320 * function(XprMatrix<E1, Rows, Cols>, XprMatrix<E2, Rows, Cols>)
narshu 25:143b19c1fb05 321 */
narshu 25:143b19c1fb05 322 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 25:143b19c1fb05 323 template<class E1, class E2, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 324 inline \
narshu 25:143b19c1fb05 325 XprMatrix< \
narshu 25:143b19c1fb05 326 XprBinOp< \
narshu 25:143b19c1fb05 327 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 25:143b19c1fb05 328 XprMatrix<E1, Rows, Cols>, \
narshu 25:143b19c1fb05 329 XprMatrix<E2, Rows, Cols> \
narshu 25:143b19c1fb05 330 >, \
narshu 25:143b19c1fb05 331 Rows, Cols \
narshu 25:143b19c1fb05 332 > \
narshu 25:143b19c1fb05 333 NAME (const XprMatrix<E1, Rows, Cols>& lhs, \
narshu 25:143b19c1fb05 334 const XprMatrix<E2, Rows, Cols>& rhs) { \
narshu 25:143b19c1fb05 335 typedef XprBinOp< \
narshu 25:143b19c1fb05 336 Fcnl_##NAME<typename E1::value_type, typename E2::value_type>, \
narshu 25:143b19c1fb05 337 XprMatrix<E1, Rows, Cols>, \
narshu 25:143b19c1fb05 338 XprMatrix<E2, Rows, Cols> \
narshu 25:143b19c1fb05 339 > expr_type; \
narshu 25:143b19c1fb05 340 return XprMatrix<expr_type, Rows, Cols>(expr_type(lhs, rhs)); \
narshu 25:143b19c1fb05 341 }
narshu 25:143b19c1fb05 342
narshu 25:143b19c1fb05 343 TVMET_IMPLEMENT_MACRO(add) // per se element wise
narshu 25:143b19c1fb05 344 TVMET_IMPLEMENT_MACRO(sub) // per se element wise
narshu 25:143b19c1fb05 345 namespace element_wise {
narshu 25:143b19c1fb05 346 TVMET_IMPLEMENT_MACRO(mul) // not defined for matrizes
narshu 25:143b19c1fb05 347 TVMET_IMPLEMENT_MACRO(div) // not defined for matrizes
narshu 25:143b19c1fb05 348 }
narshu 25:143b19c1fb05 349
narshu 25:143b19c1fb05 350 #undef TVMET_IMPLEMENT_MACRO
narshu 25:143b19c1fb05 351
narshu 25:143b19c1fb05 352
narshu 25:143b19c1fb05 353 /*
narshu 25:143b19c1fb05 354 * function(XprMatrix<E, Rows, Cols>, POD)
narshu 25:143b19c1fb05 355 * function(POD, XprMatrix<E, Rows, Cols>)
narshu 25:143b19c1fb05 356 * Note: - operations +,-,*,/ are per se element wise
narshu 25:143b19c1fb05 357 */
narshu 25:143b19c1fb05 358 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \
narshu 25:143b19c1fb05 359 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 360 inline \
narshu 25:143b19c1fb05 361 XprMatrix< \
narshu 25:143b19c1fb05 362 XprBinOp< \
narshu 25:143b19c1fb05 363 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 25:143b19c1fb05 364 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 365 XprLiteral< POD > \
narshu 25:143b19c1fb05 366 >, \
narshu 25:143b19c1fb05 367 Rows, Cols \
narshu 25:143b19c1fb05 368 > \
narshu 25:143b19c1fb05 369 NAME (const XprMatrix<E, Rows, Cols>& lhs, POD rhs) { \
narshu 25:143b19c1fb05 370 typedef XprBinOp< \
narshu 25:143b19c1fb05 371 Fcnl_##NAME<typename E::value_type, POD >, \
narshu 25:143b19c1fb05 372 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 373 XprLiteral< POD > \
narshu 25:143b19c1fb05 374 > expr_type; \
narshu 25:143b19c1fb05 375 return XprMatrix<expr_type, Rows, Cols>( \
narshu 25:143b19c1fb05 376 expr_type(lhs, XprLiteral< POD >(rhs))); \
narshu 25:143b19c1fb05 377 } \
narshu 25:143b19c1fb05 378 \
narshu 25:143b19c1fb05 379 template<class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 380 inline \
narshu 25:143b19c1fb05 381 XprMatrix< \
narshu 25:143b19c1fb05 382 XprBinOp< \
narshu 25:143b19c1fb05 383 Fcnl_##NAME< POD, typename E::value_type>, \
narshu 25:143b19c1fb05 384 XprLiteral< POD >, \
narshu 25:143b19c1fb05 385 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 386 >, \
narshu 25:143b19c1fb05 387 Rows, Cols \
narshu 25:143b19c1fb05 388 > \
narshu 25:143b19c1fb05 389 NAME (POD lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 25:143b19c1fb05 390 typedef XprBinOp< \
narshu 25:143b19c1fb05 391 Fcnl_##NAME< POD, typename E::value_type>, \
narshu 25:143b19c1fb05 392 XprLiteral< POD >, \
narshu 25:143b19c1fb05 393 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 394 > expr_type; \
narshu 25:143b19c1fb05 395 return XprMatrix<expr_type, Rows, Cols>( \
narshu 25:143b19c1fb05 396 expr_type(XprLiteral< POD >(lhs), rhs)); \
narshu 25:143b19c1fb05 397 }
narshu 25:143b19c1fb05 398
narshu 25:143b19c1fb05 399 TVMET_IMPLEMENT_MACRO(add, int)
narshu 25:143b19c1fb05 400 TVMET_IMPLEMENT_MACRO(sub, int)
narshu 25:143b19c1fb05 401 TVMET_IMPLEMENT_MACRO(mul, int)
narshu 25:143b19c1fb05 402 TVMET_IMPLEMENT_MACRO(div, int)
narshu 25:143b19c1fb05 403
narshu 25:143b19c1fb05 404 #if defined(TVMET_HAVE_LONG_LONG)
narshu 25:143b19c1fb05 405 TVMET_IMPLEMENT_MACRO(add, long long int)
narshu 25:143b19c1fb05 406 TVMET_IMPLEMENT_MACRO(sub, long long int)
narshu 25:143b19c1fb05 407 TVMET_IMPLEMENT_MACRO(mul, long long int)
narshu 25:143b19c1fb05 408 TVMET_IMPLEMENT_MACRO(div, long long int)
narshu 25:143b19c1fb05 409 #endif
narshu 25:143b19c1fb05 410
narshu 25:143b19c1fb05 411 TVMET_IMPLEMENT_MACRO(add, float)
narshu 25:143b19c1fb05 412 TVMET_IMPLEMENT_MACRO(sub, float)
narshu 25:143b19c1fb05 413 TVMET_IMPLEMENT_MACRO(mul, float)
narshu 25:143b19c1fb05 414 TVMET_IMPLEMENT_MACRO(div, float)
narshu 25:143b19c1fb05 415
narshu 25:143b19c1fb05 416 TVMET_IMPLEMENT_MACRO(add, double)
narshu 25:143b19c1fb05 417 TVMET_IMPLEMENT_MACRO(sub, double)
narshu 25:143b19c1fb05 418 TVMET_IMPLEMENT_MACRO(mul, double)
narshu 25:143b19c1fb05 419 TVMET_IMPLEMENT_MACRO(div, double)
narshu 25:143b19c1fb05 420
narshu 25:143b19c1fb05 421 #if defined(TVMET_HAVE_LONG_DOUBLE)
narshu 25:143b19c1fb05 422 TVMET_IMPLEMENT_MACRO(add, long double)
narshu 25:143b19c1fb05 423 TVMET_IMPLEMENT_MACRO(sub, long double)
narshu 25:143b19c1fb05 424 TVMET_IMPLEMENT_MACRO(mul, long double)
narshu 25:143b19c1fb05 425 TVMET_IMPLEMENT_MACRO(div, long double)
narshu 25:143b19c1fb05 426 #endif
narshu 25:143b19c1fb05 427
narshu 25:143b19c1fb05 428 #undef TVMET_IMPLEMENT_MACRO
narshu 25:143b19c1fb05 429
narshu 25:143b19c1fb05 430
narshu 25:143b19c1fb05 431 #if defined(TVMET_HAVE_COMPLEX)
narshu 25:143b19c1fb05 432 /*
narshu 25:143b19c1fb05 433 * function(XprMatrix<E, Rows, Cols>, complex<T>)
narshu 25:143b19c1fb05 434 * function(complex<T>, XprMatrix<E, Rows, Cols>)
narshu 25:143b19c1fb05 435 * Note: - operations +,-,*,/ are per se element wise
narshu 25:143b19c1fb05 436 * \todo type promotion
narshu 25:143b19c1fb05 437 */
narshu 25:143b19c1fb05 438 #define TVMET_IMPLEMENT_MACRO(NAME) \
narshu 25:143b19c1fb05 439 template<class E, class T, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 440 inline \
narshu 25:143b19c1fb05 441 XprMatrix< \
narshu 25:143b19c1fb05 442 XprBinOp< \
narshu 25:143b19c1fb05 443 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 25:143b19c1fb05 444 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 445 XprLiteral< std::complex<T> > \
narshu 25:143b19c1fb05 446 >, \
narshu 25:143b19c1fb05 447 Rows, Cols \
narshu 25:143b19c1fb05 448 > \
narshu 25:143b19c1fb05 449 NAME (const XprMatrix<E, Rows, Cols>& lhs, \
narshu 25:143b19c1fb05 450 const std::complex<T>& rhs) { \
narshu 25:143b19c1fb05 451 typedef XprBinOp< \
narshu 25:143b19c1fb05 452 Fcnl_##NAME<typename E::value_type, std::complex<T> >, \
narshu 25:143b19c1fb05 453 XprMatrix<E, Rows, Cols>, \
narshu 25:143b19c1fb05 454 XprLiteral< std::complex<T> > \
narshu 25:143b19c1fb05 455 > expr_type; \
narshu 25:143b19c1fb05 456 return XprMatrix<expr_type, Rows, Cols>( \
narshu 25:143b19c1fb05 457 expr_type(lhs, XprLiteral< std::complex<T> >(rhs))); \
narshu 25:143b19c1fb05 458 } \
narshu 25:143b19c1fb05 459 \
narshu 25:143b19c1fb05 460 template<class T, class E, std::size_t Rows, std::size_t Cols> \
narshu 25:143b19c1fb05 461 inline \
narshu 25:143b19c1fb05 462 XprMatrix< \
narshu 25:143b19c1fb05 463 XprBinOp< \
narshu 25:143b19c1fb05 464 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \
narshu 25:143b19c1fb05 465 XprLiteral< std::complex<T> >, \
narshu 25:143b19c1fb05 466 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 467 >, \
narshu 25:143b19c1fb05 468 Rows, Cols \
narshu 25:143b19c1fb05 469 > \
narshu 25:143b19c1fb05 470 NAME (const std::complex<T>& lhs, \
narshu 25:143b19c1fb05 471 const XprMatrix<E, Rows, Cols>& rhs) { \
narshu 25:143b19c1fb05 472 typedef XprBinOp< \
narshu 25:143b19c1fb05 473 Fcnl_##NAME< std::complex<T>, typename E::value_type>, \
narshu 25:143b19c1fb05 474 XprLiteral< std::complex<T> >, \
narshu 25:143b19c1fb05 475 XprMatrix<E, Rows, Cols> \
narshu 25:143b19c1fb05 476 > expr_type; \
narshu 25:143b19c1fb05 477 return XprMatrix<expr_type, Rows, Cols>( \
narshu 25:143b19c1fb05 478 expr_type(XprLiteral< std::complex<T> >(lhs), rhs)); \
narshu 25:143b19c1fb05 479 }
narshu 25:143b19c1fb05 480
narshu 25:143b19c1fb05 481 TVMET_IMPLEMENT_MACRO(add)
narshu 25:143b19c1fb05 482 TVMET_IMPLEMENT_MACRO(sub)
narshu 25:143b19c1fb05 483 TVMET_IMPLEMENT_MACRO(mul)
narshu 25:143b19c1fb05 484 TVMET_IMPLEMENT_MACRO(div)
narshu 25:143b19c1fb05 485
narshu 25:143b19c1fb05 486 #undef TVMET_IMPLEMENT_MACRO
narshu 25:143b19c1fb05 487
narshu 25:143b19c1fb05 488 #endif // defined(TVMET_HAVE_COMPLEX)
narshu 25:143b19c1fb05 489
narshu 25:143b19c1fb05 490
narshu 25:143b19c1fb05 491 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 492 * matrix prod( ... ) functions
narshu 25:143b19c1fb05 493 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 494
narshu 25:143b19c1fb05 495
narshu 25:143b19c1fb05 496 /**
narshu 25:143b19c1fb05 497 * \fn prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
narshu 25:143b19c1fb05 498 * \brief Evaluate the product of two XprMatrix.
narshu 25:143b19c1fb05 499 * Perform on given Matrix M1 and M2:
narshu 25:143b19c1fb05 500 * \f[
narshu 25:143b19c1fb05 501 * M_1\,M_2
narshu 25:143b19c1fb05 502 * \f]
narshu 25:143b19c1fb05 503 * \note The numer of Rows2 has to be equal to Cols1.
narshu 25:143b19c1fb05 504 * \ingroup _binary_function
narshu 25:143b19c1fb05 505 */
narshu 25:143b19c1fb05 506 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 507 class E2, std::size_t Cols2>
narshu 25:143b19c1fb05 508 inline
narshu 25:143b19c1fb05 509 XprMatrix<
narshu 25:143b19c1fb05 510 XprMMProduct<
narshu 25:143b19c1fb05 511 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 512 XprMatrix<E2, Cols1, Cols2>, Cols2
narshu 25:143b19c1fb05 513 >,
narshu 25:143b19c1fb05 514 Rows1, Cols2 // return Dim
narshu 25:143b19c1fb05 515 >
narshu 25:143b19c1fb05 516 prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) {
narshu 25:143b19c1fb05 517 typedef XprMMProduct<
narshu 25:143b19c1fb05 518 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
narshu 25:143b19c1fb05 519 XprMatrix<E2, Cols1, Cols2>, Cols2
narshu 25:143b19c1fb05 520 > expr_type;
narshu 25:143b19c1fb05 521 return XprMatrix<expr_type, Rows1, Cols2>(expr_type(lhs, rhs));
narshu 25:143b19c1fb05 522 }
narshu 25:143b19c1fb05 523
narshu 25:143b19c1fb05 524
narshu 25:143b19c1fb05 525 /**
narshu 25:143b19c1fb05 526 * \fn trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
narshu 25:143b19c1fb05 527 * \brief Function for the trans(matrix-matrix-product)
narshu 25:143b19c1fb05 528 * Perform on given Matrix M1 and M2:
narshu 25:143b19c1fb05 529 * \f[
narshu 25:143b19c1fb05 530 * (M_1\,M_2)^T
narshu 25:143b19c1fb05 531 * \f]
narshu 25:143b19c1fb05 532 * \note The numer of Rows2 has to be equal to Cols1.
narshu 25:143b19c1fb05 533 * \ingroup _binary_function
narshu 25:143b19c1fb05 534 */
narshu 25:143b19c1fb05 535 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 536 class E2, std::size_t Cols2>
narshu 25:143b19c1fb05 537 inline
narshu 25:143b19c1fb05 538 XprMatrix<
narshu 25:143b19c1fb05 539 XprMMProductTransposed<
narshu 25:143b19c1fb05 540 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 541 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
narshu 25:143b19c1fb05 542 >,
narshu 25:143b19c1fb05 543 Cols2, Rows1 // return Dim
narshu 25:143b19c1fb05 544 >
narshu 25:143b19c1fb05 545 trans_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) {
narshu 25:143b19c1fb05 546 typedef XprMMProductTransposed<
narshu 25:143b19c1fb05 547 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
narshu 25:143b19c1fb05 548 XprMatrix<E2, Cols1, Cols2>, Cols2
narshu 25:143b19c1fb05 549 > expr_type;
narshu 25:143b19c1fb05 550 return XprMatrix<expr_type, Cols2, Rows1>(expr_type(lhs, rhs));
narshu 25:143b19c1fb05 551 }
narshu 25:143b19c1fb05 552
narshu 25:143b19c1fb05 553
narshu 25:143b19c1fb05 554 /**
narshu 25:143b19c1fb05 555 * \fn MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows1, Cols2>& rhs)
narshu 25:143b19c1fb05 556 * \brief Function for the trans(matrix)-matrix-product.
narshu 25:143b19c1fb05 557 * using formula
narshu 25:143b19c1fb05 558 * \f[
narshu 25:143b19c1fb05 559 * M_1^{T}\,M_2
narshu 25:143b19c1fb05 560 * \f]
narshu 25:143b19c1fb05 561 * \note The number of cols of matrix 2 have to be equal to number of rows of
narshu 25:143b19c1fb05 562 * matrix 1, since matrix 1 is trans - the result is a (Cols1 x Cols2)
narshu 25:143b19c1fb05 563 * matrix.
narshu 25:143b19c1fb05 564 * \ingroup _binary_function
narshu 25:143b19c1fb05 565 */
narshu 25:143b19c1fb05 566 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 567 class E2, std::size_t Cols2> // Rows2 = Rows1
narshu 25:143b19c1fb05 568 inline
narshu 25:143b19c1fb05 569 XprMatrix<
narshu 25:143b19c1fb05 570 XprMtMProduct<
narshu 25:143b19c1fb05 571 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 572 XprMatrix<E2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2)
narshu 25:143b19c1fb05 573 >,
narshu 25:143b19c1fb05 574 Cols1, Cols2 // return Dim
narshu 25:143b19c1fb05 575 >
narshu 25:143b19c1fb05 576 MtM_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows1, Cols2>& rhs) {
narshu 25:143b19c1fb05 577 typedef XprMtMProduct<
narshu 25:143b19c1fb05 578 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
narshu 25:143b19c1fb05 579 XprMatrix<E2, Rows1, Cols2>, Cols2
narshu 25:143b19c1fb05 580 > expr_type;
narshu 25:143b19c1fb05 581 return XprMatrix<expr_type, Cols1, Cols2>(expr_type(lhs, rhs));
narshu 25:143b19c1fb05 582 }
narshu 25:143b19c1fb05 583
narshu 25:143b19c1fb05 584
narshu 25:143b19c1fb05 585 /**
narshu 25:143b19c1fb05 586 * \fn MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows2, Cols1>& rhs)
narshu 25:143b19c1fb05 587 * \brief Function for the matrix-trans(matrix)-product.
narshu 25:143b19c1fb05 588 * \ingroup _binary_function
narshu 25:143b19c1fb05 589 * \note The cols2 has to be equal to cols1.
narshu 25:143b19c1fb05 590 */
narshu 25:143b19c1fb05 591 template<class E1, std::size_t Rows1, std::size_t Cols1,
narshu 25:143b19c1fb05 592 class E2, std::size_t Rows2> // Cols2 = Cols1
narshu 25:143b19c1fb05 593 inline
narshu 25:143b19c1fb05 594 XprMatrix<
narshu 25:143b19c1fb05 595 XprMMtProduct<
narshu 25:143b19c1fb05 596 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
narshu 25:143b19c1fb05 597 XprMatrix<E2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1)
narshu 25:143b19c1fb05 598 >,
narshu 25:143b19c1fb05 599 Rows1, Rows2 // return Dim
narshu 25:143b19c1fb05 600 >
narshu 25:143b19c1fb05 601 MMt_prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const XprMatrix<E2, Rows2, Cols1>& rhs) {
narshu 25:143b19c1fb05 602 typedef XprMMtProduct<
narshu 25:143b19c1fb05 603 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
narshu 25:143b19c1fb05 604 XprMatrix<E2, Rows2, Cols1>, Cols1
narshu 25:143b19c1fb05 605 > expr_type;
narshu 25:143b19c1fb05 606 return XprMatrix<expr_type, Rows1, Rows2>(expr_type(lhs, rhs));
narshu 25:143b19c1fb05 607 }
narshu 25:143b19c1fb05 608
narshu 25:143b19c1fb05 609
narshu 25:143b19c1fb05 610 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 611 * matrix-vector specific prod( ... ) functions
narshu 25:143b19c1fb05 612 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 613
narshu 25:143b19c1fb05 614
narshu 25:143b19c1fb05 615 /**
narshu 25:143b19c1fb05 616 * \fn prod(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs)
narshu 25:143b19c1fb05 617 * \brief Evaluate the product of XprMatrix and XprVector.
narshu 25:143b19c1fb05 618 * \ingroup _binary_function
narshu 25:143b19c1fb05 619 */
narshu 25:143b19c1fb05 620 template<class E1, std::size_t Rows, std::size_t Cols,
narshu 25:143b19c1fb05 621 class E2>
narshu 25:143b19c1fb05 622 inline
narshu 25:143b19c1fb05 623 XprVector<
narshu 25:143b19c1fb05 624 XprMVProduct<
narshu 25:143b19c1fb05 625 XprMatrix<E1, Rows, Cols>, Rows, Cols,
narshu 25:143b19c1fb05 626 XprVector<E2, Cols>
narshu 25:143b19c1fb05 627 >,
narshu 25:143b19c1fb05 628 Rows
narshu 25:143b19c1fb05 629 >
narshu 25:143b19c1fb05 630 prod(const XprMatrix<E1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) {
narshu 25:143b19c1fb05 631 typedef XprMVProduct<
narshu 25:143b19c1fb05 632 XprMatrix<E1, Rows, Cols>, Rows, Cols,
narshu 25:143b19c1fb05 633 XprVector<E2, Cols>
narshu 25:143b19c1fb05 634 > expr_type;
narshu 25:143b19c1fb05 635 return XprVector<expr_type, Rows>(expr_type(lhs, rhs));
narshu 25:143b19c1fb05 636 }
narshu 25:143b19c1fb05 637
narshu 25:143b19c1fb05 638
narshu 25:143b19c1fb05 639 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
narshu 25:143b19c1fb05 640 * matrix specific functions
narshu 25:143b19c1fb05 641 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
narshu 25:143b19c1fb05 642
narshu 25:143b19c1fb05 643
narshu 25:143b19c1fb05 644 /**
narshu 25:143b19c1fb05 645 * \fn trans(const XprMatrix<E, Rows, Cols>& rhs)
narshu 25:143b19c1fb05 646 * \brief Transpose an expression matrix.
narshu 25:143b19c1fb05 647 * \ingroup _unary_function
narshu 25:143b19c1fb05 648 */
narshu 25:143b19c1fb05 649 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 650 inline
narshu 25:143b19c1fb05 651 XprMatrix<
narshu 25:143b19c1fb05 652 XprMatrixTranspose<
narshu 25:143b19c1fb05 653 XprMatrix<E, Rows, Cols>
narshu 25:143b19c1fb05 654 >,
narshu 25:143b19c1fb05 655 Cols, Rows
narshu 25:143b19c1fb05 656 >
narshu 25:143b19c1fb05 657 trans(const XprMatrix<E, Rows, Cols>& rhs) {
narshu 25:143b19c1fb05 658 typedef XprMatrixTranspose<
narshu 25:143b19c1fb05 659 XprMatrix<E, Rows, Cols>
narshu 25:143b19c1fb05 660 > expr_type;
narshu 25:143b19c1fb05 661 return XprMatrix<expr_type, Cols, Rows>(expr_type(rhs));
narshu 25:143b19c1fb05 662 }
narshu 25:143b19c1fb05 663
narshu 25:143b19c1fb05 664
narshu 25:143b19c1fb05 665 /*
narshu 25:143b19c1fb05 666 * \fn trace(const XprMatrix<E, Sz, Sz>& m)
narshu 25:143b19c1fb05 667 * \brief Compute the trace of a square matrix.
narshu 25:143b19c1fb05 668 * \ingroup _unary_function
narshu 25:143b19c1fb05 669 *
narshu 25:143b19c1fb05 670 * Simply compute the trace of the given matrix expression as:
narshu 25:143b19c1fb05 671 * \f[
narshu 25:143b19c1fb05 672 * \sum_{k = 0}^{Sz-1} m(k, k)
narshu 25:143b19c1fb05 673 * \f]
narshu 25:143b19c1fb05 674 */
narshu 25:143b19c1fb05 675 template<class E, std::size_t Sz>
narshu 25:143b19c1fb05 676 inline
narshu 25:143b19c1fb05 677 typename NumericTraits<typename E::value_type>::sum_type
narshu 25:143b19c1fb05 678 trace(const XprMatrix<E, Sz, Sz>& m) {
narshu 25:143b19c1fb05 679 return meta::Matrix<Sz, Sz, 0, 0>::trace(m);
narshu 25:143b19c1fb05 680 }
narshu 25:143b19c1fb05 681
narshu 25:143b19c1fb05 682
narshu 25:143b19c1fb05 683 /**
narshu 25:143b19c1fb05 684 * \fn row(const XprMatrix<E, Rows, Cols>& m, std::size_t no)
narshu 25:143b19c1fb05 685 * \brief Returns a row vector of the given matrix.
narshu 25:143b19c1fb05 686 * \ingroup _binary_function
narshu 25:143b19c1fb05 687 */
narshu 25:143b19c1fb05 688 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 689 inline
narshu 25:143b19c1fb05 690 XprVector<
narshu 25:143b19c1fb05 691 XprMatrixRow<
narshu 25:143b19c1fb05 692 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 693 Rows, Cols
narshu 25:143b19c1fb05 694 >,
narshu 25:143b19c1fb05 695 Cols
narshu 25:143b19c1fb05 696 >
narshu 25:143b19c1fb05 697 row(const XprMatrix<E, Rows, Cols>& m, std::size_t no) {
narshu 25:143b19c1fb05 698 typedef XprMatrixRow<
narshu 25:143b19c1fb05 699 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 700 Rows, Cols
narshu 25:143b19c1fb05 701 > expr_type;
narshu 25:143b19c1fb05 702
narshu 25:143b19c1fb05 703 return XprVector<expr_type, Cols>(expr_type(m, no));
narshu 25:143b19c1fb05 704 }
narshu 25:143b19c1fb05 705
narshu 25:143b19c1fb05 706
narshu 25:143b19c1fb05 707 /**
narshu 25:143b19c1fb05 708 * \fn col(const XprMatrix<E, Rows, Cols>& m, std::size_t no)
narshu 25:143b19c1fb05 709 * \brief Returns a column vector of the given matrix.
narshu 25:143b19c1fb05 710 * \ingroup _binary_function
narshu 25:143b19c1fb05 711 */
narshu 25:143b19c1fb05 712 template<class E, std::size_t Rows, std::size_t Cols>
narshu 25:143b19c1fb05 713 inline
narshu 25:143b19c1fb05 714 XprVector<
narshu 25:143b19c1fb05 715 XprMatrixCol<
narshu 25:143b19c1fb05 716 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 717 Rows, Cols
narshu 25:143b19c1fb05 718 >,
narshu 25:143b19c1fb05 719 Rows
narshu 25:143b19c1fb05 720 >
narshu 25:143b19c1fb05 721 col(const XprMatrix<E, Rows, Cols>& m, std::size_t no) {
narshu 25:143b19c1fb05 722 typedef XprMatrixCol<
narshu 25:143b19c1fb05 723 XprMatrix<E, Rows, Cols>,
narshu 25:143b19c1fb05 724 Rows, Cols
narshu 25:143b19c1fb05 725 > expr_type;
narshu 25:143b19c1fb05 726
narshu 25:143b19c1fb05 727 return XprVector<expr_type, Cols>(expr_type(m, no));
narshu 25:143b19c1fb05 728 }
narshu 25:143b19c1fb05 729
narshu 25:143b19c1fb05 730
narshu 25:143b19c1fb05 731 /**
narshu 25:143b19c1fb05 732 * \fn diag(const XprMatrix<E, Sz, Sz>& m)
narshu 25:143b19c1fb05 733 * \brief Returns the diagonal vector of the given square matrix.
narshu 25:143b19c1fb05 734 * \ingroup _unary_function
narshu 25:143b19c1fb05 735 */
narshu 25:143b19c1fb05 736 template<class E, std::size_t Sz>
narshu 25:143b19c1fb05 737 inline
narshu 25:143b19c1fb05 738 XprVector<
narshu 25:143b19c1fb05 739 XprMatrixDiag<
narshu 25:143b19c1fb05 740 XprMatrix<E, Sz, Sz>,
narshu 25:143b19c1fb05 741 Sz
narshu 25:143b19c1fb05 742 >,
narshu 25:143b19c1fb05 743 Sz
narshu 25:143b19c1fb05 744 >
narshu 25:143b19c1fb05 745 diag(const XprMatrix<E, Sz, Sz>& m) {
narshu 25:143b19c1fb05 746 typedef XprMatrixDiag<
narshu 25:143b19c1fb05 747 XprMatrix<E, Sz, Sz>,
narshu 25:143b19c1fb05 748 Sz> expr_type;
narshu 25:143b19c1fb05 749
narshu 25:143b19c1fb05 750 return XprVector<expr_type, Sz>(expr_type(m));
narshu 25:143b19c1fb05 751 }
narshu 25:143b19c1fb05 752
narshu 25:143b19c1fb05 753
narshu 25:143b19c1fb05 754 } // namespace tvmet
narshu 25:143b19c1fb05 755
narshu 25:143b19c1fb05 756 #endif // TVMET_XPR_MATRIX_FUNCTIONS_H
narshu 25:143b19c1fb05 757
narshu 25:143b19c1fb05 758 // Local Variables:
narshu 25:143b19c1fb05 759 // mode:C++
narshu 25:143b19c1fb05 760 // tab-width:8
narshu 25:143b19c1fb05 761 // End: