tvector_arithmetic.h - numeric - C++ library with numerical algorithms
 (HTM) git clone git://src.adamsgaard.dk/numeric
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tvector_arithmetic.h (2619B)
       ---
            1 // Make sure header is only included once
            2 #ifndef VECTOR_ARITHMETIC_H_
            3 #define VECTOR_ARITHMETIC_H_
            4 
            5 #include <vector>
            6 #include <cmath> // for sqrt
            7 #include "typedefs.h"
            8 
            9 //// Overload vector methods to allow scalar-
           10 //// and element-wise arithmetic operations
           11 
           12 // Scalar multiplication (same scalar for real and imaginary parts)
           13 std::vector<std::complex<Floattype> > 
           14         operator*(const std::vector<std::complex<Floattype> > vec,
           15                       const Floattype scalar)
           16 {
           17   std::vector<std::complex<Floattype> > result(vec.size());
           18   for (Inttype i=0; i<vec.size(); ++i) {
           19     result[i].real() = real(vec[i])*scalar;
           20     result[i].imag() = imag(vec[i])*scalar;
           21   }
           22   return result;
           23 }
           24 
           25 // Scalar multiplication
           26 std::vector<std::complex<Floattype> > 
           27         operator*(const std::vector<std::complex<Floattype> > vec,
           28                       const std::complex<Floattype> scalar)
           29 {
           30   std::vector<std::complex<Floattype> > result(vec.size());
           31   for (Inttype i=0; i<(Inttype)vec.size(); ++i)
           32     result[i] = vec[i]*scalar;
           33   return result;
           34 }
           35 
           36 // Scalar division 
           37 std::vector<std::complex<Floattype> > 
           38         operator/(const std::vector<std::complex<Floattype> > vec,
           39                       const std::complex<Floattype> scalar)
           40 {
           41   std::vector<std::complex<Floattype> > result(vec.size());
           42   for (Inttype i=0; i<(Inttype)vec.size(); ++i)
           43     result[i] = vec[i]/scalar;
           44   return result;
           45 }
           46 
           47 // Element-wise addition
           48 std::vector<std::complex<Floattype> > 
           49         operator+(const std::vector<std::complex<Floattype> > vec1, 
           50                       const std::vector<std::complex<Floattype> > vec2)
           51 {
           52   std::vector<std::complex<Floattype> > result(vec1.size());
           53   for (Inttype i=0; i<(Inttype)vec1.size(); ++i)
           54     result[i] = vec1[i] + vec2[i];
           55   return result;
           56 }
           57 
           58 // Element-wise subtraction
           59 std::vector<std::complex<Floattype> > 
           60         operator-(const std::vector<std::complex<Floattype> > vec1,
           61                       const std::vector<std::complex<Floattype> > vec2)
           62 {
           63   std::vector<std::complex<Floattype> > result(vec1.size());
           64   for (Inttype i=0; i<(Inttype)vec1.size(); ++i)
           65     result[i] = vec1[i] - vec2[i];
           66   return result;
           67 }
           68 
           69 // Element-wise multiplication
           70 std::vector<std::complex<Floattype> >
           71         operator*(const std::vector<std::complex<Floattype> > vec1,
           72                       const std::vector<std::complex<Floattype> > vec2)
           73 {
           74   std::vector<std::complex<Floattype> > result(vec1.size());
           75   for (Inttype i=0; i<(Inttype)vec1.size(); ++i)
           76     result[i] = vec1[i] * vec2[i];
           77   return result;
           78 }
           79 
           80 // Normalize vector
           81 Floattype cnorm(const std::vector<std::complex<Floattype> > vec)
           82 {
           83   Floattype res = 0.0f;
           84   for (Inttype i=0; i<(Inttype)vec.size(); ++i)
           85     res += norm(vec[i])*norm(vec[i]);
           86   return sqrt(res);
           87 }
           88 
           89 #endif