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