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: MatrixFunctions.h,v 1.65 2007-06-23 15:58:58 opetzold Exp $
madcowswe 0:feb4117d16d8 22 */
madcowswe 0:feb4117d16d8 23
madcowswe 0:feb4117d16d8 24 #ifndef TVMET_MATRIX_FUNCTIONS_H
madcowswe 0:feb4117d16d8 25 #define TVMET_MATRIX_FUNCTIONS_H
madcowswe 0:feb4117d16d8 26
madcowswe 0:feb4117d16d8 27 #include <tvmet/Extremum.h>
madcowswe 0:feb4117d16d8 28
madcowswe 0:feb4117d16d8 29 namespace tvmet {
madcowswe 0:feb4117d16d8 30
madcowswe 0:feb4117d16d8 31 /* forwards */
madcowswe 0:feb4117d16d8 32 template<class T, std::size_t Sz> class Vector;
madcowswe 0:feb4117d16d8 33 template<class T, std::size_t Sz> class VectorConstReference;
madcowswe 0:feb4117d16d8 34
madcowswe 0:feb4117d16d8 35
madcowswe 0:feb4117d16d8 36 /*********************************************************
madcowswe 0:feb4117d16d8 37 * PART I: DECLARATION
madcowswe 0:feb4117d16d8 38 *********************************************************/
madcowswe 0:feb4117d16d8 39
madcowswe 0:feb4117d16d8 40
madcowswe 0:feb4117d16d8 41 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 42 * Vector arithmetic functions add, sub, mul and div
madcowswe 0:feb4117d16d8 43 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 44
madcowswe 0:feb4117d16d8 45
madcowswe 0:feb4117d16d8 46 /*
madcowswe 0:feb4117d16d8 47 * function(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 48 * function(XprMatrix<E, Rows, Cols>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 49 * function(Matrix<T, Rows, Cols>, XprMatrix<E, Rows, Cols>)
madcowswe 0:feb4117d16d8 50 */
madcowswe 0:feb4117d16d8 51 #define TVMET_DECLARE_MACRO(NAME) \
madcowswe 0:feb4117d16d8 52 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 53 XprMatrix< \
madcowswe 0:feb4117d16d8 54 XprBinOp< \
madcowswe 0:feb4117d16d8 55 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 56 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 57 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 58 >, \
madcowswe 0:feb4117d16d8 59 Rows, Cols \
madcowswe 0:feb4117d16d8 60 > \
madcowswe 0:feb4117d16d8 61 NAME (const Matrix<T1, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 62 const Matrix<T2, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 63 \
madcowswe 0:feb4117d16d8 64 template<class E, class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 65 XprMatrix< \
madcowswe 0:feb4117d16d8 66 XprBinOp< \
madcowswe 0:feb4117d16d8 67 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 68 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 69 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 70 >, \
madcowswe 0:feb4117d16d8 71 Rows, Cols \
madcowswe 0:feb4117d16d8 72 > \
madcowswe 0:feb4117d16d8 73 NAME (const XprMatrix<E, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 74 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 75 \
madcowswe 0:feb4117d16d8 76 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 77 XprMatrix< \
madcowswe 0:feb4117d16d8 78 XprBinOp< \
madcowswe 0:feb4117d16d8 79 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 80 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 81 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 82 >, \
madcowswe 0:feb4117d16d8 83 Rows, Cols \
madcowswe 0:feb4117d16d8 84 > \
madcowswe 0:feb4117d16d8 85 NAME (const Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 86 const XprMatrix<E, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 87
madcowswe 0:feb4117d16d8 88 TVMET_DECLARE_MACRO(add) // per se element wise
madcowswe 0:feb4117d16d8 89 TVMET_DECLARE_MACRO(sub) // per se element wise
madcowswe 0:feb4117d16d8 90 namespace element_wise {
madcowswe 0:feb4117d16d8 91 TVMET_DECLARE_MACRO(mul) // not defined for matrizes
madcowswe 0:feb4117d16d8 92 TVMET_DECLARE_MACRO(div) // not defined for matrizes
madcowswe 0:feb4117d16d8 93 }
madcowswe 0:feb4117d16d8 94
madcowswe 0:feb4117d16d8 95 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 96
madcowswe 0:feb4117d16d8 97
madcowswe 0:feb4117d16d8 98 /*
madcowswe 0:feb4117d16d8 99 * function(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 100 * function(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 101 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 102 */
madcowswe 0:feb4117d16d8 103 #define TVMET_DECLARE_MACRO(NAME, POD) \
madcowswe 0:feb4117d16d8 104 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 105 XprMatrix< \
madcowswe 0:feb4117d16d8 106 XprBinOp< \
madcowswe 0:feb4117d16d8 107 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 108 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 109 XprLiteral<POD > \
madcowswe 0:feb4117d16d8 110 >, \
madcowswe 0:feb4117d16d8 111 Rows, Cols \
madcowswe 0:feb4117d16d8 112 > \
madcowswe 0:feb4117d16d8 113 NAME (const Matrix<T, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 114 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 115 \
madcowswe 0:feb4117d16d8 116 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 117 XprMatrix< \
madcowswe 0:feb4117d16d8 118 XprBinOp< \
madcowswe 0:feb4117d16d8 119 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 120 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 121 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 122 >, \
madcowswe 0:feb4117d16d8 123 Rows, Cols \
madcowswe 0:feb4117d16d8 124 > \
madcowswe 0:feb4117d16d8 125 NAME (POD lhs, \
madcowswe 0:feb4117d16d8 126 const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 127
madcowswe 0:feb4117d16d8 128 TVMET_DECLARE_MACRO(add, int)
madcowswe 0:feb4117d16d8 129 TVMET_DECLARE_MACRO(sub, int)
madcowswe 0:feb4117d16d8 130 TVMET_DECLARE_MACRO(mul, int)
madcowswe 0:feb4117d16d8 131 TVMET_DECLARE_MACRO(div, int)
madcowswe 0:feb4117d16d8 132
madcowswe 0:feb4117d16d8 133 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 134 TVMET_DECLARE_MACRO(add, long long int)
madcowswe 0:feb4117d16d8 135 TVMET_DECLARE_MACRO(sub, long long int)
madcowswe 0:feb4117d16d8 136 TVMET_DECLARE_MACRO(mul, long long int)
madcowswe 0:feb4117d16d8 137 TVMET_DECLARE_MACRO(div, long long int)
madcowswe 0:feb4117d16d8 138 #endif
madcowswe 0:feb4117d16d8 139
madcowswe 0:feb4117d16d8 140 TVMET_DECLARE_MACRO(add, float)
madcowswe 0:feb4117d16d8 141 TVMET_DECLARE_MACRO(sub, float)
madcowswe 0:feb4117d16d8 142 TVMET_DECLARE_MACRO(mul, float)
madcowswe 0:feb4117d16d8 143 TVMET_DECLARE_MACRO(div, float)
madcowswe 0:feb4117d16d8 144
madcowswe 0:feb4117d16d8 145 TVMET_DECLARE_MACRO(add, double)
madcowswe 0:feb4117d16d8 146 TVMET_DECLARE_MACRO(sub, double)
madcowswe 0:feb4117d16d8 147 TVMET_DECLARE_MACRO(mul, double)
madcowswe 0:feb4117d16d8 148 TVMET_DECLARE_MACRO(div, double)
madcowswe 0:feb4117d16d8 149
madcowswe 0:feb4117d16d8 150 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 151 TVMET_DECLARE_MACRO(add, long double)
madcowswe 0:feb4117d16d8 152 TVMET_DECLARE_MACRO(sub, long double)
madcowswe 0:feb4117d16d8 153 TVMET_DECLARE_MACRO(mul, long double)
madcowswe 0:feb4117d16d8 154 TVMET_DECLARE_MACRO(div, long double)
madcowswe 0:feb4117d16d8 155 #endif
madcowswe 0:feb4117d16d8 156
madcowswe 0:feb4117d16d8 157 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 158
madcowswe 0:feb4117d16d8 159
madcowswe 0:feb4117d16d8 160 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 161 /*
madcowswe 0:feb4117d16d8 162 * function(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 163 * function(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 164 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 165 * \todo type promotion
madcowswe 0:feb4117d16d8 166 */
madcowswe 0:feb4117d16d8 167 #define TVMET_DECLARE_MACRO(NAME) \
madcowswe 0:feb4117d16d8 168 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 169 XprMatrix< \
madcowswe 0:feb4117d16d8 170 XprBinOp< \
madcowswe 0:feb4117d16d8 171 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 172 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 173 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 174 >, \
madcowswe 0:feb4117d16d8 175 Rows, Cols \
madcowswe 0:feb4117d16d8 176 > \
madcowswe 0:feb4117d16d8 177 NAME (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 178 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 179 \
madcowswe 0:feb4117d16d8 180 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 181 XprMatrix< \
madcowswe 0:feb4117d16d8 182 XprBinOp< \
madcowswe 0:feb4117d16d8 183 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 184 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 185 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 186 >, \
madcowswe 0:feb4117d16d8 187 Rows, Cols \
madcowswe 0:feb4117d16d8 188 > \
madcowswe 0:feb4117d16d8 189 NAME (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 190 const Matrix< std::complex<T>, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 191
madcowswe 0:feb4117d16d8 192 TVMET_DECLARE_MACRO(add)
madcowswe 0:feb4117d16d8 193 TVMET_DECLARE_MACRO(sub)
madcowswe 0:feb4117d16d8 194 TVMET_DECLARE_MACRO(mul)
madcowswe 0:feb4117d16d8 195 TVMET_DECLARE_MACRO(div)
madcowswe 0:feb4117d16d8 196
madcowswe 0:feb4117d16d8 197 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 198
madcowswe 0:feb4117d16d8 199 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 200
madcowswe 0:feb4117d16d8 201
madcowswe 0:feb4117d16d8 202 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 203 * matrix specific prod( ... ) functions
madcowswe 0:feb4117d16d8 204 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 205
madcowswe 0:feb4117d16d8 206
madcowswe 0:feb4117d16d8 207 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 208 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 209 XprMatrix<
madcowswe 0:feb4117d16d8 210 XprMMProduct<
madcowswe 0:feb4117d16d8 211 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 212 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 213 >,
madcowswe 0:feb4117d16d8 214 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 215 >
madcowswe 0:feb4117d16d8 216 prod(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 217 const Matrix<T2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 218
madcowswe 0:feb4117d16d8 219
madcowswe 0:feb4117d16d8 220 template<class E1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 221 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 222 XprMatrix<
madcowswe 0:feb4117d16d8 223 XprMMProduct<
madcowswe 0:feb4117d16d8 224 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 225 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 226 >,
madcowswe 0:feb4117d16d8 227 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 228 >
madcowswe 0:feb4117d16d8 229 prod(const XprMatrix<E1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 230 const Matrix<T2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 231
madcowswe 0:feb4117d16d8 232
madcowswe 0:feb4117d16d8 233 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 234 class E2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 235 XprMatrix<
madcowswe 0:feb4117d16d8 236 XprMMProduct<
madcowswe 0:feb4117d16d8 237 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 238 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 239 >,
madcowswe 0:feb4117d16d8 240 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 241 >
madcowswe 0:feb4117d16d8 242 prod(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 243 const XprMatrix<E2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 244
madcowswe 0:feb4117d16d8 245
madcowswe 0:feb4117d16d8 246 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 247 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 248 XprMatrix<
madcowswe 0:feb4117d16d8 249 XprMMProductTransposed<
madcowswe 0:feb4117d16d8 250 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 251 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 252 >,
madcowswe 0:feb4117d16d8 253 Cols2, Rows1 // return Dim
madcowswe 0:feb4117d16d8 254 >
madcowswe 0:feb4117d16d8 255 trans_prod(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 256 const Matrix<T2, Cols1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 257
madcowswe 0:feb4117d16d8 258
madcowswe 0:feb4117d16d8 259 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 260 class T2, std::size_t Cols2> // Rows2 = Rows1
madcowswe 0:feb4117d16d8 261 XprMatrix<
madcowswe 0:feb4117d16d8 262 XprMtMProduct<
madcowswe 0:feb4117d16d8 263 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 264 MatrixConstReference<T2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2)
madcowswe 0:feb4117d16d8 265 >,
madcowswe 0:feb4117d16d8 266 Cols1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 267 >
madcowswe 0:feb4117d16d8 268 MtM_prod(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 269 const Matrix<T2, Rows1, Cols2>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 270
madcowswe 0:feb4117d16d8 271
madcowswe 0:feb4117d16d8 272 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 273 class T2, std::size_t Rows2>
madcowswe 0:feb4117d16d8 274 XprMatrix<
madcowswe 0:feb4117d16d8 275 XprMMtProduct<
madcowswe 0:feb4117d16d8 276 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 277 MatrixConstReference<T2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1)
madcowswe 0:feb4117d16d8 278 >,
madcowswe 0:feb4117d16d8 279 Rows1, Rows2 // return Dim
madcowswe 0:feb4117d16d8 280 >
madcowswe 0:feb4117d16d8 281 MMt_prod(const Matrix<T1, Rows1, Cols1>& lhs,
madcowswe 0:feb4117d16d8 282 const Matrix<T2, Rows2, Cols1>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 283
madcowswe 0:feb4117d16d8 284
madcowswe 0:feb4117d16d8 285 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 286 * matrix-vector specific prod( ... ) functions
madcowswe 0:feb4117d16d8 287 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 288
madcowswe 0:feb4117d16d8 289
madcowswe 0:feb4117d16d8 290 template<class T1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 291 XprVector<
madcowswe 0:feb4117d16d8 292 XprMVProduct<
madcowswe 0:feb4117d16d8 293 MatrixConstReference<T1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 294 VectorConstReference<T2, Cols> // V
madcowswe 0:feb4117d16d8 295 >,
madcowswe 0:feb4117d16d8 296 Rows
madcowswe 0:feb4117d16d8 297 >
madcowswe 0:feb4117d16d8 298 prod(const Matrix<T1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 299 const Vector<T2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 300
madcowswe 0:feb4117d16d8 301
madcowswe 0:feb4117d16d8 302 template<class T1, class E2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 303 XprVector<
madcowswe 0:feb4117d16d8 304 XprMVProduct<
madcowswe 0:feb4117d16d8 305 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 306 XprVector<E2, Cols>
madcowswe 0:feb4117d16d8 307 >,
madcowswe 0:feb4117d16d8 308 Rows
madcowswe 0:feb4117d16d8 309 >
madcowswe 0:feb4117d16d8 310 prod(const Matrix<T1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 311 const XprVector<E2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 312
madcowswe 0:feb4117d16d8 313
madcowswe 0:feb4117d16d8 314 template<class E1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 315 XprVector<
madcowswe 0:feb4117d16d8 316 XprMVProduct<
madcowswe 0:feb4117d16d8 317 XprMatrix<E1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 318 VectorConstReference<T2, Cols> // V
madcowswe 0:feb4117d16d8 319 >,
madcowswe 0:feb4117d16d8 320 Rows
madcowswe 0:feb4117d16d8 321 >
madcowswe 0:feb4117d16d8 322 prod(const XprMatrix<E1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 323 const Vector<T2, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 324
madcowswe 0:feb4117d16d8 325
madcowswe 0:feb4117d16d8 326 template<class T1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 327 XprVector<
madcowswe 0:feb4117d16d8 328 XprMtVProduct<
madcowswe 0:feb4117d16d8 329 MatrixConstReference<T1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 330 VectorConstReference<T2, Rows> // V
madcowswe 0:feb4117d16d8 331 >,
madcowswe 0:feb4117d16d8 332 Cols
madcowswe 0:feb4117d16d8 333 >
madcowswe 0:feb4117d16d8 334 Mtx_prod(const Matrix<T1, Rows, Cols>& lhs,
madcowswe 0:feb4117d16d8 335 const Vector<T2, Rows>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 336
madcowswe 0:feb4117d16d8 337
madcowswe 0:feb4117d16d8 338 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 339 * matrix specific functions
madcowswe 0:feb4117d16d8 340 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 341
madcowswe 0:feb4117d16d8 342
madcowswe 0:feb4117d16d8 343 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 344 XprMatrix<
madcowswe 0:feb4117d16d8 345 XprMatrixTranspose<
madcowswe 0:feb4117d16d8 346 MatrixConstReference<T, Rows, Cols>
madcowswe 0:feb4117d16d8 347 >,
madcowswe 0:feb4117d16d8 348 Cols, Rows
madcowswe 0:feb4117d16d8 349 >
madcowswe 0:feb4117d16d8 350 trans(const Matrix<T, Rows, Cols>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 351
madcowswe 0:feb4117d16d8 352
madcowswe 0:feb4117d16d8 353 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 354 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 355 trace(const Matrix<T, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 356
madcowswe 0:feb4117d16d8 357
madcowswe 0:feb4117d16d8 358 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 359 XprVector<
madcowswe 0:feb4117d16d8 360 XprMatrixRow<
madcowswe 0:feb4117d16d8 361 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 362 Rows, Cols
madcowswe 0:feb4117d16d8 363 >,
madcowswe 0:feb4117d16d8 364 Cols
madcowswe 0:feb4117d16d8 365 >
madcowswe 0:feb4117d16d8 366 row(const Matrix<T, Rows, Cols>& m,
madcowswe 0:feb4117d16d8 367 std::size_t no) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 368
madcowswe 0:feb4117d16d8 369
madcowswe 0:feb4117d16d8 370 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 371 XprVector<
madcowswe 0:feb4117d16d8 372 XprMatrixCol<
madcowswe 0:feb4117d16d8 373 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 374 Rows, Cols
madcowswe 0:feb4117d16d8 375 >,
madcowswe 0:feb4117d16d8 376 Rows
madcowswe 0:feb4117d16d8 377 >
madcowswe 0:feb4117d16d8 378 col(const Matrix<T, Rows, Cols>& m,
madcowswe 0:feb4117d16d8 379 std::size_t no) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 380
madcowswe 0:feb4117d16d8 381
madcowswe 0:feb4117d16d8 382 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 383 XprVector<
madcowswe 0:feb4117d16d8 384 XprMatrixDiag<
madcowswe 0:feb4117d16d8 385 MatrixConstReference<T, Sz, Sz>,
madcowswe 0:feb4117d16d8 386 Sz
madcowswe 0:feb4117d16d8 387 >,
madcowswe 0:feb4117d16d8 388 Sz
madcowswe 0:feb4117d16d8 389 >
madcowswe 0:feb4117d16d8 390 diag(const Matrix<T, Sz, Sz>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 391
madcowswe 0:feb4117d16d8 392
madcowswe 0:feb4117d16d8 393 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 394 * min/max unary functions
madcowswe 0:feb4117d16d8 395 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 396
madcowswe 0:feb4117d16d8 397
madcowswe 0:feb4117d16d8 398 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 399 Extremum<typename E::value_type, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 400 maximum(const XprMatrix<E, Rows, Cols>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 401
madcowswe 0:feb4117d16d8 402
madcowswe 0:feb4117d16d8 403 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 404 Extremum<T, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 405 maximum(const Matrix<T, Rows, Cols>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 406
madcowswe 0:feb4117d16d8 407
madcowswe 0:feb4117d16d8 408 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 409 Extremum<typename E::value_type, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 410 minimum(const XprMatrix<E, Rows, Cols>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 411
madcowswe 0:feb4117d16d8 412
madcowswe 0:feb4117d16d8 413 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 414 Extremum<T, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 415 minimum(const Matrix<T, Rows, Cols>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 416
madcowswe 0:feb4117d16d8 417
madcowswe 0:feb4117d16d8 418 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 419 typename E::value_type
madcowswe 0:feb4117d16d8 420 max(const XprMatrix<E, Rows, Cols>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 421
madcowswe 0:feb4117d16d8 422
madcowswe 0:feb4117d16d8 423 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 424 T max(const Matrix<T, Rows, Cols>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 425
madcowswe 0:feb4117d16d8 426
madcowswe 0:feb4117d16d8 427 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 428 typename E::value_type
madcowswe 0:feb4117d16d8 429 min(const XprMatrix<E, Rows, Cols>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 430
madcowswe 0:feb4117d16d8 431
madcowswe 0:feb4117d16d8 432 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 433 T min(const Matrix<T, Rows, Cols>& m) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 434
madcowswe 0:feb4117d16d8 435
madcowswe 0:feb4117d16d8 436 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 437 * other unary functions
madcowswe 0:feb4117d16d8 438 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 439
madcowswe 0:feb4117d16d8 440
madcowswe 0:feb4117d16d8 441 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 442 XprMatrix<
madcowswe 0:feb4117d16d8 443 XprIdentity<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 444 Rows, Cols
madcowswe 0:feb4117d16d8 445 >
madcowswe 0:feb4117d16d8 446 identity() TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 447
madcowswe 0:feb4117d16d8 448
madcowswe 0:feb4117d16d8 449 template<class M>
madcowswe 0:feb4117d16d8 450 XprMatrix<
madcowswe 0:feb4117d16d8 451 XprIdentity<
madcowswe 0:feb4117d16d8 452 typename M::value_type,
madcowswe 0:feb4117d16d8 453 M::Rows, M::Cols>,
madcowswe 0:feb4117d16d8 454 M::Rows, M::Cols
madcowswe 0:feb4117d16d8 455 >
madcowswe 0:feb4117d16d8 456 identity() TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 457
madcowswe 0:feb4117d16d8 458
madcowswe 0:feb4117d16d8 459 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 460 XprMatrix<
madcowswe 0:feb4117d16d8 461 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 462 Rows, Cols
madcowswe 0:feb4117d16d8 463 >
madcowswe 0:feb4117d16d8 464 cmatrix_ref(const T* mem) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 465
madcowswe 0:feb4117d16d8 466
madcowswe 0:feb4117d16d8 467 /*********************************************************
madcowswe 0:feb4117d16d8 468 * PART II: IMPLEMENTATION
madcowswe 0:feb4117d16d8 469 *********************************************************/
madcowswe 0:feb4117d16d8 470
madcowswe 0:feb4117d16d8 471
madcowswe 0:feb4117d16d8 472 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 473 * Vector arithmetic functions add, sub, mul and div
madcowswe 0:feb4117d16d8 474 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 475
madcowswe 0:feb4117d16d8 476
madcowswe 0:feb4117d16d8 477 /*
madcowswe 0:feb4117d16d8 478 * function(Matrix<T1, Rows, Cols>, Matrix<T2, Rows, Cols>)
madcowswe 0:feb4117d16d8 479 * function(XprMatrix<E, Rows, Cols>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 480 * function(Matrix<T, Rows, Cols>, XprMatrix<E, Rows, Cols>)
madcowswe 0:feb4117d16d8 481 */
madcowswe 0:feb4117d16d8 482 #define TVMET_IMPLEMENT_MACRO(NAME) \
madcowswe 0:feb4117d16d8 483 template<class T1, class T2, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 484 inline \
madcowswe 0:feb4117d16d8 485 XprMatrix< \
madcowswe 0:feb4117d16d8 486 XprBinOp< \
madcowswe 0:feb4117d16d8 487 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 488 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 489 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 490 >, \
madcowswe 0:feb4117d16d8 491 Rows, Cols \
madcowswe 0:feb4117d16d8 492 > \
madcowswe 0:feb4117d16d8 493 NAME (const Matrix<T1, Rows, Cols>& lhs, const Matrix<T2, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 494 typedef XprBinOp < \
madcowswe 0:feb4117d16d8 495 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 496 MatrixConstReference<T1, Rows, Cols>, \
madcowswe 0:feb4117d16d8 497 MatrixConstReference<T2, Rows, Cols> \
madcowswe 0:feb4117d16d8 498 > expr_type; \
madcowswe 0:feb4117d16d8 499 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 500 expr_type(lhs.const_ref(), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 501 } \
madcowswe 0:feb4117d16d8 502 \
madcowswe 0:feb4117d16d8 503 template<class E, class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 504 inline \
madcowswe 0:feb4117d16d8 505 XprMatrix< \
madcowswe 0:feb4117d16d8 506 XprBinOp< \
madcowswe 0:feb4117d16d8 507 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 508 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 509 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 510 >, \
madcowswe 0:feb4117d16d8 511 Rows, Cols \
madcowswe 0:feb4117d16d8 512 > \
madcowswe 0:feb4117d16d8 513 NAME (const XprMatrix<E, Rows, Cols>& lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 514 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 515 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 516 XprMatrix<E, Rows, Cols>, \
madcowswe 0:feb4117d16d8 517 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 518 > expr_type; \
madcowswe 0:feb4117d16d8 519 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 520 expr_type(lhs, rhs.const_ref())); \
madcowswe 0:feb4117d16d8 521 } \
madcowswe 0:feb4117d16d8 522 \
madcowswe 0:feb4117d16d8 523 template<class T, class E, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 524 inline \
madcowswe 0:feb4117d16d8 525 XprMatrix< \
madcowswe 0:feb4117d16d8 526 XprBinOp< \
madcowswe 0:feb4117d16d8 527 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 528 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 529 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 530 >, \
madcowswe 0:feb4117d16d8 531 Rows, Cols \
madcowswe 0:feb4117d16d8 532 > \
madcowswe 0:feb4117d16d8 533 NAME (const Matrix<T, Rows, Cols>& lhs, const XprMatrix<E, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 534 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 535 Fcnl_##NAME<T, typename E::value_type>, \
madcowswe 0:feb4117d16d8 536 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 537 XprMatrix<E, Rows, Cols> \
madcowswe 0:feb4117d16d8 538 > expr_type; \
madcowswe 0:feb4117d16d8 539 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 540 expr_type(lhs.const_ref(), rhs)); \
madcowswe 0:feb4117d16d8 541 }
madcowswe 0:feb4117d16d8 542
madcowswe 0:feb4117d16d8 543 TVMET_IMPLEMENT_MACRO(add) // per se element wise
madcowswe 0:feb4117d16d8 544 TVMET_IMPLEMENT_MACRO(sub) // per se element wise
madcowswe 0:feb4117d16d8 545 namespace element_wise {
madcowswe 0:feb4117d16d8 546 TVMET_IMPLEMENT_MACRO(mul) // not defined for matrizes
madcowswe 0:feb4117d16d8 547 TVMET_IMPLEMENT_MACRO(div) // not defined for matrizes
madcowswe 0:feb4117d16d8 548 }
madcowswe 0:feb4117d16d8 549
madcowswe 0:feb4117d16d8 550 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 551
madcowswe 0:feb4117d16d8 552
madcowswe 0:feb4117d16d8 553 /*
madcowswe 0:feb4117d16d8 554 * function(Matrix<T, Rows, Cols>, POD)
madcowswe 0:feb4117d16d8 555 * function(POD, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 556 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 557 */
madcowswe 0:feb4117d16d8 558 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \
madcowswe 0:feb4117d16d8 559 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 560 inline \
madcowswe 0:feb4117d16d8 561 XprMatrix< \
madcowswe 0:feb4117d16d8 562 XprBinOp< \
madcowswe 0:feb4117d16d8 563 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 564 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 565 XprLiteral<POD > \
madcowswe 0:feb4117d16d8 566 >, \
madcowswe 0:feb4117d16d8 567 Rows, Cols \
madcowswe 0:feb4117d16d8 568 > \
madcowswe 0:feb4117d16d8 569 NAME (const Matrix<T, Rows, Cols>& lhs, POD rhs) { \
madcowswe 0:feb4117d16d8 570 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 571 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 572 MatrixConstReference<T, Rows, Cols>, \
madcowswe 0:feb4117d16d8 573 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 574 > expr_type; \
madcowswe 0:feb4117d16d8 575 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 576 expr_type(lhs.const_ref(), XprLiteral< POD >(rhs))); \
madcowswe 0:feb4117d16d8 577 } \
madcowswe 0:feb4117d16d8 578 \
madcowswe 0:feb4117d16d8 579 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 580 inline \
madcowswe 0:feb4117d16d8 581 XprMatrix< \
madcowswe 0:feb4117d16d8 582 XprBinOp< \
madcowswe 0:feb4117d16d8 583 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 584 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 585 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 586 >, \
madcowswe 0:feb4117d16d8 587 Rows, Cols \
madcowswe 0:feb4117d16d8 588 > \
madcowswe 0:feb4117d16d8 589 NAME (POD lhs, const Matrix<T, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 590 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 591 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 592 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 593 MatrixConstReference<T, Rows, Cols> \
madcowswe 0:feb4117d16d8 594 > expr_type; \
madcowswe 0:feb4117d16d8 595 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 596 expr_type(XprLiteral< POD >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 597 }
madcowswe 0:feb4117d16d8 598
madcowswe 0:feb4117d16d8 599 TVMET_IMPLEMENT_MACRO(add, int)
madcowswe 0:feb4117d16d8 600 TVMET_IMPLEMENT_MACRO(sub, int)
madcowswe 0:feb4117d16d8 601 TVMET_IMPLEMENT_MACRO(mul, int)
madcowswe 0:feb4117d16d8 602 TVMET_IMPLEMENT_MACRO(div, int)
madcowswe 0:feb4117d16d8 603
madcowswe 0:feb4117d16d8 604 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 605 TVMET_IMPLEMENT_MACRO(add, long long int)
madcowswe 0:feb4117d16d8 606 TVMET_IMPLEMENT_MACRO(sub, long long int)
madcowswe 0:feb4117d16d8 607 TVMET_IMPLEMENT_MACRO(mul, long long int)
madcowswe 0:feb4117d16d8 608 TVMET_IMPLEMENT_MACRO(div, long long int)
madcowswe 0:feb4117d16d8 609 #endif
madcowswe 0:feb4117d16d8 610
madcowswe 0:feb4117d16d8 611 TVMET_IMPLEMENT_MACRO(add, float)
madcowswe 0:feb4117d16d8 612 TVMET_IMPLEMENT_MACRO(sub, float)
madcowswe 0:feb4117d16d8 613 TVMET_IMPLEMENT_MACRO(mul, float)
madcowswe 0:feb4117d16d8 614 TVMET_IMPLEMENT_MACRO(div, float)
madcowswe 0:feb4117d16d8 615
madcowswe 0:feb4117d16d8 616 TVMET_IMPLEMENT_MACRO(add, double)
madcowswe 0:feb4117d16d8 617 TVMET_IMPLEMENT_MACRO(sub, double)
madcowswe 0:feb4117d16d8 618 TVMET_IMPLEMENT_MACRO(mul, double)
madcowswe 0:feb4117d16d8 619 TVMET_IMPLEMENT_MACRO(div, double)
madcowswe 0:feb4117d16d8 620
madcowswe 0:feb4117d16d8 621 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 622 TVMET_IMPLEMENT_MACRO(add, long double)
madcowswe 0:feb4117d16d8 623 TVMET_IMPLEMENT_MACRO(sub, long double)
madcowswe 0:feb4117d16d8 624 TVMET_IMPLEMENT_MACRO(mul, long double)
madcowswe 0:feb4117d16d8 625 TVMET_IMPLEMENT_MACRO(div, long double)
madcowswe 0:feb4117d16d8 626 #endif
madcowswe 0:feb4117d16d8 627
madcowswe 0:feb4117d16d8 628 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 629
madcowswe 0:feb4117d16d8 630
madcowswe 0:feb4117d16d8 631 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 632 /*
madcowswe 0:feb4117d16d8 633 * function(Matrix<T, Rows, Cols>, complex<T>)
madcowswe 0:feb4117d16d8 634 * function(complex<T>, Matrix<T, Rows, Cols>)
madcowswe 0:feb4117d16d8 635 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 636 * \todo type promotion
madcowswe 0:feb4117d16d8 637 */
madcowswe 0:feb4117d16d8 638 #define TVMET_IMPLEMENT_MACRO(NAME) \
madcowswe 0:feb4117d16d8 639 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 640 inline \
madcowswe 0:feb4117d16d8 641 XprMatrix< \
madcowswe 0:feb4117d16d8 642 XprBinOp< \
madcowswe 0:feb4117d16d8 643 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 644 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 645 XprLiteral<std::complex<T> > \
madcowswe 0:feb4117d16d8 646 >, \
madcowswe 0:feb4117d16d8 647 Rows, Cols \
madcowswe 0:feb4117d16d8 648 > \
madcowswe 0:feb4117d16d8 649 NAME (const Matrix< std::complex<T>, Rows, Cols>& lhs, \
madcowswe 0:feb4117d16d8 650 const std::complex<T>& rhs) { \
madcowswe 0:feb4117d16d8 651 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 652 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 653 MatrixConstReference< std::complex<T>, Rows, Cols>, \
madcowswe 0:feb4117d16d8 654 XprLiteral< std::complex<T> > \
madcowswe 0:feb4117d16d8 655 > expr_type; \
madcowswe 0:feb4117d16d8 656 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 657 expr_type(lhs.const_ref(), XprLiteral< std::complex<T> >(rhs))); \
madcowswe 0:feb4117d16d8 658 } \
madcowswe 0:feb4117d16d8 659 \
madcowswe 0:feb4117d16d8 660 template<class T, std::size_t Rows, std::size_t Cols> \
madcowswe 0:feb4117d16d8 661 inline \
madcowswe 0:feb4117d16d8 662 XprMatrix< \
madcowswe 0:feb4117d16d8 663 XprBinOp< \
madcowswe 0:feb4117d16d8 664 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 665 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 666 MatrixConstReference< std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 667 >, \
madcowswe 0:feb4117d16d8 668 Rows, Cols \
madcowswe 0:feb4117d16d8 669 > \
madcowswe 0:feb4117d16d8 670 NAME (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 671 const Matrix< std::complex<T>, Rows, Cols>& rhs) { \
madcowswe 0:feb4117d16d8 672 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 673 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 674 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 675 MatrixConstReference<std::complex<T>, Rows, Cols> \
madcowswe 0:feb4117d16d8 676 > expr_type; \
madcowswe 0:feb4117d16d8 677 return XprMatrix<expr_type, Rows, Cols>( \
madcowswe 0:feb4117d16d8 678 expr_type(XprLiteral< std::complex<T> >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 679 }
madcowswe 0:feb4117d16d8 680
madcowswe 0:feb4117d16d8 681 TVMET_IMPLEMENT_MACRO(add)
madcowswe 0:feb4117d16d8 682 TVMET_IMPLEMENT_MACRO(sub)
madcowswe 0:feb4117d16d8 683 TVMET_IMPLEMENT_MACRO(mul)
madcowswe 0:feb4117d16d8 684 TVMET_IMPLEMENT_MACRO(div)
madcowswe 0:feb4117d16d8 685
madcowswe 0:feb4117d16d8 686 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 687
madcowswe 0:feb4117d16d8 688 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 689
madcowswe 0:feb4117d16d8 690
madcowswe 0:feb4117d16d8 691 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 692 * matrix specific prod( ... ) functions
madcowswe 0:feb4117d16d8 693 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 694
madcowswe 0:feb4117d16d8 695
madcowswe 0:feb4117d16d8 696 /**
madcowswe 0:feb4117d16d8 697 * \fn prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 698 * \brief Function for the matrix-matrix-product.
madcowswe 0:feb4117d16d8 699 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 700 * \note The rows2 has to be equal to cols1.
madcowswe 0:feb4117d16d8 701 */
madcowswe 0:feb4117d16d8 702 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 703 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 704 inline
madcowswe 0:feb4117d16d8 705 XprMatrix<
madcowswe 0:feb4117d16d8 706 XprMMProduct<
madcowswe 0:feb4117d16d8 707 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 708 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 709 >,
madcowswe 0:feb4117d16d8 710 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 711 >
madcowswe 0:feb4117d16d8 712 prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 713 typedef XprMMProduct<
madcowswe 0:feb4117d16d8 714 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 715 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 716 > expr_type;
madcowswe 0:feb4117d16d8 717 return XprMatrix<expr_type, Rows1, Cols2>(
madcowswe 0:feb4117d16d8 718 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 719 }
madcowswe 0:feb4117d16d8 720
madcowswe 0:feb4117d16d8 721
madcowswe 0:feb4117d16d8 722 /**
madcowswe 0:feb4117d16d8 723 * \fn prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 724 * \brief Evaluate the product of XprMatrix and Matrix.
madcowswe 0:feb4117d16d8 725 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 726 */
madcowswe 0:feb4117d16d8 727 template<class E1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 728 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 729 inline
madcowswe 0:feb4117d16d8 730 XprMatrix<
madcowswe 0:feb4117d16d8 731 XprMMProduct<
madcowswe 0:feb4117d16d8 732 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 733 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 734 >,
madcowswe 0:feb4117d16d8 735 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 736 >
madcowswe 0:feb4117d16d8 737 prod(const XprMatrix<E1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 738 typedef XprMMProduct<
madcowswe 0:feb4117d16d8 739 XprMatrix<E1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 740 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 741 > expr_type;
madcowswe 0:feb4117d16d8 742 return XprMatrix<expr_type, Rows1, Cols2>(
madcowswe 0:feb4117d16d8 743 expr_type(lhs, rhs.const_ref()));
madcowswe 0:feb4117d16d8 744 }
madcowswe 0:feb4117d16d8 745
madcowswe 0:feb4117d16d8 746
madcowswe 0:feb4117d16d8 747 /**
madcowswe 0:feb4117d16d8 748 * \fn prod(const Matrix<T1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 749 * \brief Evaluate the product of Matrix and XprMatrix.
madcowswe 0:feb4117d16d8 750 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 751 */
madcowswe 0:feb4117d16d8 752 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 753 class E2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 754 inline
madcowswe 0:feb4117d16d8 755 XprMatrix<
madcowswe 0:feb4117d16d8 756 XprMMProduct<
madcowswe 0:feb4117d16d8 757 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 758 XprMatrix<E2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 759 >,
madcowswe 0:feb4117d16d8 760 Rows1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 761 >
madcowswe 0:feb4117d16d8 762 prod(const Matrix<T1, Rows1, Cols1>& lhs, const XprMatrix<E2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 763 typedef XprMMProduct<
madcowswe 0:feb4117d16d8 764 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 765 XprMatrix<E2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 766 > expr_type;
madcowswe 0:feb4117d16d8 767 return XprMatrix<expr_type, Rows1, Cols2>(
madcowswe 0:feb4117d16d8 768 expr_type(lhs.const_ref(), rhs));
madcowswe 0:feb4117d16d8 769 }
madcowswe 0:feb4117d16d8 770
madcowswe 0:feb4117d16d8 771
madcowswe 0:feb4117d16d8 772 /**
madcowswe 0:feb4117d16d8 773 * \fn trans_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 774 * \brief Function for the trans(matrix-matrix-product)
madcowswe 0:feb4117d16d8 775 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 776 * Perform on given Matrix M1 and M2:
madcowswe 0:feb4117d16d8 777 * \f[
madcowswe 0:feb4117d16d8 778 * (M_1\,M_2)^T
madcowswe 0:feb4117d16d8 779 * \f]
madcowswe 0:feb4117d16d8 780 */
madcowswe 0:feb4117d16d8 781 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 782 class T2, std::size_t Cols2>
madcowswe 0:feb4117d16d8 783 inline
madcowswe 0:feb4117d16d8 784 XprMatrix<
madcowswe 0:feb4117d16d8 785 XprMMProductTransposed<
madcowswe 0:feb4117d16d8 786 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 787 MatrixConstReference<T2, Cols1, Cols2>, Cols2 // M2(Cols1, Cols2)
madcowswe 0:feb4117d16d8 788 >,
madcowswe 0:feb4117d16d8 789 Cols2, Rows1 // return Dim
madcowswe 0:feb4117d16d8 790 >
madcowswe 0:feb4117d16d8 791 trans_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Cols1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 792 typedef XprMMProductTransposed<
madcowswe 0:feb4117d16d8 793 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 794 MatrixConstReference<T2, Cols1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 795 > expr_type;
madcowswe 0:feb4117d16d8 796 return XprMatrix<expr_type, Cols2, Rows1>(
madcowswe 0:feb4117d16d8 797 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 798 }
madcowswe 0:feb4117d16d8 799
madcowswe 0:feb4117d16d8 800
madcowswe 0:feb4117d16d8 801 /**
madcowswe 0:feb4117d16d8 802 * \fn MtM_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Rows1, Cols2>& rhs)
madcowswe 0:feb4117d16d8 803 * \brief Function for the trans(matrix)-matrix-product.
madcowswe 0:feb4117d16d8 804 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 805 * using formula
madcowswe 0:feb4117d16d8 806 * \f[
madcowswe 0:feb4117d16d8 807 * M_1^{T}\,M_2
madcowswe 0:feb4117d16d8 808 * \f]
madcowswe 0:feb4117d16d8 809 * \note The number of cols of matrix 2 have to be equal to number of rows of
madcowswe 0:feb4117d16d8 810 * matrix 1, since matrix 1 is trans - the result is a (Cols1 x Cols2)
madcowswe 0:feb4117d16d8 811 * matrix.
madcowswe 0:feb4117d16d8 812 */
madcowswe 0:feb4117d16d8 813 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 814 class T2, std::size_t Cols2> // Rows2 = Rows1
madcowswe 0:feb4117d16d8 815 inline
madcowswe 0:feb4117d16d8 816 XprMatrix<
madcowswe 0:feb4117d16d8 817 XprMtMProduct<
madcowswe 0:feb4117d16d8 818 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 819 MatrixConstReference<T2, Rows1, Cols2>, Cols2 // M2(Rows1, Cols2)
madcowswe 0:feb4117d16d8 820 >,
madcowswe 0:feb4117d16d8 821 Cols1, Cols2 // return Dim
madcowswe 0:feb4117d16d8 822 >
madcowswe 0:feb4117d16d8 823 MtM_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Rows1, Cols2>& rhs) {
madcowswe 0:feb4117d16d8 824 typedef XprMtMProduct<
madcowswe 0:feb4117d16d8 825 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 826 MatrixConstReference<T2, Rows1, Cols2>, Cols2
madcowswe 0:feb4117d16d8 827 > expr_type;
madcowswe 0:feb4117d16d8 828 return XprMatrix<expr_type, Cols1, Cols2>(
madcowswe 0:feb4117d16d8 829 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 830 }
madcowswe 0:feb4117d16d8 831
madcowswe 0:feb4117d16d8 832
madcowswe 0:feb4117d16d8 833 /**
madcowswe 0:feb4117d16d8 834 * \fn MMt_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Rows2, Cols1>& rhs)
madcowswe 0:feb4117d16d8 835 * \brief Function for the matrix-trans(matrix)-product.
madcowswe 0:feb4117d16d8 836 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 837 * \note The Cols2 has to be equal to Cols1.
madcowswe 0:feb4117d16d8 838 */
madcowswe 0:feb4117d16d8 839 template<class T1, std::size_t Rows1, std::size_t Cols1,
madcowswe 0:feb4117d16d8 840 class T2, std::size_t Rows2>
madcowswe 0:feb4117d16d8 841 inline
madcowswe 0:feb4117d16d8 842 XprMatrix<
madcowswe 0:feb4117d16d8 843 XprMMtProduct<
madcowswe 0:feb4117d16d8 844 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1, // M1(Rows1, Cols1)
madcowswe 0:feb4117d16d8 845 MatrixConstReference<T2, Rows2, Cols1>, Cols1 // M2(Rows2, Cols1)
madcowswe 0:feb4117d16d8 846 >,
madcowswe 0:feb4117d16d8 847 Rows1, Rows2 // return Dim
madcowswe 0:feb4117d16d8 848 >
madcowswe 0:feb4117d16d8 849 MMt_prod(const Matrix<T1, Rows1, Cols1>& lhs, const Matrix<T2, Rows2, Cols1>& rhs) {
madcowswe 0:feb4117d16d8 850 typedef XprMMtProduct<
madcowswe 0:feb4117d16d8 851 MatrixConstReference<T1, Rows1, Cols1>, Rows1, Cols1,
madcowswe 0:feb4117d16d8 852 MatrixConstReference<T2, Rows2, Cols1>, Cols1
madcowswe 0:feb4117d16d8 853 > expr_type;
madcowswe 0:feb4117d16d8 854 return XprMatrix<expr_type, Rows1, Rows2>(
madcowswe 0:feb4117d16d8 855 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 856 }
madcowswe 0:feb4117d16d8 857
madcowswe 0:feb4117d16d8 858
madcowswe 0:feb4117d16d8 859 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 860 * matrix-vector specific prod( ... ) functions
madcowswe 0:feb4117d16d8 861 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 862
madcowswe 0:feb4117d16d8 863
madcowswe 0:feb4117d16d8 864 /**
madcowswe 0:feb4117d16d8 865 * \fn prod(const Matrix<T1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs)
madcowswe 0:feb4117d16d8 866 * \brief Function for the matrix-vector-product
madcowswe 0:feb4117d16d8 867 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 868 */
madcowswe 0:feb4117d16d8 869 template<class T1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 870 inline
madcowswe 0:feb4117d16d8 871 XprVector<
madcowswe 0:feb4117d16d8 872 XprMVProduct<
madcowswe 0:feb4117d16d8 873 MatrixConstReference<T1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 874 VectorConstReference<T2, Cols> // V
madcowswe 0:feb4117d16d8 875 >,
madcowswe 0:feb4117d16d8 876 Rows
madcowswe 0:feb4117d16d8 877 >
madcowswe 0:feb4117d16d8 878 prod(const Matrix<T1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 879 typedef XprMVProduct<
madcowswe 0:feb4117d16d8 880 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 881 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 882 > expr_type;
madcowswe 0:feb4117d16d8 883 return XprVector<expr_type, Rows>(
madcowswe 0:feb4117d16d8 884 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 885 }
madcowswe 0:feb4117d16d8 886
madcowswe 0:feb4117d16d8 887
madcowswe 0:feb4117d16d8 888 /**
madcowswe 0:feb4117d16d8 889 * \fn prod(const Matrix<T1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs)
madcowswe 0:feb4117d16d8 890 * \brief Function for the matrix-vector-product
madcowswe 0:feb4117d16d8 891 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 892 */
madcowswe 0:feb4117d16d8 893 template<class T1, class E2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 894 inline
madcowswe 0:feb4117d16d8 895 XprVector<
madcowswe 0:feb4117d16d8 896 XprMVProduct<
madcowswe 0:feb4117d16d8 897 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 898 XprVector<E2, Cols>
madcowswe 0:feb4117d16d8 899 >,
madcowswe 0:feb4117d16d8 900 Rows
madcowswe 0:feb4117d16d8 901 >
madcowswe 0:feb4117d16d8 902 prod(const Matrix<T1, Rows, Cols>& lhs, const XprVector<E2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 903 typedef XprMVProduct<
madcowswe 0:feb4117d16d8 904 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 905 XprVector<E2, Cols>
madcowswe 0:feb4117d16d8 906 > expr_type;
madcowswe 0:feb4117d16d8 907 return XprVector<expr_type, Rows>(
madcowswe 0:feb4117d16d8 908 expr_type(lhs.const_ref(), rhs));
madcowswe 0:feb4117d16d8 909 }
madcowswe 0:feb4117d16d8 910
madcowswe 0:feb4117d16d8 911
madcowswe 0:feb4117d16d8 912 /*
madcowswe 0:feb4117d16d8 913 * \fn prod(const XprMatrix<E, Rows, Cols>& lhs, const Vector<T, Cols>& rhs)
madcowswe 0:feb4117d16d8 914 * \brief Compute the product of an XprMatrix with a Vector.
madcowswe 0:feb4117d16d8 915 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 916 */
madcowswe 0:feb4117d16d8 917 template<class E1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 918 inline
madcowswe 0:feb4117d16d8 919 XprVector<
madcowswe 0:feb4117d16d8 920 XprMVProduct<
madcowswe 0:feb4117d16d8 921 XprMatrix<E1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 922 VectorConstReference<T2, Cols> // V
madcowswe 0:feb4117d16d8 923 >,
madcowswe 0:feb4117d16d8 924 Rows
madcowswe 0:feb4117d16d8 925 >
madcowswe 0:feb4117d16d8 926 prod(const XprMatrix<E1, Rows, Cols>& lhs, const Vector<T2, Cols>& rhs) {
madcowswe 0:feb4117d16d8 927 typedef XprMVProduct<
madcowswe 0:feb4117d16d8 928 XprMatrix<E1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 929 VectorConstReference<T2, Cols>
madcowswe 0:feb4117d16d8 930 > expr_type;
madcowswe 0:feb4117d16d8 931 return XprVector<expr_type, Rows>(
madcowswe 0:feb4117d16d8 932 expr_type(lhs, rhs.const_ref()));
madcowswe 0:feb4117d16d8 933 }
madcowswe 0:feb4117d16d8 934
madcowswe 0:feb4117d16d8 935
madcowswe 0:feb4117d16d8 936 /**
madcowswe 0:feb4117d16d8 937 * \fn Mtx_prod(const Matrix<T1, Rows, Cols>& matrix, const Vector<T2, Rows>& vector)
madcowswe 0:feb4117d16d8 938 * \brief Function for the trans(matrix)-vector-product
madcowswe 0:feb4117d16d8 939 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 940 * Perform on given Matrix M and vector x:
madcowswe 0:feb4117d16d8 941 * \f[
madcowswe 0:feb4117d16d8 942 * M^T\, x
madcowswe 0:feb4117d16d8 943 * \f]
madcowswe 0:feb4117d16d8 944 */
madcowswe 0:feb4117d16d8 945 template<class T1, class T2, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 946 inline
madcowswe 0:feb4117d16d8 947 XprVector<
madcowswe 0:feb4117d16d8 948 XprMtVProduct<
madcowswe 0:feb4117d16d8 949 MatrixConstReference<T1, Rows, Cols>, Rows, Cols, // M(Rows, Cols)
madcowswe 0:feb4117d16d8 950 VectorConstReference<T2, Rows> // V
madcowswe 0:feb4117d16d8 951 >,
madcowswe 0:feb4117d16d8 952 Cols
madcowswe 0:feb4117d16d8 953 >
madcowswe 0:feb4117d16d8 954 Mtx_prod(const Matrix<T1, Rows, Cols>& lhs, const Vector<T2, Rows>& rhs) {
madcowswe 0:feb4117d16d8 955 typedef XprMtVProduct<
madcowswe 0:feb4117d16d8 956 MatrixConstReference<T1, Rows, Cols>, Rows, Cols,
madcowswe 0:feb4117d16d8 957 VectorConstReference<T2, Rows>
madcowswe 0:feb4117d16d8 958 > expr_type;
madcowswe 0:feb4117d16d8 959 return XprVector<expr_type, Cols>(
madcowswe 0:feb4117d16d8 960 expr_type(lhs.const_ref(), rhs.const_ref()));
madcowswe 0:feb4117d16d8 961 }
madcowswe 0:feb4117d16d8 962
madcowswe 0:feb4117d16d8 963
madcowswe 0:feb4117d16d8 964 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 965 * matrix specific functions
madcowswe 0:feb4117d16d8 966 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 967
madcowswe 0:feb4117d16d8 968
madcowswe 0:feb4117d16d8 969 /**
madcowswe 0:feb4117d16d8 970 * \fn trans(const Matrix<T, Rows, Cols>& rhs)
madcowswe 0:feb4117d16d8 971 * \brief Transpose the matrix
madcowswe 0:feb4117d16d8 972 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 973 */
madcowswe 0:feb4117d16d8 974 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 975 inline
madcowswe 0:feb4117d16d8 976 XprMatrix<
madcowswe 0:feb4117d16d8 977 XprMatrixTranspose<
madcowswe 0:feb4117d16d8 978 MatrixConstReference<T, Rows, Cols>
madcowswe 0:feb4117d16d8 979 >,
madcowswe 0:feb4117d16d8 980 Cols, Rows
madcowswe 0:feb4117d16d8 981 >
madcowswe 0:feb4117d16d8 982 trans(const Matrix<T, Rows, Cols>& rhs) {
madcowswe 0:feb4117d16d8 983 typedef XprMatrixTranspose<
madcowswe 0:feb4117d16d8 984 MatrixConstReference<T, Rows, Cols>
madcowswe 0:feb4117d16d8 985 > expr_type;
madcowswe 0:feb4117d16d8 986 return XprMatrix<expr_type, Cols, Rows>(
madcowswe 0:feb4117d16d8 987 expr_type(rhs.const_ref()));
madcowswe 0:feb4117d16d8 988 }
madcowswe 0:feb4117d16d8 989
madcowswe 0:feb4117d16d8 990
madcowswe 0:feb4117d16d8 991 /*
madcowswe 0:feb4117d16d8 992 * \fn trace(const Matrix<T, Sz, Sz>& m)
madcowswe 0:feb4117d16d8 993 * \brief Compute the trace of a square matrix.
madcowswe 0:feb4117d16d8 994 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 995 *
madcowswe 0:feb4117d16d8 996 * Simply compute the trace of the given matrix as:
madcowswe 0:feb4117d16d8 997 * \f[
madcowswe 0:feb4117d16d8 998 * \sum_{k = 0}^{Sz-1} m(k, k)
madcowswe 0:feb4117d16d8 999 * \f]
madcowswe 0:feb4117d16d8 1000 */
madcowswe 0:feb4117d16d8 1001 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 1002 inline
madcowswe 0:feb4117d16d8 1003 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 1004 trace(const Matrix<T, Sz, Sz>& m) {
madcowswe 0:feb4117d16d8 1005 return meta::Matrix<Sz, Sz, 0, 0>::trace(m);
madcowswe 0:feb4117d16d8 1006 }
madcowswe 0:feb4117d16d8 1007
madcowswe 0:feb4117d16d8 1008
madcowswe 0:feb4117d16d8 1009 /**
madcowswe 0:feb4117d16d8 1010 * \fn row(const Matrix<T, Rows, Cols>& m, std::size_t no)
madcowswe 0:feb4117d16d8 1011 * \brief Returns a row vector of the given matrix.
madcowswe 0:feb4117d16d8 1012 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 1013 */
madcowswe 0:feb4117d16d8 1014 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1015 inline
madcowswe 0:feb4117d16d8 1016 XprVector<
madcowswe 0:feb4117d16d8 1017 XprMatrixRow<
madcowswe 0:feb4117d16d8 1018 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1019 Rows, Cols
madcowswe 0:feb4117d16d8 1020 >,
madcowswe 0:feb4117d16d8 1021 Cols
madcowswe 0:feb4117d16d8 1022 >
madcowswe 0:feb4117d16d8 1023 row(const Matrix<T, Rows, Cols>& m, std::size_t no) {
madcowswe 0:feb4117d16d8 1024 typedef XprMatrixRow<
madcowswe 0:feb4117d16d8 1025 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1026 Rows, Cols
madcowswe 0:feb4117d16d8 1027 > expr_type;
madcowswe 0:feb4117d16d8 1028 return XprVector<expr_type, Cols>(expr_type(m.const_ref(), no));
madcowswe 0:feb4117d16d8 1029 }
madcowswe 0:feb4117d16d8 1030
madcowswe 0:feb4117d16d8 1031
madcowswe 0:feb4117d16d8 1032 /**
madcowswe 0:feb4117d16d8 1033 * \fn col(const Matrix<T, Rows, Cols>& m, std::size_t no)
madcowswe 0:feb4117d16d8 1034 * \brief Returns a column vector of the given matrix.
madcowswe 0:feb4117d16d8 1035 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 1036 */
madcowswe 0:feb4117d16d8 1037 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1038 inline
madcowswe 0:feb4117d16d8 1039 XprVector<
madcowswe 0:feb4117d16d8 1040 XprMatrixCol<
madcowswe 0:feb4117d16d8 1041 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1042 Rows, Cols
madcowswe 0:feb4117d16d8 1043 >,
madcowswe 0:feb4117d16d8 1044 Rows
madcowswe 0:feb4117d16d8 1045 >
madcowswe 0:feb4117d16d8 1046 col(const Matrix<T, Rows, Cols>& m, std::size_t no) {
madcowswe 0:feb4117d16d8 1047 typedef XprMatrixCol<
madcowswe 0:feb4117d16d8 1048 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1049 Rows, Cols
madcowswe 0:feb4117d16d8 1050 > expr_type;
madcowswe 0:feb4117d16d8 1051 return XprVector<expr_type, Rows>(expr_type(m.const_ref(), no));
madcowswe 0:feb4117d16d8 1052 }
madcowswe 0:feb4117d16d8 1053
madcowswe 0:feb4117d16d8 1054
madcowswe 0:feb4117d16d8 1055 /**
madcowswe 0:feb4117d16d8 1056 * \fn diag(const Matrix<T, Sz, Sz>& m)
madcowswe 0:feb4117d16d8 1057 * \brief Returns the diagonal vector of the given square matrix.
madcowswe 0:feb4117d16d8 1058 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1059 */
madcowswe 0:feb4117d16d8 1060 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 1061 inline
madcowswe 0:feb4117d16d8 1062 XprVector<
madcowswe 0:feb4117d16d8 1063 XprMatrixDiag<
madcowswe 0:feb4117d16d8 1064 MatrixConstReference<T, Sz, Sz>,
madcowswe 0:feb4117d16d8 1065 Sz
madcowswe 0:feb4117d16d8 1066 >,
madcowswe 0:feb4117d16d8 1067 Sz
madcowswe 0:feb4117d16d8 1068 >
madcowswe 0:feb4117d16d8 1069 diag(const Matrix<T, Sz, Sz>& m) {
madcowswe 0:feb4117d16d8 1070 typedef XprMatrixDiag<
madcowswe 0:feb4117d16d8 1071 MatrixConstReference<T, Sz, Sz>,
madcowswe 0:feb4117d16d8 1072 Sz
madcowswe 0:feb4117d16d8 1073 > expr_type;
madcowswe 0:feb4117d16d8 1074 return XprVector<expr_type, Sz>(expr_type(m.const_ref()));
madcowswe 0:feb4117d16d8 1075 }
madcowswe 0:feb4117d16d8 1076
madcowswe 0:feb4117d16d8 1077
madcowswe 0:feb4117d16d8 1078 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 1079 * min/max unary functions
madcowswe 0:feb4117d16d8 1080 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 1081
madcowswe 0:feb4117d16d8 1082
madcowswe 0:feb4117d16d8 1083 /**
madcowswe 0:feb4117d16d8 1084 * \fn maximum(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 1085 * \brief Find the maximum of a matrix expression
madcowswe 0:feb4117d16d8 1086 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1087 */
madcowswe 0:feb4117d16d8 1088 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1089 inline
madcowswe 0:feb4117d16d8 1090 Extremum<typename E::value_type, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 1091 maximum(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 1092 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 1093
madcowswe 0:feb4117d16d8 1094 value_type temp(e(0, 0));
madcowswe 0:feb4117d16d8 1095 std::size_t row_no(0), col_no(0);
madcowswe 0:feb4117d16d8 1096
madcowswe 0:feb4117d16d8 1097 for(std::size_t i = 0; i != Rows; ++i) {
madcowswe 0:feb4117d16d8 1098 for(std::size_t j = 0; j != Cols; ++j) {
madcowswe 0:feb4117d16d8 1099 if(e(i, j) > temp) {
madcowswe 0:feb4117d16d8 1100 temp = e(i, j);
madcowswe 0:feb4117d16d8 1101 row_no = i;
madcowswe 0:feb4117d16d8 1102 col_no = j;
madcowswe 0:feb4117d16d8 1103 }
madcowswe 0:feb4117d16d8 1104 }
madcowswe 0:feb4117d16d8 1105 }
madcowswe 0:feb4117d16d8 1106
madcowswe 0:feb4117d16d8 1107 return Extremum<value_type, std::size_t, matrix_tag>(temp, row_no, col_no);
madcowswe 0:feb4117d16d8 1108 }
madcowswe 0:feb4117d16d8 1109
madcowswe 0:feb4117d16d8 1110
madcowswe 0:feb4117d16d8 1111 /**
madcowswe 0:feb4117d16d8 1112 * \fn maximum(const Matrix<T, Rows, Cols>& m)
madcowswe 0:feb4117d16d8 1113 * \brief Find the maximum of a matrix
madcowswe 0:feb4117d16d8 1114 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1115 */
madcowswe 0:feb4117d16d8 1116 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1117 inline
madcowswe 0:feb4117d16d8 1118 Extremum<T, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 1119 maximum(const Matrix<T, Rows, Cols>& m) { return maximum(m.as_expr()); }
madcowswe 0:feb4117d16d8 1120
madcowswe 0:feb4117d16d8 1121
madcowswe 0:feb4117d16d8 1122 /**
madcowswe 0:feb4117d16d8 1123 * \fn minimum(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 1124 * \brief Find the minimum of a matrix expression
madcowswe 0:feb4117d16d8 1125 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1126 */
madcowswe 0:feb4117d16d8 1127 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1128 inline
madcowswe 0:feb4117d16d8 1129 Extremum<typename E::value_type, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 1130 minimum(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 1131 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 1132
madcowswe 0:feb4117d16d8 1133 value_type temp(e(0, 0));
madcowswe 0:feb4117d16d8 1134 std::size_t row_no(0), col_no(0);
madcowswe 0:feb4117d16d8 1135
madcowswe 0:feb4117d16d8 1136 for(std::size_t i = 0; i != Rows; ++i) {
madcowswe 0:feb4117d16d8 1137 for(std::size_t j = 0; j != Cols; ++j) {
madcowswe 0:feb4117d16d8 1138 if(e(i, j) < temp) {
madcowswe 0:feb4117d16d8 1139 temp = e(i, j);
madcowswe 0:feb4117d16d8 1140 row_no = i;
madcowswe 0:feb4117d16d8 1141 col_no = j;
madcowswe 0:feb4117d16d8 1142 }
madcowswe 0:feb4117d16d8 1143 }
madcowswe 0:feb4117d16d8 1144 }
madcowswe 0:feb4117d16d8 1145
madcowswe 0:feb4117d16d8 1146 return Extremum<value_type, std::size_t, matrix_tag>(temp, row_no, col_no);
madcowswe 0:feb4117d16d8 1147 }
madcowswe 0:feb4117d16d8 1148
madcowswe 0:feb4117d16d8 1149
madcowswe 0:feb4117d16d8 1150 /**
madcowswe 0:feb4117d16d8 1151 * \fn minimum(const Matrix<T, Rows, Cols>& m)
madcowswe 0:feb4117d16d8 1152 * \brief Find the minimum of a matrix
madcowswe 0:feb4117d16d8 1153 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1154 */
madcowswe 0:feb4117d16d8 1155 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1156 inline
madcowswe 0:feb4117d16d8 1157 Extremum<T, std::size_t, matrix_tag>
madcowswe 0:feb4117d16d8 1158 minimum(const Matrix<T, Rows, Cols>& m) { return minimum(m.as_expr()); }
madcowswe 0:feb4117d16d8 1159
madcowswe 0:feb4117d16d8 1160
madcowswe 0:feb4117d16d8 1161 /**
madcowswe 0:feb4117d16d8 1162 * \fn max(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 1163 * \brief Find the maximum of a matrix expression
madcowswe 0:feb4117d16d8 1164 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1165 */
madcowswe 0:feb4117d16d8 1166 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1167 inline
madcowswe 0:feb4117d16d8 1168 typename E::value_type
madcowswe 0:feb4117d16d8 1169 max(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 1170 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 1171
madcowswe 0:feb4117d16d8 1172 value_type temp(e(0, 0));
madcowswe 0:feb4117d16d8 1173
madcowswe 0:feb4117d16d8 1174 for(std::size_t i = 0; i != Rows; ++i)
madcowswe 0:feb4117d16d8 1175 for(std::size_t j = 0; j != Cols; ++j)
madcowswe 0:feb4117d16d8 1176 if(e(i, j) > temp)
madcowswe 0:feb4117d16d8 1177 temp = e(i, j);
madcowswe 0:feb4117d16d8 1178
madcowswe 0:feb4117d16d8 1179 return temp;
madcowswe 0:feb4117d16d8 1180 }
madcowswe 0:feb4117d16d8 1181
madcowswe 0:feb4117d16d8 1182
madcowswe 0:feb4117d16d8 1183 /**
madcowswe 0:feb4117d16d8 1184 * \fn max(const Matrix<T, Rows, Cols>& m)
madcowswe 0:feb4117d16d8 1185 * \brief Find the maximum of a matrix
madcowswe 0:feb4117d16d8 1186 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1187 */
madcowswe 0:feb4117d16d8 1188 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1189 inline
madcowswe 0:feb4117d16d8 1190 T max(const Matrix<T, Rows, Cols>& m) {
madcowswe 0:feb4117d16d8 1191 typedef T value_type;
madcowswe 0:feb4117d16d8 1192 typedef typename Matrix<
madcowswe 0:feb4117d16d8 1193 T, Rows, Cols
madcowswe 0:feb4117d16d8 1194 >::const_iterator const_iterator;
madcowswe 0:feb4117d16d8 1195
madcowswe 0:feb4117d16d8 1196 const_iterator iter(m.begin());
madcowswe 0:feb4117d16d8 1197 const_iterator last(m.end());
madcowswe 0:feb4117d16d8 1198 value_type temp(*iter);
madcowswe 0:feb4117d16d8 1199
madcowswe 0:feb4117d16d8 1200 for( ; iter != last; ++iter)
madcowswe 0:feb4117d16d8 1201 if(*iter > temp)
madcowswe 0:feb4117d16d8 1202 temp = *iter;
madcowswe 0:feb4117d16d8 1203
madcowswe 0:feb4117d16d8 1204 return temp;
madcowswe 0:feb4117d16d8 1205 }
madcowswe 0:feb4117d16d8 1206
madcowswe 0:feb4117d16d8 1207
madcowswe 0:feb4117d16d8 1208 /**
madcowswe 0:feb4117d16d8 1209 * \fn min(const XprMatrix<E, Rows, Cols>& e)
madcowswe 0:feb4117d16d8 1210 * \brief Find the minimum of a matrix expression
madcowswe 0:feb4117d16d8 1211 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1212 */
madcowswe 0:feb4117d16d8 1213 template<class E, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1214 inline
madcowswe 0:feb4117d16d8 1215 typename E::value_type
madcowswe 0:feb4117d16d8 1216 min(const XprMatrix<E, Rows, Cols>& e) {
madcowswe 0:feb4117d16d8 1217 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 1218
madcowswe 0:feb4117d16d8 1219 value_type temp(e(0, 0));
madcowswe 0:feb4117d16d8 1220
madcowswe 0:feb4117d16d8 1221 for(std::size_t i = 0; i != Rows; ++i)
madcowswe 0:feb4117d16d8 1222 for(std::size_t j = 0; j != Cols; ++j)
madcowswe 0:feb4117d16d8 1223 if(e(i, j) < temp)
madcowswe 0:feb4117d16d8 1224 temp = e(i, j);
madcowswe 0:feb4117d16d8 1225
madcowswe 0:feb4117d16d8 1226 return temp;
madcowswe 0:feb4117d16d8 1227 }
madcowswe 0:feb4117d16d8 1228
madcowswe 0:feb4117d16d8 1229
madcowswe 0:feb4117d16d8 1230 /**
madcowswe 0:feb4117d16d8 1231 * \fn min(const Matrix<T, Rows, Cols>& m)
madcowswe 0:feb4117d16d8 1232 * \brief Find the minimum of a matrix
madcowswe 0:feb4117d16d8 1233 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1234 */
madcowswe 0:feb4117d16d8 1235 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1236 inline
madcowswe 0:feb4117d16d8 1237 T min(const Matrix<T, Rows, Cols>& m) {
madcowswe 0:feb4117d16d8 1238 typedef T value_type;
madcowswe 0:feb4117d16d8 1239 typedef typename Matrix<
madcowswe 0:feb4117d16d8 1240 T, Rows, Cols
madcowswe 0:feb4117d16d8 1241 >::const_iterator const_iterator;
madcowswe 0:feb4117d16d8 1242
madcowswe 0:feb4117d16d8 1243 const_iterator iter(m.begin());
madcowswe 0:feb4117d16d8 1244 const_iterator last(m.end());
madcowswe 0:feb4117d16d8 1245 value_type temp(*iter);
madcowswe 0:feb4117d16d8 1246
madcowswe 0:feb4117d16d8 1247 for( ; iter != last; ++iter)
madcowswe 0:feb4117d16d8 1248 if(*iter < temp)
madcowswe 0:feb4117d16d8 1249 temp = *iter;
madcowswe 0:feb4117d16d8 1250
madcowswe 0:feb4117d16d8 1251 return temp;
madcowswe 0:feb4117d16d8 1252 }
madcowswe 0:feb4117d16d8 1253
madcowswe 0:feb4117d16d8 1254
madcowswe 0:feb4117d16d8 1255 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 1256 * other unary functions
madcowswe 0:feb4117d16d8 1257 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 1258
madcowswe 0:feb4117d16d8 1259
madcowswe 0:feb4117d16d8 1260 /**
madcowswe 0:feb4117d16d8 1261 * \fn XprMatrix<XprIdentity<typename M::value_type, M::Rows, M::Cols>, M::Rows, M::Cols>identity()
madcowswe 0:feb4117d16d8 1262 * \brief Fill a matrix to an identity matrix.
madcowswe 0:feb4117d16d8 1263 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1264 *
madcowswe 0:feb4117d16d8 1265 * \note The matrix doesn't need to be square. Only the elements
madcowswe 0:feb4117d16d8 1266 * where the current number of rows are equal to columns
madcowswe 0:feb4117d16d8 1267 * will be set to 1, else to 0.
madcowswe 0:feb4117d16d8 1268 *
madcowswe 0:feb4117d16d8 1269 * \par Usage:
madcowswe 0:feb4117d16d8 1270 * \code
madcowswe 0:feb4117d16d8 1271 * typedef Matrix<double,3,3> matrix_type;
madcowswe 0:feb4117d16d8 1272 * ...
madcowswe 0:feb4117d16d8 1273 * matrix_type E( identity<double, 3, 3>() );
madcowswe 0:feb4117d16d8 1274 * \endcode
madcowswe 0:feb4117d16d8 1275 *
madcowswe 0:feb4117d16d8 1276 * Note, we have to specify the type, number of rows and columns
madcowswe 0:feb4117d16d8 1277 * since ADL can't work here.
madcowswe 0:feb4117d16d8 1278 *
madcowswe 0:feb4117d16d8 1279 *
madcowswe 0:feb4117d16d8 1280 *
madcowswe 0:feb4117d16d8 1281 * \since release 1.6.0
madcowswe 0:feb4117d16d8 1282 */
madcowswe 0:feb4117d16d8 1283 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1284 inline
madcowswe 0:feb4117d16d8 1285 XprMatrix<
madcowswe 0:feb4117d16d8 1286 XprIdentity<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1287 Rows, Cols
madcowswe 0:feb4117d16d8 1288 >
madcowswe 0:feb4117d16d8 1289 identity() {
madcowswe 0:feb4117d16d8 1290 typedef XprIdentity<T, Rows, Cols> expr_type;
madcowswe 0:feb4117d16d8 1291
madcowswe 0:feb4117d16d8 1292 return XprMatrix<expr_type, Rows, Cols>(expr_type());
madcowswe 0:feb4117d16d8 1293 }
madcowswe 0:feb4117d16d8 1294
madcowswe 0:feb4117d16d8 1295 /**
madcowswe 0:feb4117d16d8 1296 * \fn XprMatrix<XprIdentity<typename M::value_type, M::Rows, M::Cols>, M::Rows, M::Cols>identity()
madcowswe 0:feb4117d16d8 1297 * \brief Fill a matrix to an identity matrix (convenience wrapper
madcowswe 0:feb4117d16d8 1298 * for matrix typedefs).
madcowswe 0:feb4117d16d8 1299 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1300 *
madcowswe 0:feb4117d16d8 1301 * \note The matrix doesn't need to be square. Only the elements
madcowswe 0:feb4117d16d8 1302 * where the current number of rows are equal to columns
madcowswe 0:feb4117d16d8 1303 * will be set to 1, else to 0.
madcowswe 0:feb4117d16d8 1304 *
madcowswe 0:feb4117d16d8 1305 * \par Usage:
madcowswe 0:feb4117d16d8 1306 * \code
madcowswe 0:feb4117d16d8 1307 * typedef Matrix<double,3,3> matrix_type;
madcowswe 0:feb4117d16d8 1308 * ...
madcowswe 0:feb4117d16d8 1309 * matrix_type E( identity<matrix_type>() );
madcowswe 0:feb4117d16d8 1310 * \endcode
madcowswe 0:feb4117d16d8 1311 *
madcowswe 0:feb4117d16d8 1312 * Note, we have to specify the matrix type, since ADL can't work here.
madcowswe 0:feb4117d16d8 1313 *
madcowswe 0:feb4117d16d8 1314 * \since release 1.6.0
madcowswe 0:feb4117d16d8 1315 */
madcowswe 0:feb4117d16d8 1316 template<class M>
madcowswe 0:feb4117d16d8 1317 inline
madcowswe 0:feb4117d16d8 1318 XprMatrix<
madcowswe 0:feb4117d16d8 1319 XprIdentity<
madcowswe 0:feb4117d16d8 1320 typename M::value_type,
madcowswe 0:feb4117d16d8 1321 M::Rows, M::Cols>,
madcowswe 0:feb4117d16d8 1322 M::Rows, M::Cols
madcowswe 0:feb4117d16d8 1323 >
madcowswe 0:feb4117d16d8 1324 identity() {
madcowswe 0:feb4117d16d8 1325 return identity<typename M::value_type, M::Rows, M::Cols>();
madcowswe 0:feb4117d16d8 1326 }
madcowswe 0:feb4117d16d8 1327
madcowswe 0:feb4117d16d8 1328
madcowswe 0:feb4117d16d8 1329 /**
madcowswe 0:feb4117d16d8 1330 * \fn cmatrix_ref(const T* mem)
madcowswe 0:feb4117d16d8 1331 * \brief Creates an expression wrapper for a C like matrices.
madcowswe 0:feb4117d16d8 1332 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 1333 *
madcowswe 0:feb4117d16d8 1334 * This is like creating a matrix of external data, as described
madcowswe 0:feb4117d16d8 1335 * at \ref construct. With this function you wrap an expression
madcowswe 0:feb4117d16d8 1336 * around a C style matrix and you can operate directly with it
madcowswe 0:feb4117d16d8 1337 * as usual.
madcowswe 0:feb4117d16d8 1338 *
madcowswe 0:feb4117d16d8 1339 * \par Example:
madcowswe 0:feb4117d16d8 1340 * \code
madcowswe 0:feb4117d16d8 1341 * static float lhs[3][3] = {
madcowswe 0:feb4117d16d8 1342 * {-1, 0, 1}, { 1, 0, 1}, {-1, 0, -1}
madcowswe 0:feb4117d16d8 1343 * };
madcowswe 0:feb4117d16d8 1344 * static float rhs[3][3] = {
madcowswe 0:feb4117d16d8 1345 * { 0, 1, 1}, { 0, 1, -1}, { 0, -1, 1}
madcowswe 0:feb4117d16d8 1346 * };
madcowswe 0:feb4117d16d8 1347 * ...
madcowswe 0:feb4117d16d8 1348 *
madcowswe 0:feb4117d16d8 1349 * typedef Matrix<float, 3, 3> matrix_type;
madcowswe 0:feb4117d16d8 1350 *
madcowswe 0:feb4117d16d8 1351 * matrix_type M( cmatrix_ref<float, 3, 3>(&lhs[0][0])
madcowswe 0:feb4117d16d8 1352 * * cmatrix_ref<float, 3, 3>(&rhs[0][0]) );
madcowswe 0:feb4117d16d8 1353 * \endcode
madcowswe 0:feb4117d16d8 1354 *
madcowswe 0:feb4117d16d8 1355 * \since release 1.6.0
madcowswe 0:feb4117d16d8 1356 */
madcowswe 0:feb4117d16d8 1357 template<class T, std::size_t Rows, std::size_t Cols>
madcowswe 0:feb4117d16d8 1358 inline
madcowswe 0:feb4117d16d8 1359 XprMatrix<
madcowswe 0:feb4117d16d8 1360 MatrixConstReference<T, Rows, Cols>,
madcowswe 0:feb4117d16d8 1361 Rows, Cols
madcowswe 0:feb4117d16d8 1362 >
madcowswe 0:feb4117d16d8 1363 cmatrix_ref(const T* mem) {
madcowswe 0:feb4117d16d8 1364 typedef MatrixConstReference<T, Rows, Cols> expr_type;
madcowswe 0:feb4117d16d8 1365
madcowswe 0:feb4117d16d8 1366 return XprMatrix<expr_type, Rows, Cols>(expr_type(mem));
madcowswe 0:feb4117d16d8 1367 }
madcowswe 0:feb4117d16d8 1368
madcowswe 0:feb4117d16d8 1369
madcowswe 0:feb4117d16d8 1370 } // namespace tvmet
madcowswe 0:feb4117d16d8 1371
madcowswe 0:feb4117d16d8 1372 #endif // TVMET_MATRIX_FUNCTIONS_H
madcowswe 0:feb4117d16d8 1373
madcowswe 0:feb4117d16d8 1374 // Local Variables:
madcowswe 0:feb4117d16d8 1375 // mode:C++
madcowswe 0:feb4117d16d8 1376 // tab-width:8
madcowswe 0:feb4117d16d8 1377 // End: