tvector_arithmetic.h - numeric - C++ library with numerical algorithms | |
git clone git://src.adamsgaard.dk/numeric | |
Log | |
Files | |
Refs | |
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 |