source: trunk/lib/gslapi/vector.cc @ 295

Last change on this file since 295 was 295, checked in by Peter, 17 years ago

file structure modifications. NOTE, this revision is not working, please wait for the next...

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.3 KB
Line 
1// $Id: vector.cc 295 2005-04-29 09:15:58Z peter $
2
3#include <c++_tools/gslapi/vector.h>
4#include <c++_tools/gslapi/matrix.h>
5
6#include <iostream>
7#include <sstream>
8#include <string>
9#include <vector>
10#include <utility>
11
12
13
14
15
16namespace theplu {
17namespace gslapi {
18
19
20
21  vector::vector(void)
22    : v_(NULL), view_(NULL)
23  {
24  }
25
26
27
28  vector::vector(const size_t n,const double init_value)
29    : view_(NULL)
30  {
31    v_ = gsl_vector_alloc(n);
32    set_all(init_value);
33  }
34
35
36
37  vector::vector(const vector& other)
38    : view_(NULL)
39  {
40    v_ = other.TEMP_gsl_vector_copy();
41  }
42
43
44
45  vector::vector(vector& v, size_t offset, size_t n, size_t stride)
46  {
47    view_ = new gsl_vector_view(gsl_vector_subvector_with_stride(v.v_,offset,
48                                                                 stride,n));
49    v_ = &(view_->vector);
50  }
51
52
53
54  vector::vector(gsl_vector* vec)
55    : v_(vec), view_(NULL)
56  {
57  }
58
59
60
61  vector::vector(std::istream& is)
62    : view_(NULL)
63  {
64    matrix m(is);
65   
66    // convert the data to a gsl vector and check that data file is a
67    // column vector or a row vector
68    if(m.columns()==1) {
69      v_ = gsl_vector_alloc ( m.rows() );
70      for(u_int i=0;i<m.rows();i++) 
71        gsl_vector_set( v_, i, m(i,0) );
72    }
73    else if(m.rows()==1){
74      v_ = gsl_vector_alloc ( m.columns() );
75      for(u_int i=0;i<m.columns();i++) 
76        gsl_vector_set( v_, i, m(0,i) );
77    }
78    else {
79      // Jari. change to throw exception, remove unnecessary includes
80      std::cerr << "vector::vector(std::istream&) data file error: "
81                << "file has " << m.rows() << " rows and " << m.columns() 
82                << " columns; expected a row vector or a column vector"
83                << std::endl;
84      exit(1);
85    }
86  }
87
88
89
90  vector::~vector(void)
91  {
92    if (view_)
93      delete view_;
94    else if (v_)
95      gsl_vector_free(v_);
96    v_=NULL;
97  }
98
99
100
101  gsl_vector* vector::TEMP_gsl_vector_copy(void) const
102  {
103    gsl_vector* vec = gsl_vector_alloc(size());
104    gsl_vector_memcpy(vec,v_);
105    return vec;
106  }
107
108
109
110  std::pair<double,double> vector::minmax(void) const
111  {
112    double min, max;
113    gsl_vector_minmax(v_,&min,&max);
114    return std::pair<double,double>(min,max);
115  }
116
117
118
119  std::pair<size_t,size_t> vector::minmax_index(void) const
120  {
121    size_t min_index, max_index;
122    gsl_vector_minmax_index(v_,&min_index,&max_index);
123    return std::pair<size_t,size_t>(min_index,max_index);
124  }
125
126
127
128  double vector::sum(void) const
129  {
130    double sum = 0;
131    for (size_t i=0; i<size(); i++)
132      sum += gsl_vector_get( v_, i );
133    return( sum );
134  } 
135
136
137
138  vector vector::operator-(void) const
139  {
140    vector res( *this );
141    gsl_vector_scale (res.v_,-1.);
142    return res;
143  }
144
145
146
147  double vector::operator*( const vector &other ) const
148  {
149    // Jari, check for gsl_support
150    double res = 0.0;;
151    for ( size_t i = 0; i < size(); ++i ) 
152      res += other[i] * (*this)[i];
153    return res;
154  }
155
156
157
158  vector vector::operator+(const vector &other) const
159  {
160    vector res(*this);
161    gsl_vector_add(res.v_,other.v_);
162    return res;
163  }
164
165
166
167  vector vector::operator-( const vector &other ) const
168  {
169    vector res( *this );
170    gsl_vector_sub(res.v_,other.v_);
171    return res;
172  }
173
174
175
176  vector& vector::operator=( const vector& other )
177  {
178    if( this != &other ) {
179      if ( v_ )
180        gsl_vector_free( v_ );
181      v_ = other.TEMP_gsl_vector_copy();
182    }
183    return *this;
184  } 
185
186
187
188  std::ostream& theplu::gslapi::operator<<(std::ostream& s, const vector& a)
189  {
190    s.setf(std::ios::fixed);
191
192    for (size_t j = 0; j < a.size(); ++j) {
193      s << a[j];
194      if ( (j+1)<a.size() )
195        s << " ";
196    }
197
198    return s;
199  }
200
201
202}} // of namespace gslapi and namespace thep
Note: See TracBrowser for help on using the repository browser.