source: trunk/src/vector.cc @ 275

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

modified istream constructor for vector class to use the matrix constructor

  • 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 275 2005-04-14 17:07:56Z peter $
2
3#include "vector.h"
4#include "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.