JASPL  0.2
Just Another Signal Processing Library
jvector.cpp
1 // Header for this file
2 #include "jvector.h"
3 // C System-Headers
4 #include <termios.h> /* POSIX terminal control definitions */
5 #include <sys/ioctl.h>
6 #include <fcntl.h> //fopen(),fclose()
7 #include <unistd.h> //read(), write()
8 #include <stdio.h>
9 
10 // C++ System headers
11 #include <vector> //vector
12 #include <string> //string
13 #include <fstream> //iss* ofstream
14 #include <chrono> // timing functions
15 #include <cmath> //sqrt, abs
16 #include <iostream> //cout
17 #include <typeinfo> //typeid
18 #include <algorithm> // transform, find, count, erase
19 #include <functional> // plus/minus/multiplies
20 #include <utility> //std::make_pair
21 #include <map> //std::map
22 #include <typeinfo> //typeid
23 #include <mutex> //protect against concurrent access when using (unordered) parallel for loops
24 #include <assert.h> //static_assert
25 
26 // Boost Headers
27 #include <boost/algorithm/string.hpp> //split() and is_any_of for parsing .csv files
28 #include <boost/lexical_cast.hpp> //lexical cast (unsurprisingly)
29 #include <dirent.h>
30 
31 // Miscellaneous Headers
32 #include <omp.h> //OpenMP pragmas
33 
34 namespace jaspl {
35 
36 template class JVector<int>;
37 template class JVector<float>;
38 template class JVector<double>;
39 template class JVector<char>;
40 
41 template <class F> JVector<F>::JVector(std::string raw_data) {
42  ParseRawData(raw_data);
43 }
44 
45 template <class F> JVector<F>::JVector(std::vector<F> vec) {
46  underlying_vector = vec;
47 }
48 
49 template <class F> JVector<F>::JVector(F* ptr, uint ptr_size) {
50 
51  underlying_vector.reserve(underlying_vector.size() + ptr_size);
52  std::copy(&ptr[0], &ptr[ptr_size], std::back_inserter(underlying_vector));
53 }
54 
55 template <class F> JVector<F>::JVector(uint size) {
56  underlying_vector.reserve( size );
57 }
58 
59 template <class F> JVector<F>::JVector(uint size, F fill_element) {
60  underlying_vector.reserve( size );
61  underlying_vector = std::vector<F> ( size , fill_element);
62 }
63 
64 template <class F> JVector<F>::JVector() {}
65 
66 template <class F> JVector<F>::~JVector() {
67  underlying_vector.clear();
68 }
69 
70 template <class F> bool JVector<F>::check_if_arithmetic(F input) {
71 
72  if ( !std::is_arithmetic<F>::value ) {
73 
74  std::string err_mesg = "JVector: ";
75  err_mesg += "cannot initialize from non-arithmetic type ";
76  err_mesg += boost::lexical_cast<std::string>(typeid(input).name());
77  throw std::invalid_argument(err_mesg);
78 
79  return false;
80  } else {
81  return true;
82  }
83 }
84 
85 template <class F> uint JVector<F>::size() {
86  return underlying_vector.size();
87 }
88 
89 template <class F> uint JVector<F>::num_chars(std::string raw_data, char delim) {
90  return std::count(raw_data.begin(), raw_data.end(), delim);
91 }
92 
93 template <class F> void JVector<F>::ParseRawData( std::string raw_data ) {
94 
95  uint lines = num_chars(raw_data, '\n');
96 
97  std::istringstream data_stream(raw_data);
98 
99  for (uint i = 0; i < lines; i++) {
100  std::string input;
101  std::getline(data_stream, input);
102  try {
103  F val = boost::lexical_cast<F>(input);
104  underlying_vector.push_back(val);
105  } catch (const boost::bad_lexical_cast& err) {
106  std::cerr << err.what() << std::endl;
107  }
108  }
109 }
110 
111 template <class F> double JVector<F>::sum(std::vector<F>& data_list,double exponent) {
112 
113  double tot=0;
114 
115  for ( uint i = 0 ; i < data_list.size(); i ++) {
116  tot += pow( data_list[i], exponent );
117  }
118 
119  return tot;
120 }
121 
122 template <class F> double JVector<F>::mean(std::vector<F>& data_list) {
123  //compute mean value of data set
124  double sum_x=sum(data_list,1.0);
125  double n=data_list.size();
126  return sum_x/n;
127 }
128 
129 template <class F> double JVector<F>::mean() {
130  return mean(underlying_vector);
131 }
132 
133 template <class F> F JVector<F>::min() {
134  F min_power= *std::min_element(underlying_vector.begin(), underlying_vector.end());
135  return min_power;
136 }
137 
138 template <class F> F JVector<F>::max() {
139  F min_power= *std::max_element(underlying_vector.begin(), underlying_vector.end());
140  return min_power;
141 }
142 
143 template <class F> double JVector<F>::std_dev(std::vector<F> &data_list) {
144 
145  //compute mean value of data set
146  double sum_x=sum(data_list,1.0);
147  double n=data_list.size();
148  double mean = sum_x/n;
149 
150  //compute variance taking into account Bessel's correction i.e. n/(n-1)
151  double sum_x2=sum(data_list,2.0);
152  double sigma_sqr=sum_x2/(n-1.0)-n/(n-1.0)*pow(mean,2.0);
153 
154  //return square root of variance
155  return sqrt(sigma_sqr);
156 }
157 
158 template <class F> double JVector<F>::std_dev() {
159  return std_dev(underlying_vector);
160 }
161 
162 template <class F> double JVector<F>::norm() {
163  return sqrt(sum(underlying_vector,2.0));
164 
165 }
166 
167 template <class F> void JVector<F>::Normalize() {
168  double norm_factor=sqrt(sum(underlying_vector,2.0));
169 
170  for(unsigned int i = 0; i<underlying_vector.size(); i++) {
171  underlying_vector.at(i)=underlying_vector.at(i)/norm_factor;
172  }
173 }
174 
175 }