27 #include <boost/algorithm/string.hpp> 28 #include <boost/lexical_cast.hpp> 36 template class JVector<int>;
37 template class JVector<float>;
38 template class JVector<double>;
39 template class JVector<char>;
41 template <
class F> JVector<F>::JVector(std::string raw_data) {
42 ParseRawData(raw_data);
45 template <
class F> JVector<F>::JVector(std::vector<F> vec) {
46 underlying_vector = vec;
49 template <
class F> JVector<F>::JVector(F* ptr, uint ptr_size) {
51 underlying_vector.reserve(underlying_vector.size() + ptr_size);
52 std::copy(&ptr[0], &ptr[ptr_size], std::back_inserter(underlying_vector));
55 template <
class F> JVector<F>::JVector(uint size) {
56 underlying_vector.reserve( size );
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);
64 template <
class F> JVector<F>::JVector() {}
66 template <
class F> JVector<F>::~JVector() {
67 underlying_vector.clear();
70 template <
class F>
bool JVector<F>::check_if_arithmetic(F input) {
72 if ( !std::is_arithmetic<F>::value ) {
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);
85 template <
class F> uint JVector<F>::size() {
86 return underlying_vector.size();
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);
93 template <
class F>
void JVector<F>::ParseRawData( std::string raw_data ) {
95 uint lines = num_chars(raw_data,
'\n');
97 std::istringstream data_stream(raw_data);
99 for (uint i = 0; i < lines; i++) {
101 std::getline(data_stream, input);
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;
111 template <
class F>
double JVector<F>::sum(std::vector<F>& data_list,
double exponent) {
115 for ( uint i = 0 ; i < data_list.size(); i ++) {
116 tot += pow( data_list[i], exponent );
122 template <
class F>
double JVector<F>::mean(std::vector<F>& data_list) {
124 double sum_x=sum(data_list,1.0);
125 double n=data_list.size();
129 template <
class F>
double JVector<F>::mean() {
130 return mean(underlying_vector);
133 template <
class F> F JVector<F>::min() {
134 F min_power= *std::min_element(underlying_vector.begin(), underlying_vector.end());
138 template <
class F> F JVector<F>::max() {
139 F min_power= *std::max_element(underlying_vector.begin(), underlying_vector.end());
143 template <
class F>
double JVector<F>::std_dev(std::vector<F> &data_list) {
146 double sum_x=sum(data_list,1.0);
147 double n=data_list.size();
148 double mean = sum_x/n;
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);
155 return sqrt(sigma_sqr);
158 template <
class F>
double JVector<F>::std_dev() {
159 return std_dev(underlying_vector);
162 template <
class F>
double JVector<F>::norm() {
163 return sqrt(sum(underlying_vector,2.0));
167 template <
class F>
void JVector<F>::Normalize() {
168 double norm_factor=sqrt(sum(underlying_vector,2.0));
170 for(
unsigned int i = 0; i<underlying_vector.size(); i++) {
171 underlying_vector.at(i)=underlying_vector.at(i)/norm_factor;