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