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