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: VectorFunctions.h,v 1.37 2007-06-23 15:58:58 opetzold Exp $
madcowswe 0:feb4117d16d8 22 */
madcowswe 0:feb4117d16d8 23
madcowswe 0:feb4117d16d8 24 #ifndef TVMET_VECTOR_FUNCTIONS_H
madcowswe 0:feb4117d16d8 25 #define TVMET_VECTOR_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
madcowswe 0:feb4117d16d8 32 /*********************************************************
madcowswe 0:feb4117d16d8 33 * PART I: DECLARATION
madcowswe 0:feb4117d16d8 34 *********************************************************/
madcowswe 0:feb4117d16d8 35
madcowswe 0:feb4117d16d8 36
madcowswe 0:feb4117d16d8 37 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 38 * Vector arithmetic functions add, sub, mul and div
madcowswe 0:feb4117d16d8 39 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 40
madcowswe 0:feb4117d16d8 41
madcowswe 0:feb4117d16d8 42 /*
madcowswe 0:feb4117d16d8 43 * function(Vector<T1, Sz>, Vector<T2, Sz>)
madcowswe 0:feb4117d16d8 44 * function(Vector<T, Sz>, XprVector<E, Sz>)
madcowswe 0:feb4117d16d8 45 * function(XprVector<E, Sz>, Vector<T, Sz>)
madcowswe 0:feb4117d16d8 46 */
madcowswe 0:feb4117d16d8 47 #define TVMET_DECLARE_MACRO(NAME) \
madcowswe 0:feb4117d16d8 48 template<class T1, class T2, std::size_t Sz> \
madcowswe 0:feb4117d16d8 49 XprVector< \
madcowswe 0:feb4117d16d8 50 XprBinOp< \
madcowswe 0:feb4117d16d8 51 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 52 VectorConstReference<T1, Sz>, \
madcowswe 0:feb4117d16d8 53 VectorConstReference<T2, Sz> \
madcowswe 0:feb4117d16d8 54 >, \
madcowswe 0:feb4117d16d8 55 Sz \
madcowswe 0:feb4117d16d8 56 > \
madcowswe 0:feb4117d16d8 57 NAME (const Vector<T1, Sz>& lhs, \
madcowswe 0:feb4117d16d8 58 const Vector<T2, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 59 \
madcowswe 0:feb4117d16d8 60 template<class E, class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 61 XprVector< \
madcowswe 0:feb4117d16d8 62 XprBinOp< \
madcowswe 0:feb4117d16d8 63 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 64 XprVector<E, Sz>, \
madcowswe 0:feb4117d16d8 65 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 66 >, \
madcowswe 0:feb4117d16d8 67 Sz \
madcowswe 0:feb4117d16d8 68 > \
madcowswe 0:feb4117d16d8 69 NAME (const XprVector<E, Sz>& lhs, \
madcowswe 0:feb4117d16d8 70 const Vector<T, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 71 \
madcowswe 0:feb4117d16d8 72 template<class E, class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 73 XprVector< \
madcowswe 0:feb4117d16d8 74 XprBinOp< \
madcowswe 0:feb4117d16d8 75 Fcnl_##NAME<T, typename E::value_type>, \
madcowswe 0:feb4117d16d8 76 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 77 XprVector<E, Sz> \
madcowswe 0:feb4117d16d8 78 >, \
madcowswe 0:feb4117d16d8 79 Sz \
madcowswe 0:feb4117d16d8 80 > \
madcowswe 0:feb4117d16d8 81 NAME (const Vector<T, Sz>& lhs, \
madcowswe 0:feb4117d16d8 82 const XprVector<E, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 83
madcowswe 0:feb4117d16d8 84 TVMET_DECLARE_MACRO(add) // per se element wise
madcowswe 0:feb4117d16d8 85 TVMET_DECLARE_MACRO(sub) // per se element wise
madcowswe 0:feb4117d16d8 86 TVMET_DECLARE_MACRO(mul) // per se element wise
madcowswe 0:feb4117d16d8 87 namespace element_wise {
madcowswe 0:feb4117d16d8 88 TVMET_DECLARE_MACRO(div) // not defined for vectors
madcowswe 0:feb4117d16d8 89 }
madcowswe 0:feb4117d16d8 90
madcowswe 0:feb4117d16d8 91 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 92
madcowswe 0:feb4117d16d8 93
madcowswe 0:feb4117d16d8 94 /*
madcowswe 0:feb4117d16d8 95 * function(Vector<T, Sz>, POD)
madcowswe 0:feb4117d16d8 96 * function(POD, Vector<T, Sz>)
madcowswe 0:feb4117d16d8 97 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 98 */
madcowswe 0:feb4117d16d8 99 #define TVMET_DECLARE_MACRO(NAME, POD) \
madcowswe 0:feb4117d16d8 100 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 101 XprVector< \
madcowswe 0:feb4117d16d8 102 XprBinOp< \
madcowswe 0:feb4117d16d8 103 Fcnl_##NAME< T, POD >, \
madcowswe 0:feb4117d16d8 104 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 105 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 106 >, \
madcowswe 0:feb4117d16d8 107 Sz \
madcowswe 0:feb4117d16d8 108 > \
madcowswe 0:feb4117d16d8 109 NAME (const Vector<T, Sz>& lhs, \
madcowswe 0:feb4117d16d8 110 POD rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 111 \
madcowswe 0:feb4117d16d8 112 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 113 XprVector< \
madcowswe 0:feb4117d16d8 114 XprBinOp< \
madcowswe 0:feb4117d16d8 115 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 116 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 117 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 118 >, \
madcowswe 0:feb4117d16d8 119 Sz \
madcowswe 0:feb4117d16d8 120 > \
madcowswe 0:feb4117d16d8 121 NAME (POD lhs, \
madcowswe 0:feb4117d16d8 122 const Vector<T, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 123
madcowswe 0:feb4117d16d8 124 TVMET_DECLARE_MACRO(add, int)
madcowswe 0:feb4117d16d8 125 TVMET_DECLARE_MACRO(sub, int)
madcowswe 0:feb4117d16d8 126 TVMET_DECLARE_MACRO(mul, int)
madcowswe 0:feb4117d16d8 127 TVMET_DECLARE_MACRO(div, int)
madcowswe 0:feb4117d16d8 128
madcowswe 0:feb4117d16d8 129 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 130 TVMET_DECLARE_MACRO(add, long long int)
madcowswe 0:feb4117d16d8 131 TVMET_DECLARE_MACRO(sub, long long int)
madcowswe 0:feb4117d16d8 132 TVMET_DECLARE_MACRO(mul, long long int)
madcowswe 0:feb4117d16d8 133 TVMET_DECLARE_MACRO(div, long long int)
madcowswe 0:feb4117d16d8 134 #endif
madcowswe 0:feb4117d16d8 135
madcowswe 0:feb4117d16d8 136 TVMET_DECLARE_MACRO(add, float)
madcowswe 0:feb4117d16d8 137 TVMET_DECLARE_MACRO(sub, float)
madcowswe 0:feb4117d16d8 138 TVMET_DECLARE_MACRO(mul, float)
madcowswe 0:feb4117d16d8 139 TVMET_DECLARE_MACRO(div, float)
madcowswe 0:feb4117d16d8 140
madcowswe 0:feb4117d16d8 141 TVMET_DECLARE_MACRO(add, double)
madcowswe 0:feb4117d16d8 142 TVMET_DECLARE_MACRO(sub, double)
madcowswe 0:feb4117d16d8 143 TVMET_DECLARE_MACRO(mul, double)
madcowswe 0:feb4117d16d8 144 TVMET_DECLARE_MACRO(div, double)
madcowswe 0:feb4117d16d8 145
madcowswe 0:feb4117d16d8 146 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 147 TVMET_DECLARE_MACRO(add, long double)
madcowswe 0:feb4117d16d8 148 TVMET_DECLARE_MACRO(sub, long double)
madcowswe 0:feb4117d16d8 149 TVMET_DECLARE_MACRO(mul, long double)
madcowswe 0:feb4117d16d8 150 TVMET_DECLARE_MACRO(div, long double)
madcowswe 0:feb4117d16d8 151 #endif
madcowswe 0:feb4117d16d8 152
madcowswe 0:feb4117d16d8 153 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 154
madcowswe 0:feb4117d16d8 155
madcowswe 0:feb4117d16d8 156 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 157 /*
madcowswe 0:feb4117d16d8 158 * function(Vector<std::complex<T>, Sz>, std::complex<T>)
madcowswe 0:feb4117d16d8 159 * function(std::complex<T>, Vector<std::complex<T>, Sz>)
madcowswe 0:feb4117d16d8 160 * Note: per se element wise
madcowswe 0:feb4117d16d8 161 * \todo type promotion
madcowswe 0:feb4117d16d8 162 */
madcowswe 0:feb4117d16d8 163 #define TVMET_DECLARE_MACRO(NAME) \
madcowswe 0:feb4117d16d8 164 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 165 XprVector< \
madcowswe 0:feb4117d16d8 166 XprBinOp< \
madcowswe 0:feb4117d16d8 167 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 168 VectorConstReference< std::complex<T>, Sz>, \
madcowswe 0:feb4117d16d8 169 XprLiteral< std::complex<T> > \
madcowswe 0:feb4117d16d8 170 >, \
madcowswe 0:feb4117d16d8 171 Sz \
madcowswe 0:feb4117d16d8 172 > \
madcowswe 0:feb4117d16d8 173 NAME (const Vector<std::complex<T>, Sz>& lhs, \
madcowswe 0:feb4117d16d8 174 const std::complex<T>& rhs) TVMET_CXX_ALWAYS_INLINE; \
madcowswe 0:feb4117d16d8 175 \
madcowswe 0:feb4117d16d8 176 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 177 XprVector< \
madcowswe 0:feb4117d16d8 178 XprBinOp< \
madcowswe 0:feb4117d16d8 179 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 180 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 181 VectorConstReference< std::complex<T>, Sz> \
madcowswe 0:feb4117d16d8 182 >, \
madcowswe 0:feb4117d16d8 183 Sz \
madcowswe 0:feb4117d16d8 184 > \
madcowswe 0:feb4117d16d8 185 NAME (const std::complex<T>& lhs, \
madcowswe 0:feb4117d16d8 186 const Vector< std::complex<T>, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 187
madcowswe 0:feb4117d16d8 188 TVMET_DECLARE_MACRO(add)
madcowswe 0:feb4117d16d8 189 TVMET_DECLARE_MACRO(sub)
madcowswe 0:feb4117d16d8 190 TVMET_DECLARE_MACRO(mul)
madcowswe 0:feb4117d16d8 191 TVMET_DECLARE_MACRO(div)
madcowswe 0:feb4117d16d8 192
madcowswe 0:feb4117d16d8 193 #undef TVMET_DECLARE_MACRO
madcowswe 0:feb4117d16d8 194
madcowswe 0:feb4117d16d8 195 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 196
madcowswe 0:feb4117d16d8 197
madcowswe 0:feb4117d16d8 198 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 199 * vector specific functions
madcowswe 0:feb4117d16d8 200 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 201
madcowswe 0:feb4117d16d8 202
madcowswe 0:feb4117d16d8 203 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 204 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 205 sum(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 206
madcowswe 0:feb4117d16d8 207
madcowswe 0:feb4117d16d8 208 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 209 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 210 product(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 211
madcowswe 0:feb4117d16d8 212
madcowswe 0:feb4117d16d8 213 template<class T1, class T2, std::size_t Sz>
madcowswe 0:feb4117d16d8 214 typename PromoteTraits<T1, T2>::value_type
madcowswe 0:feb4117d16d8 215 dot(const Vector<T1, Sz>& lhs,
madcowswe 0:feb4117d16d8 216 const Vector<T2, Sz>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 217
madcowswe 0:feb4117d16d8 218
madcowswe 0:feb4117d16d8 219 template<class T1, class T2>
madcowswe 0:feb4117d16d8 220 Vector<typename PromoteTraits<T1, T2>::value_type, 3>
madcowswe 0:feb4117d16d8 221 cross(const Vector<T1, 3>& lhs,
madcowswe 0:feb4117d16d8 222 const Vector<T2, 3>& rhs) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 223
madcowswe 0:feb4117d16d8 224
madcowswe 0:feb4117d16d8 225 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 226 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 227 norm1(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 228
madcowswe 0:feb4117d16d8 229
madcowswe 0:feb4117d16d8 230 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 231 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 232 norm2(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 233
madcowswe 0:feb4117d16d8 234
madcowswe 0:feb4117d16d8 235 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 236 XprVector<
madcowswe 0:feb4117d16d8 237 XprBinOp<
madcowswe 0:feb4117d16d8 238 Fcnl_div<T, T>,
madcowswe 0:feb4117d16d8 239 VectorConstReference<T, Sz>,
madcowswe 0:feb4117d16d8 240 XprLiteral< T >
madcowswe 0:feb4117d16d8 241 >,
madcowswe 0:feb4117d16d8 242 Sz
madcowswe 0:feb4117d16d8 243 >
madcowswe 0:feb4117d16d8 244 normalize(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 245
madcowswe 0:feb4117d16d8 246
madcowswe 0:feb4117d16d8 247 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 248 * min/max unary functions
madcowswe 0:feb4117d16d8 249 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 250
madcowswe 0:feb4117d16d8 251 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 252 Extremum<typename E::value_type, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 253 maximum(const XprVector<E, Sz>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 254
madcowswe 0:feb4117d16d8 255
madcowswe 0:feb4117d16d8 256 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 257 Extremum<T, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 258 maximum(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 259
madcowswe 0:feb4117d16d8 260
madcowswe 0:feb4117d16d8 261 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 262 Extremum<typename E::value_type, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 263 minimum(const XprVector<E, Sz>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 264
madcowswe 0:feb4117d16d8 265
madcowswe 0:feb4117d16d8 266 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 267 Extremum<T, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 268 minimum(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 269
madcowswe 0:feb4117d16d8 270
madcowswe 0:feb4117d16d8 271 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 272 typename E::value_type
madcowswe 0:feb4117d16d8 273 max(const XprVector<E, Sz>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 274
madcowswe 0:feb4117d16d8 275
madcowswe 0:feb4117d16d8 276 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 277 T max(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 278
madcowswe 0:feb4117d16d8 279
madcowswe 0:feb4117d16d8 280 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 281 typename E::value_type
madcowswe 0:feb4117d16d8 282 min(const XprVector<E, Sz>& e); // NOT TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 283
madcowswe 0:feb4117d16d8 284
madcowswe 0:feb4117d16d8 285 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 286 T min(const Vector<T, Sz>& v) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 287
madcowswe 0:feb4117d16d8 288
madcowswe 0:feb4117d16d8 289 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 290 XprVector<
madcowswe 0:feb4117d16d8 291 VectorConstReference<T, Sz>,
madcowswe 0:feb4117d16d8 292 Sz
madcowswe 0:feb4117d16d8 293 >
madcowswe 0:feb4117d16d8 294 cvector_ref(const T* mem) TVMET_CXX_ALWAYS_INLINE;
madcowswe 0:feb4117d16d8 295
madcowswe 0:feb4117d16d8 296
madcowswe 0:feb4117d16d8 297 /*********************************************************
madcowswe 0:feb4117d16d8 298 * PART II: IMPLEMENTATION
madcowswe 0:feb4117d16d8 299 *********************************************************/
madcowswe 0:feb4117d16d8 300
madcowswe 0:feb4117d16d8 301
madcowswe 0:feb4117d16d8 302 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 303 * Vector arithmetic functions add, sub, mul and div
madcowswe 0:feb4117d16d8 304 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 305
madcowswe 0:feb4117d16d8 306
madcowswe 0:feb4117d16d8 307 /*
madcowswe 0:feb4117d16d8 308 * function(Vector<T1, Sz>, Vector<T2, Sz>)
madcowswe 0:feb4117d16d8 309 * function(Vector<T, Sz>, XprVector<E, Sz>)
madcowswe 0:feb4117d16d8 310 * function(XprVector<E, Sz>, Vector<T, Sz>)
madcowswe 0:feb4117d16d8 311 */
madcowswe 0:feb4117d16d8 312 #define TVMET_IMPLEMENT_MACRO(NAME) \
madcowswe 0:feb4117d16d8 313 template<class T1, class T2, std::size_t Sz> \
madcowswe 0:feb4117d16d8 314 inline \
madcowswe 0:feb4117d16d8 315 XprVector< \
madcowswe 0:feb4117d16d8 316 XprBinOp< \
madcowswe 0:feb4117d16d8 317 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 318 VectorConstReference<T1, Sz>, \
madcowswe 0:feb4117d16d8 319 VectorConstReference<T2, Sz> \
madcowswe 0:feb4117d16d8 320 >, \
madcowswe 0:feb4117d16d8 321 Sz \
madcowswe 0:feb4117d16d8 322 > \
madcowswe 0:feb4117d16d8 323 NAME (const Vector<T1, Sz>& lhs, const Vector<T2, Sz>& rhs) { \
madcowswe 0:feb4117d16d8 324 typedef XprBinOp < \
madcowswe 0:feb4117d16d8 325 Fcnl_##NAME<T1, T2>, \
madcowswe 0:feb4117d16d8 326 VectorConstReference<T1, Sz>, \
madcowswe 0:feb4117d16d8 327 VectorConstReference<T2, Sz> \
madcowswe 0:feb4117d16d8 328 > expr_type; \
madcowswe 0:feb4117d16d8 329 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 330 expr_type(lhs.const_ref(), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 331 } \
madcowswe 0:feb4117d16d8 332 \
madcowswe 0:feb4117d16d8 333 template<class E, class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 334 inline \
madcowswe 0:feb4117d16d8 335 XprVector< \
madcowswe 0:feb4117d16d8 336 XprBinOp< \
madcowswe 0:feb4117d16d8 337 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 338 XprVector<E, Sz>, \
madcowswe 0:feb4117d16d8 339 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 340 >, \
madcowswe 0:feb4117d16d8 341 Sz \
madcowswe 0:feb4117d16d8 342 > \
madcowswe 0:feb4117d16d8 343 NAME (const XprVector<E, Sz>& lhs, const Vector<T, Sz>& rhs) { \
madcowswe 0:feb4117d16d8 344 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 345 Fcnl_##NAME<typename E::value_type, T>, \
madcowswe 0:feb4117d16d8 346 XprVector<E, Sz>, \
madcowswe 0:feb4117d16d8 347 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 348 > expr_type; \
madcowswe 0:feb4117d16d8 349 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 350 expr_type(lhs, rhs.const_ref())); \
madcowswe 0:feb4117d16d8 351 } \
madcowswe 0:feb4117d16d8 352 \
madcowswe 0:feb4117d16d8 353 template<class E, class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 354 inline \
madcowswe 0:feb4117d16d8 355 XprVector< \
madcowswe 0:feb4117d16d8 356 XprBinOp< \
madcowswe 0:feb4117d16d8 357 Fcnl_##NAME<T, typename E::value_type>, \
madcowswe 0:feb4117d16d8 358 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 359 XprVector<E, Sz> \
madcowswe 0:feb4117d16d8 360 >, \
madcowswe 0:feb4117d16d8 361 Sz \
madcowswe 0:feb4117d16d8 362 > \
madcowswe 0:feb4117d16d8 363 NAME (const Vector<T, Sz>& lhs, const XprVector<E, Sz>& rhs) { \
madcowswe 0:feb4117d16d8 364 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 365 Fcnl_##NAME<T, typename E::value_type>, \
madcowswe 0:feb4117d16d8 366 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 367 XprVector<E, Sz> \
madcowswe 0:feb4117d16d8 368 > expr_type; \
madcowswe 0:feb4117d16d8 369 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 370 expr_type(lhs.const_ref(), rhs)); \
madcowswe 0:feb4117d16d8 371 }
madcowswe 0:feb4117d16d8 372
madcowswe 0:feb4117d16d8 373 TVMET_IMPLEMENT_MACRO(add) // per se element wise
madcowswe 0:feb4117d16d8 374 TVMET_IMPLEMENT_MACRO(sub) // per se element wise
madcowswe 0:feb4117d16d8 375 TVMET_IMPLEMENT_MACRO(mul) // per se element wise
madcowswe 0:feb4117d16d8 376 namespace element_wise {
madcowswe 0:feb4117d16d8 377 TVMET_IMPLEMENT_MACRO(div) // not defined for vectors
madcowswe 0:feb4117d16d8 378 }
madcowswe 0:feb4117d16d8 379
madcowswe 0:feb4117d16d8 380 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 381
madcowswe 0:feb4117d16d8 382
madcowswe 0:feb4117d16d8 383 /*
madcowswe 0:feb4117d16d8 384 * function(Vector<T, Sz>, POD)
madcowswe 0:feb4117d16d8 385 * function(POD, Vector<T, Sz>)
madcowswe 0:feb4117d16d8 386 * Note: - operations +,-,*,/ are per se element wise
madcowswe 0:feb4117d16d8 387 */
madcowswe 0:feb4117d16d8 388 #define TVMET_IMPLEMENT_MACRO(NAME, POD) \
madcowswe 0:feb4117d16d8 389 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 390 inline \
madcowswe 0:feb4117d16d8 391 XprVector< \
madcowswe 0:feb4117d16d8 392 XprBinOp< \
madcowswe 0:feb4117d16d8 393 Fcnl_##NAME< T, POD >, \
madcowswe 0:feb4117d16d8 394 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 395 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 396 >, \
madcowswe 0:feb4117d16d8 397 Sz \
madcowswe 0:feb4117d16d8 398 > \
madcowswe 0:feb4117d16d8 399 NAME (const Vector<T, Sz>& lhs, POD rhs) { \
madcowswe 0:feb4117d16d8 400 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 401 Fcnl_##NAME<T, POD >, \
madcowswe 0:feb4117d16d8 402 VectorConstReference<T, Sz>, \
madcowswe 0:feb4117d16d8 403 XprLiteral< POD > \
madcowswe 0:feb4117d16d8 404 > expr_type; \
madcowswe 0:feb4117d16d8 405 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 406 expr_type(lhs.const_ref(), XprLiteral< POD >(rhs))); \
madcowswe 0:feb4117d16d8 407 } \
madcowswe 0:feb4117d16d8 408 \
madcowswe 0:feb4117d16d8 409 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 410 inline \
madcowswe 0:feb4117d16d8 411 XprVector< \
madcowswe 0:feb4117d16d8 412 XprBinOp< \
madcowswe 0:feb4117d16d8 413 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 414 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 415 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 416 >, \
madcowswe 0:feb4117d16d8 417 Sz \
madcowswe 0:feb4117d16d8 418 > \
madcowswe 0:feb4117d16d8 419 NAME (POD lhs, const Vector<T, Sz>& rhs) { \
madcowswe 0:feb4117d16d8 420 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 421 Fcnl_##NAME< POD, T>, \
madcowswe 0:feb4117d16d8 422 XprLiteral< POD >, \
madcowswe 0:feb4117d16d8 423 VectorConstReference<T, Sz> \
madcowswe 0:feb4117d16d8 424 > expr_type; \
madcowswe 0:feb4117d16d8 425 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 426 expr_type(XprLiteral< POD >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 427 }
madcowswe 0:feb4117d16d8 428
madcowswe 0:feb4117d16d8 429 TVMET_IMPLEMENT_MACRO(add, int)
madcowswe 0:feb4117d16d8 430 TVMET_IMPLEMENT_MACRO(sub, int)
madcowswe 0:feb4117d16d8 431 TVMET_IMPLEMENT_MACRO(mul, int)
madcowswe 0:feb4117d16d8 432 TVMET_IMPLEMENT_MACRO(div, int)
madcowswe 0:feb4117d16d8 433
madcowswe 0:feb4117d16d8 434 #if defined(TVMET_HAVE_LONG_LONG)
madcowswe 0:feb4117d16d8 435 TVMET_IMPLEMENT_MACRO(add, long long int)
madcowswe 0:feb4117d16d8 436 TVMET_IMPLEMENT_MACRO(sub, long long int)
madcowswe 0:feb4117d16d8 437 TVMET_IMPLEMENT_MACRO(mul, long long int)
madcowswe 0:feb4117d16d8 438 TVMET_IMPLEMENT_MACRO(div, long long int)
madcowswe 0:feb4117d16d8 439 #endif
madcowswe 0:feb4117d16d8 440
madcowswe 0:feb4117d16d8 441 TVMET_IMPLEMENT_MACRO(add, float)
madcowswe 0:feb4117d16d8 442 TVMET_IMPLEMENT_MACRO(sub, float)
madcowswe 0:feb4117d16d8 443 TVMET_IMPLEMENT_MACRO(mul, float)
madcowswe 0:feb4117d16d8 444 TVMET_IMPLEMENT_MACRO(div, float)
madcowswe 0:feb4117d16d8 445
madcowswe 0:feb4117d16d8 446 TVMET_IMPLEMENT_MACRO(add, double)
madcowswe 0:feb4117d16d8 447 TVMET_IMPLEMENT_MACRO(sub, double)
madcowswe 0:feb4117d16d8 448 TVMET_IMPLEMENT_MACRO(mul, double)
madcowswe 0:feb4117d16d8 449 TVMET_IMPLEMENT_MACRO(div, double)
madcowswe 0:feb4117d16d8 450
madcowswe 0:feb4117d16d8 451 #if defined(TVMET_HAVE_LONG_DOUBLE)
madcowswe 0:feb4117d16d8 452 TVMET_IMPLEMENT_MACRO(add, long double)
madcowswe 0:feb4117d16d8 453 TVMET_IMPLEMENT_MACRO(sub, long double)
madcowswe 0:feb4117d16d8 454 TVMET_IMPLEMENT_MACRO(mul, long double)
madcowswe 0:feb4117d16d8 455 TVMET_IMPLEMENT_MACRO(div, long double)
madcowswe 0:feb4117d16d8 456 #endif
madcowswe 0:feb4117d16d8 457
madcowswe 0:feb4117d16d8 458 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 459
madcowswe 0:feb4117d16d8 460
madcowswe 0:feb4117d16d8 461 #if defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 462 /*
madcowswe 0:feb4117d16d8 463 * function(Vector<std::complex<T>, Sz>, std::complex<T>)
madcowswe 0:feb4117d16d8 464 * function(std::complex<T>, Vector<std::complex<T>, Sz>)
madcowswe 0:feb4117d16d8 465 * Note: per se element wise
madcowswe 0:feb4117d16d8 466 * \todo type promotion
madcowswe 0:feb4117d16d8 467 */
madcowswe 0:feb4117d16d8 468 #define TVMET_IMPLEMENT_MACRO(NAME) \
madcowswe 0:feb4117d16d8 469 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 470 inline \
madcowswe 0:feb4117d16d8 471 XprVector< \
madcowswe 0:feb4117d16d8 472 XprBinOp< \
madcowswe 0:feb4117d16d8 473 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 474 VectorConstReference< std::complex<T>, Sz>, \
madcowswe 0:feb4117d16d8 475 XprLiteral< std::complex<T> > \
madcowswe 0:feb4117d16d8 476 >, \
madcowswe 0:feb4117d16d8 477 Sz \
madcowswe 0:feb4117d16d8 478 > \
madcowswe 0:feb4117d16d8 479 NAME (const Vector<std::complex<T>, Sz>& lhs, const std::complex<T>& rhs) { \
madcowswe 0:feb4117d16d8 480 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 481 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 482 VectorConstReference< std::complex<T>, Sz>, \
madcowswe 0:feb4117d16d8 483 XprLiteral< std::complex<T> > \
madcowswe 0:feb4117d16d8 484 > expr_type; \
madcowswe 0:feb4117d16d8 485 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 486 expr_type(lhs.const_ref(), XprLiteral< std::complex<T> >(rhs))); \
madcowswe 0:feb4117d16d8 487 } \
madcowswe 0:feb4117d16d8 488 \
madcowswe 0:feb4117d16d8 489 template<class T, std::size_t Sz> \
madcowswe 0:feb4117d16d8 490 inline \
madcowswe 0:feb4117d16d8 491 XprVector< \
madcowswe 0:feb4117d16d8 492 XprBinOp< \
madcowswe 0:feb4117d16d8 493 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 494 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 495 VectorConstReference< std::complex<T>, Sz> \
madcowswe 0:feb4117d16d8 496 >, \
madcowswe 0:feb4117d16d8 497 Sz \
madcowswe 0:feb4117d16d8 498 > \
madcowswe 0:feb4117d16d8 499 NAME (const std::complex<T>& lhs, const Vector< std::complex<T>, Sz>& rhs) { \
madcowswe 0:feb4117d16d8 500 typedef XprBinOp< \
madcowswe 0:feb4117d16d8 501 Fcnl_##NAME< std::complex<T>, std::complex<T> >, \
madcowswe 0:feb4117d16d8 502 XprLiteral< std::complex<T> >, \
madcowswe 0:feb4117d16d8 503 VectorConstReference< std::complex<T>, Sz> \
madcowswe 0:feb4117d16d8 504 > expr_type; \
madcowswe 0:feb4117d16d8 505 return XprVector<expr_type, Sz>( \
madcowswe 0:feb4117d16d8 506 expr_type(XprLiteral< std::complex<T> >(lhs), rhs.const_ref())); \
madcowswe 0:feb4117d16d8 507 }
madcowswe 0:feb4117d16d8 508
madcowswe 0:feb4117d16d8 509 TVMET_IMPLEMENT_MACRO(add)
madcowswe 0:feb4117d16d8 510 TVMET_IMPLEMENT_MACRO(sub)
madcowswe 0:feb4117d16d8 511 TVMET_IMPLEMENT_MACRO(mul)
madcowswe 0:feb4117d16d8 512 TVMET_IMPLEMENT_MACRO(div)
madcowswe 0:feb4117d16d8 513
madcowswe 0:feb4117d16d8 514 #undef TVMET_IMPLEMENT_MACRO
madcowswe 0:feb4117d16d8 515
madcowswe 0:feb4117d16d8 516 #endif // defined(TVMET_HAVE_COMPLEX)
madcowswe 0:feb4117d16d8 517
madcowswe 0:feb4117d16d8 518
madcowswe 0:feb4117d16d8 519 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 520 * vector specific functions
madcowswe 0:feb4117d16d8 521 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 522
madcowswe 0:feb4117d16d8 523
madcowswe 0:feb4117d16d8 524 /**
madcowswe 0:feb4117d16d8 525 * \fn sum(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 526 * \brief Compute the sum of the vector.
madcowswe 0:feb4117d16d8 527 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 528 *
madcowswe 0:feb4117d16d8 529 * Simply compute the sum of the given vector as:
madcowswe 0:feb4117d16d8 530 * \f[
madcowswe 0:feb4117d16d8 531 * \sum_{i = 0}^{Sz-1} v[i]
madcowswe 0:feb4117d16d8 532 * \f]
madcowswe 0:feb4117d16d8 533 */
madcowswe 0:feb4117d16d8 534 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 535 inline
madcowswe 0:feb4117d16d8 536 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 537 sum(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 538 return meta::Vector<Sz>::sum(v);
madcowswe 0:feb4117d16d8 539 }
madcowswe 0:feb4117d16d8 540
madcowswe 0:feb4117d16d8 541
madcowswe 0:feb4117d16d8 542 /**
madcowswe 0:feb4117d16d8 543 * \fn product(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 544 * \brief Compute the product of the vector elements.
madcowswe 0:feb4117d16d8 545 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 546 *
madcowswe 0:feb4117d16d8 547 * Simply computer the product of the given vector as:
madcowswe 0:feb4117d16d8 548 * \f[
madcowswe 0:feb4117d16d8 549 * \prod_{i = 0}^{Sz - 1} v[i]
madcowswe 0:feb4117d16d8 550 * \f]
madcowswe 0:feb4117d16d8 551 */
madcowswe 0:feb4117d16d8 552 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 553 inline
madcowswe 0:feb4117d16d8 554 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 555 product(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 556 return meta::Vector<Sz>::product(v);
madcowswe 0:feb4117d16d8 557 }
madcowswe 0:feb4117d16d8 558
madcowswe 0:feb4117d16d8 559
madcowswe 0:feb4117d16d8 560 /**
madcowswe 0:feb4117d16d8 561 * \fn dot(const Vector<T1, Sz>& lhs, const Vector<T2, Sz>& rhs)
madcowswe 0:feb4117d16d8 562 * \brief Compute the dot/inner product
madcowswe 0:feb4117d16d8 563 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 564 *
madcowswe 0:feb4117d16d8 565 * Compute the dot product as:
madcowswe 0:feb4117d16d8 566 * \f[
madcowswe 0:feb4117d16d8 567 * \sum_{i = 0}^{Sz - 1} ( lhs[i] * rhs[i] )
madcowswe 0:feb4117d16d8 568 * \f]
madcowswe 0:feb4117d16d8 569 * where lhs is a column vector and rhs is a row vector, both vectors
madcowswe 0:feb4117d16d8 570 * have the same dimension.
madcowswe 0:feb4117d16d8 571 */
madcowswe 0:feb4117d16d8 572 template<class T1, class T2, std::size_t Sz>
madcowswe 0:feb4117d16d8 573 inline
madcowswe 0:feb4117d16d8 574 typename PromoteTraits<T1, T2>::value_type
madcowswe 0:feb4117d16d8 575 dot(const Vector<T1, Sz>& lhs, const Vector<T2, Sz>& rhs) {
madcowswe 0:feb4117d16d8 576 return meta::Vector<Sz>::dot(lhs, rhs);
madcowswe 0:feb4117d16d8 577 }
madcowswe 0:feb4117d16d8 578
madcowswe 0:feb4117d16d8 579
madcowswe 0:feb4117d16d8 580 /**
madcowswe 0:feb4117d16d8 581 * \fn cross(const Vector<T1, 3>& lhs, const Vector<T2, 3>& rhs)
madcowswe 0:feb4117d16d8 582 * \brief Compute the cross/outer product
madcowswe 0:feb4117d16d8 583 * \ingroup _binary_function
madcowswe 0:feb4117d16d8 584 * \note working only for vectors of size = 3
madcowswe 0:feb4117d16d8 585 * \todo Implement vector outer product as ET and MT, returning a XprVector
madcowswe 0:feb4117d16d8 586 */
madcowswe 0:feb4117d16d8 587 template<class T1, class T2>
madcowswe 0:feb4117d16d8 588 inline
madcowswe 0:feb4117d16d8 589 Vector<typename PromoteTraits<T1, T2>::value_type, 3>
madcowswe 0:feb4117d16d8 590 cross(const Vector<T1, 3>& lhs, const Vector<T2, 3>& rhs) {
madcowswe 0:feb4117d16d8 591 typedef typename PromoteTraits<T1, T2>::value_type value_type;
madcowswe 0:feb4117d16d8 592 return Vector<value_type, 3>(lhs(1)*rhs(2) - rhs(1)*lhs(2),
madcowswe 0:feb4117d16d8 593 rhs(0)*lhs(2) - lhs(0)*rhs(2),
madcowswe 0:feb4117d16d8 594 lhs(0)*rhs(1) - rhs(0)*lhs(1));
madcowswe 0:feb4117d16d8 595 }
madcowswe 0:feb4117d16d8 596
madcowswe 0:feb4117d16d8 597
madcowswe 0:feb4117d16d8 598 /**
madcowswe 0:feb4117d16d8 599 * \fn norm1(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 600 * \brief The \f$l_1\f$ norm of a vector v.
madcowswe 0:feb4117d16d8 601 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 602 * The norm of any vector is just the square root of the dot product of
madcowswe 0:feb4117d16d8 603 * a vector with itself, or
madcowswe 0:feb4117d16d8 604 *
madcowswe 0:feb4117d16d8 605 * \f[
madcowswe 0:feb4117d16d8 606 * |Vector<T, Sz> v| = |v| = \sum_{i=0}^{Sz-1}\,|v[i]|
madcowswe 0:feb4117d16d8 607 * \f]
madcowswe 0:feb4117d16d8 608 */
madcowswe 0:feb4117d16d8 609 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 610 inline
madcowswe 0:feb4117d16d8 611 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 612 norm1(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 613 return sum(abs(v));
madcowswe 0:feb4117d16d8 614 }
madcowswe 0:feb4117d16d8 615
madcowswe 0:feb4117d16d8 616
madcowswe 0:feb4117d16d8 617 /**
madcowswe 0:feb4117d16d8 618 * \fn norm2(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 619 * \brief The euklidian norm (or \f$l_2\f$ norm) of a vector v.
madcowswe 0:feb4117d16d8 620 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 621 * The norm of any vector is just the square root of the dot product of
madcowswe 0:feb4117d16d8 622 * a vector with itself, or
madcowswe 0:feb4117d16d8 623 *
madcowswe 0:feb4117d16d8 624 * \f[
madcowswe 0:feb4117d16d8 625 * |Vector<T, Sz> v| = |v| = \sqrt{ \sum_{i=0}^{Sz-1}\,v[i]^2 }
madcowswe 0:feb4117d16d8 626 * \f]
madcowswe 0:feb4117d16d8 627 *
madcowswe 0:feb4117d16d8 628 * \note The internal cast for Vector<int> avoids warnings on sqrt.
madcowswe 0:feb4117d16d8 629 */
madcowswe 0:feb4117d16d8 630 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 631 inline
madcowswe 0:feb4117d16d8 632 typename NumericTraits<T>::sum_type
madcowswe 0:feb4117d16d8 633 norm2(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 634 return static_cast<T>( std::sqrt(static_cast<typename NumericTraits<T>::float_type>(dot(v, v))) );
madcowswe 0:feb4117d16d8 635 }
madcowswe 0:feb4117d16d8 636
madcowswe 0:feb4117d16d8 637
madcowswe 0:feb4117d16d8 638 /**
madcowswe 0:feb4117d16d8 639 * \fn normalize(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 640 * \brief Normalize the given vector.
madcowswe 0:feb4117d16d8 641 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 642 * \sa norm2
madcowswe 0:feb4117d16d8 643 *
madcowswe 0:feb4117d16d8 644 * using the equation:
madcowswe 0:feb4117d16d8 645 * \f[
madcowswe 0:feb4117d16d8 646 * \frac{Vector<T, Sz> v}{\sqrt{ \sum_{i=0}^{Sz-1}\,v[i]^2 }}
madcowswe 0:feb4117d16d8 647 * \f]
madcowswe 0:feb4117d16d8 648 */
madcowswe 0:feb4117d16d8 649 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 650 inline
madcowswe 0:feb4117d16d8 651 XprVector<
madcowswe 0:feb4117d16d8 652 XprBinOp<
madcowswe 0:feb4117d16d8 653 Fcnl_div<T, T>,
madcowswe 0:feb4117d16d8 654 VectorConstReference<T, Sz>,
madcowswe 0:feb4117d16d8 655 XprLiteral< T >
madcowswe 0:feb4117d16d8 656 >,
madcowswe 0:feb4117d16d8 657 Sz
madcowswe 0:feb4117d16d8 658 >
madcowswe 0:feb4117d16d8 659 normalize(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 660 typedef XprBinOp<
madcowswe 0:feb4117d16d8 661 Fcnl_div<T, T>,
madcowswe 0:feb4117d16d8 662 VectorConstReference<T, Sz>,
madcowswe 0:feb4117d16d8 663 XprLiteral< T >
madcowswe 0:feb4117d16d8 664 > expr_type;
madcowswe 0:feb4117d16d8 665 return XprVector<expr_type, Sz>(
madcowswe 0:feb4117d16d8 666 expr_type(v.const_ref(), XprLiteral< T >(norm2(v))));
madcowswe 0:feb4117d16d8 667 }
madcowswe 0:feb4117d16d8 668
madcowswe 0:feb4117d16d8 669
madcowswe 0:feb4117d16d8 670 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++
madcowswe 0:feb4117d16d8 671 * min/max unary functions
madcowswe 0:feb4117d16d8 672 *+++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
madcowswe 0:feb4117d16d8 673
madcowswe 0:feb4117d16d8 674
madcowswe 0:feb4117d16d8 675 /**
madcowswe 0:feb4117d16d8 676 * \fn maximum(const XprVector<E, Sz>& e)
madcowswe 0:feb4117d16d8 677 * \brief Find the maximum of a vector expression
madcowswe 0:feb4117d16d8 678 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 679 */
madcowswe 0:feb4117d16d8 680 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 681 inline
madcowswe 0:feb4117d16d8 682 Extremum<typename E::value_type, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 683 maximum(const XprVector<E, Sz>& e) {
madcowswe 0:feb4117d16d8 684 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 685
madcowswe 0:feb4117d16d8 686 value_type m_max(e(0));
madcowswe 0:feb4117d16d8 687 std::size_t m_idx(0);
madcowswe 0:feb4117d16d8 688
madcowswe 0:feb4117d16d8 689 // this loop is faster than meta templates!
madcowswe 0:feb4117d16d8 690 for(std::size_t i = 1; i != Sz; ++i) {
madcowswe 0:feb4117d16d8 691 if(e(i) > m_max) {
madcowswe 0:feb4117d16d8 692 m_max = e(i);
madcowswe 0:feb4117d16d8 693 m_idx = i;
madcowswe 0:feb4117d16d8 694 }
madcowswe 0:feb4117d16d8 695 }
madcowswe 0:feb4117d16d8 696
madcowswe 0:feb4117d16d8 697 return Extremum<value_type, std::size_t, vector_tag>(m_max, m_idx);
madcowswe 0:feb4117d16d8 698 }
madcowswe 0:feb4117d16d8 699
madcowswe 0:feb4117d16d8 700
madcowswe 0:feb4117d16d8 701 /**
madcowswe 0:feb4117d16d8 702 * \fn maximum(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 703 * \brief Find the maximum of a vector
madcowswe 0:feb4117d16d8 704 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 705 */
madcowswe 0:feb4117d16d8 706 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 707 inline
madcowswe 0:feb4117d16d8 708 Extremum<T, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 709 maximum(const Vector<T, Sz>& v) { return maximum(v.as_expr()); }
madcowswe 0:feb4117d16d8 710
madcowswe 0:feb4117d16d8 711
madcowswe 0:feb4117d16d8 712 /**
madcowswe 0:feb4117d16d8 713 * \fn minimum(const XprVector<E, Sz>& e)
madcowswe 0:feb4117d16d8 714 * \brief Find the minimum of a vector expression
madcowswe 0:feb4117d16d8 715 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 716 */
madcowswe 0:feb4117d16d8 717 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 718 inline
madcowswe 0:feb4117d16d8 719 Extremum<typename E::value_type, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 720 minimum(const XprVector<E, Sz>& e) {
madcowswe 0:feb4117d16d8 721 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 722
madcowswe 0:feb4117d16d8 723 value_type m_min(e(0));
madcowswe 0:feb4117d16d8 724 std::size_t m_idx(0);
madcowswe 0:feb4117d16d8 725
madcowswe 0:feb4117d16d8 726 // this loop is faster than meta templates!
madcowswe 0:feb4117d16d8 727 for(std::size_t i = 1; i != Sz; ++i) {
madcowswe 0:feb4117d16d8 728 if(e(i) < m_min) {
madcowswe 0:feb4117d16d8 729 m_min = e(i);
madcowswe 0:feb4117d16d8 730 m_idx = i;
madcowswe 0:feb4117d16d8 731 }
madcowswe 0:feb4117d16d8 732 }
madcowswe 0:feb4117d16d8 733
madcowswe 0:feb4117d16d8 734 return Extremum<value_type, std::size_t, vector_tag>(m_min, m_idx);
madcowswe 0:feb4117d16d8 735 }
madcowswe 0:feb4117d16d8 736
madcowswe 0:feb4117d16d8 737
madcowswe 0:feb4117d16d8 738 /**
madcowswe 0:feb4117d16d8 739 * \fn minimum(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 740 * \brief Find the minimum of a vector
madcowswe 0:feb4117d16d8 741 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 742 */
madcowswe 0:feb4117d16d8 743 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 744 inline
madcowswe 0:feb4117d16d8 745 Extremum<T, std::size_t, vector_tag>
madcowswe 0:feb4117d16d8 746 minimum(const Vector<T, Sz>& v) { return minimum(v.as_expr()); }
madcowswe 0:feb4117d16d8 747
madcowswe 0:feb4117d16d8 748
madcowswe 0:feb4117d16d8 749 /**
madcowswe 0:feb4117d16d8 750 * \fn max(const XprVector<E, Sz>& e)
madcowswe 0:feb4117d16d8 751 * \brief Find the maximum of a vector expression
madcowswe 0:feb4117d16d8 752 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 753 */
madcowswe 0:feb4117d16d8 754 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 755 inline
madcowswe 0:feb4117d16d8 756 typename E::value_type
madcowswe 0:feb4117d16d8 757 max(const XprVector<E, Sz>& e) {
madcowswe 0:feb4117d16d8 758 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 759
madcowswe 0:feb4117d16d8 760 value_type m_max(e(0));
madcowswe 0:feb4117d16d8 761
madcowswe 0:feb4117d16d8 762 // this loop is faster than meta templates!
madcowswe 0:feb4117d16d8 763 for(std::size_t i = 1; i != Sz; ++i)
madcowswe 0:feb4117d16d8 764 if(e(i) > m_max)
madcowswe 0:feb4117d16d8 765 m_max = e(i);
madcowswe 0:feb4117d16d8 766
madcowswe 0:feb4117d16d8 767 return m_max;
madcowswe 0:feb4117d16d8 768 }
madcowswe 0:feb4117d16d8 769
madcowswe 0:feb4117d16d8 770
madcowswe 0:feb4117d16d8 771 /**
madcowswe 0:feb4117d16d8 772 * \fn max(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 773 * \brief Find the maximum of a vector
madcowswe 0:feb4117d16d8 774 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 775 */
madcowswe 0:feb4117d16d8 776 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 777 inline
madcowswe 0:feb4117d16d8 778 T max(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 779 typedef T value_type;
madcowswe 0:feb4117d16d8 780 typedef typename Vector<T, Sz>::const_iterator const_iterator;
madcowswe 0:feb4117d16d8 781
madcowswe 0:feb4117d16d8 782 const_iterator iter(v.begin());
madcowswe 0:feb4117d16d8 783 const_iterator last(v.end());
madcowswe 0:feb4117d16d8 784 value_type temp(*iter);
madcowswe 0:feb4117d16d8 785
madcowswe 0:feb4117d16d8 786 for( ; iter != last; ++iter)
madcowswe 0:feb4117d16d8 787 if(*iter > temp)
madcowswe 0:feb4117d16d8 788 temp = *iter;
madcowswe 0:feb4117d16d8 789
madcowswe 0:feb4117d16d8 790 return temp;
madcowswe 0:feb4117d16d8 791 }
madcowswe 0:feb4117d16d8 792
madcowswe 0:feb4117d16d8 793
madcowswe 0:feb4117d16d8 794 /**
madcowswe 0:feb4117d16d8 795 * \fn min(const XprVector<E, Sz>& e)
madcowswe 0:feb4117d16d8 796 * \brief Find the minimum of a vector expression
madcowswe 0:feb4117d16d8 797 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 798 */
madcowswe 0:feb4117d16d8 799 template<class E, std::size_t Sz>
madcowswe 0:feb4117d16d8 800 inline
madcowswe 0:feb4117d16d8 801 typename E::value_type
madcowswe 0:feb4117d16d8 802 min(const XprVector<E, Sz>& e) {
madcowswe 0:feb4117d16d8 803 typedef typename E::value_type value_type;
madcowswe 0:feb4117d16d8 804
madcowswe 0:feb4117d16d8 805 value_type m_min(e(0));
madcowswe 0:feb4117d16d8 806
madcowswe 0:feb4117d16d8 807 // this loop is faster than meta templates!
madcowswe 0:feb4117d16d8 808 for(std::size_t i = 1; i != Sz; ++i)
madcowswe 0:feb4117d16d8 809 if(e(i) < m_min)
madcowswe 0:feb4117d16d8 810 m_min = e(i);
madcowswe 0:feb4117d16d8 811
madcowswe 0:feb4117d16d8 812 return m_min;
madcowswe 0:feb4117d16d8 813 }
madcowswe 0:feb4117d16d8 814
madcowswe 0:feb4117d16d8 815
madcowswe 0:feb4117d16d8 816 /**
madcowswe 0:feb4117d16d8 817 * \fn min(const Vector<T, Sz>& v)
madcowswe 0:feb4117d16d8 818 * \brief Find the minimum of a vector
madcowswe 0:feb4117d16d8 819 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 820 */
madcowswe 0:feb4117d16d8 821 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 822 inline
madcowswe 0:feb4117d16d8 823 T min(const Vector<T, Sz>& v) {
madcowswe 0:feb4117d16d8 824 typedef T value_type;
madcowswe 0:feb4117d16d8 825 typedef typename Vector<T, Sz>::const_iterator const_iterator;
madcowswe 0:feb4117d16d8 826
madcowswe 0:feb4117d16d8 827 const_iterator iter(v.begin());
madcowswe 0:feb4117d16d8 828 const_iterator last(v.end());
madcowswe 0:feb4117d16d8 829 value_type temp(*iter);
madcowswe 0:feb4117d16d8 830
madcowswe 0:feb4117d16d8 831 for( ; iter != last; ++iter)
madcowswe 0:feb4117d16d8 832 if(*iter < temp)
madcowswe 0:feb4117d16d8 833 temp = *iter;
madcowswe 0:feb4117d16d8 834
madcowswe 0:feb4117d16d8 835 return temp;
madcowswe 0:feb4117d16d8 836 }
madcowswe 0:feb4117d16d8 837
madcowswe 0:feb4117d16d8 838
madcowswe 0:feb4117d16d8 839 /**
madcowswe 0:feb4117d16d8 840 * \fn cvector_ref(const T* mem)
madcowswe 0:feb4117d16d8 841 * \brief Creates an expression wrapper for a C like vector arrays.
madcowswe 0:feb4117d16d8 842 * \ingroup _unary_function
madcowswe 0:feb4117d16d8 843 *
madcowswe 0:feb4117d16d8 844 * This is like creating a vector of external data, as described
madcowswe 0:feb4117d16d8 845 * at \ref construct. With this function you wrap an expression
madcowswe 0:feb4117d16d8 846 * around a C style vector array and you can operate directly with it
madcowswe 0:feb4117d16d8 847 * as usual.
madcowswe 0:feb4117d16d8 848 *
madcowswe 0:feb4117d16d8 849 * \par Example:
madcowswe 0:feb4117d16d8 850 * \code
madcowswe 0:feb4117d16d8 851 * static float vertices[N][3] = {
madcowswe 0:feb4117d16d8 852 * {-1, 0, 1}, { 1, 0, 1}, ...
madcowswe 0:feb4117d16d8 853 * };
madcowswe 0:feb4117d16d8 854 * ...
madcowswe 0:feb4117d16d8 855 * typedef Vector<float, 3> vector_type;
madcowswe 0:feb4117d16d8 856 * ...
madcowswe 0:feb4117d16d8 857 * vector_type V( cross(cvector_ref<float, 3>(&vertices[0][0]),
madcowswe 0:feb4117d16d8 858 * cvector_ref<float, 3>(&vertices[1][0])) );
madcowswe 0:feb4117d16d8 859 * \endcode
madcowswe 0:feb4117d16d8 860 *
madcowswe 0:feb4117d16d8 861 * \since release 1.6.0
madcowswe 0:feb4117d16d8 862 */
madcowswe 0:feb4117d16d8 863 template<class T, std::size_t Sz>
madcowswe 0:feb4117d16d8 864 inline
madcowswe 0:feb4117d16d8 865 XprVector<
madcowswe 0:feb4117d16d8 866 VectorConstReference<T, Sz>,
madcowswe 0:feb4117d16d8 867 Sz
madcowswe 0:feb4117d16d8 868 >
madcowswe 0:feb4117d16d8 869 cvector_ref(const T* mem) {
madcowswe 0:feb4117d16d8 870 typedef VectorConstReference<T, Sz> expr_type;
madcowswe 0:feb4117d16d8 871
madcowswe 0:feb4117d16d8 872 return XprVector<expr_type, Sz>(expr_type(mem));
madcowswe 0:feb4117d16d8 873 }
madcowswe 0:feb4117d16d8 874
madcowswe 0:feb4117d16d8 875
madcowswe 0:feb4117d16d8 876 } // namespace tvmet
madcowswe 0:feb4117d16d8 877
madcowswe 0:feb4117d16d8 878 #endif // TVMET_VECTOR_FUNCTIONS_H
madcowswe 0:feb4117d16d8 879
madcowswe 0:feb4117d16d8 880 // Local Variables:
madcowswe 0:feb4117d16d8 881 // mode:C++
madcowswe 0:feb4117d16d8 882 // tab-width:8
madcowswe 0:feb4117d16d8 883 // End: