Eurobot2012_Secondary

Fork of Eurobot_2012_Secondary by Shuto Naruse

Committer:
narshu
Date:
Wed Oct 17 22:25:31 2012 +0000
Revision:
1:cc2a9eb0bd55
Commit before publishing

Who changed what in which revision?

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