source: trunk/src/vector.cc @ 259

Last change on this file since 259 was 259, checked in by Jari Häkkinen, 18 years ago

Moved out shuffle from vecotr class.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.5 KB
Line 
1// $Id: vector.cc 259 2005-03-04 01:09:55Z jari $
2
3#include "vector.h"
4
5#include <iostream>
6#include <sstream>
7#include <string>
8#include <vector>
9#include <utility>
10
11
12
13
14
15namespace theplu {
16namespace gslapi {
17
18
19
20  vector::vector(void)
21    : v_(NULL), view_(NULL)
22  {
23  }
24
25
26
27  vector::vector(const size_t n,const double init_value)
28    : view_(NULL)
29  {
30    v_ = gsl_vector_alloc(n);
31    set_all(init_value);
32  }
33
34
35
36  vector::vector(const vector& other)
37    : view_(NULL)
38  {
39    v_ = other.TEMP_gsl_vector_copy();
40  }
41
42
43
44  vector::vector(vector& v, size_t offset, size_t n, size_t stride)
45  {
46    view_ = new gsl_vector_view(gsl_vector_subvector_with_stride(v.v_,offset,
47                                                                 stride,n));
48    v_ = &(view_->vector);
49  }
50
51
52
53  vector::vector(gsl_vector* vec)
54    : v_(vec), view_(NULL)
55  {
56  }
57
58
59
60  vector::vector(std::istream& is)
61    : view_(NULL)
62  {
63    using namespace std;
64 
65    // read the data file and store in stl vectors (dynamically expandable)
66    std::vector<std::vector<double> > data_matrix;
67    u_int nof_columns=0;
68    u_int nof_rows = 0;
69    string s;
70    for (nof_rows = 0; getline(is, s, '\n'); nof_rows++) {
71      istringstream line(s);
72      std::vector<double> v;
73      string tmp_string;
74      while (line >> tmp_string) {
75        if(!is.good()) {
76          // Jari. change to throw exception, remove unnecessary includes
77          cerr << "vector::vector(std::istream&): "
78               << "error reading data file!" << endl;
79          exit(1);
80        }
81        double t=atof(tmp_string.c_str());
82        // Here we should check that it actually was a double!!!!!
83        v.push_back(t);
84      }
85
86      // Ignoring empty lines
87      if(!v.size()){
88        nof_rows--;
89        continue;
90      }
91
92      if(nof_columns==0)
93        nof_columns=v.size();
94      else if(v.size()!=nof_columns) {
95        // Jari. change to throw exception, remove unnecessary includes
96        cerr << "vector::vector(std::istream&) data file error: "
97             << "line" << nof_rows+1 << " has " << v.size() 
98             << " columns; expected " << nof_columns
99             << " columns"
100             << endl; 
101        exit(1);
102      }
103      data_matrix.push_back(v);
104    }
105 
106    // manipulate the state of the stream to be good
107    is.clear(std::ios::goodbit);
108 
109    // convert the data to a gsl vector and check that data file is a
110    // column vector or a row vector
111    if(nof_columns==1) {
112      v_ = gsl_vector_alloc ( nof_rows );
113      for(u_int i=0;i<nof_rows;i++) 
114        gsl_vector_set( v_, i, data_matrix[i][0] );
115    }
116    else if(nof_rows==1){
117      v_ = gsl_vector_alloc ( nof_columns );
118      for(u_int i=0;i<nof_columns;i++) 
119        gsl_vector_set( v_, i, data_matrix[0][i] );
120    }
121    else {
122      // Jari. change to throw exception, remove unnecessary includes
123      cerr << "vector::vector(std::istream&) data file error: "
124           << "file has " << nof_rows << " rows and " << nof_columns
125           << " columns; expected a row vector or a column vector"
126           << endl;
127      exit(1);
128    }
129  }
130
131
132
133  vector::~vector(void)
134  {
135    if (view_)
136      delete view_;
137    else if (v_)
138      gsl_vector_free(v_);
139    v_=NULL;
140  }
141
142
143
144  gsl_vector* vector::TEMP_gsl_vector_copy(void) const
145  {
146    gsl_vector* vec = gsl_vector_alloc(size());
147    gsl_vector_memcpy(vec,v_);
148    return vec;
149  }
150
151
152
153  std::pair<double,double> vector::minmax(void) const
154  {
155    double min, max;
156    gsl_vector_minmax(v_,&min,&max);
157    return std::pair<double,double>(min,max);
158  }
159
160
161
162  std::pair<size_t,size_t> vector::minmax_index(void) const
163  {
164    size_t min_index, max_index;
165    gsl_vector_minmax_index(v_,&min_index,&max_index);
166    return std::pair<size_t,size_t>(min_index,max_index);
167  }
168
169
170
171  double vector::sum(void) const
172  {
173    double sum = 0;
174    for (size_t i=0; i<size(); i++)
175      sum += gsl_vector_get( v_, i );
176    return( sum );
177  } 
178
179
180
181  vector vector::operator-(void) const
182  {
183    vector res( *this );
184    gsl_vector_scale (res.v_,-1.);
185    return res;
186  }
187
188
189
190  double vector::operator*( const vector &other ) const
191  {
192    // Jari, check for gsl_support
193    double res = 0.0;;
194    for ( size_t i = 0; i < size(); ++i ) 
195      res += other[i] * (*this)[i];
196    return res;
197  }
198
199
200
201  vector vector::operator+(const vector &other) const
202  {
203    vector res(*this);
204    gsl_vector_add(res.v_,other.v_);
205    return res;
206  }
207
208
209
210  vector vector::operator-( const vector &other ) const
211  {
212    vector res( *this );
213    gsl_vector_sub(res.v_,other.v_);
214    return res;
215  }
216
217
218
219  vector& vector::operator=( const vector& other )
220  {
221    if( this != &other ) {
222      if ( v_ )
223        gsl_vector_free( v_ );
224      v_ = other.TEMP_gsl_vector_copy();
225    }
226    return *this;
227  } 
228
229
230
231  std::ostream& theplu::gslapi::operator<<(std::ostream& s, const vector& a)
232  {
233    s.setf(std::ios::fixed);
234
235    for (size_t j = 0; j < a.size(); ++j) {
236      s << a[j];
237      if ( (j+1)<a.size() )
238        s << " ";
239    }
240
241    return s;
242  }
243
244
245}} // of namespace gslapi and namespace thep
Note: See TracBrowser for help on using the repository browser.