00001 #ifndef _theplu_yat_utility_matrix_
00002 #define _theplu_yat_utility_matrix_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "Exception.h"
00029 #include "StrideIterator.h"
00030 #include "Vector.h"
00031 #include "VectorConstView.h"
00032 #include "VectorView.h"
00033
00034 #include <gsl/gsl_matrix.h>
00035
00036 #include <cstddef>
00037 #include <iosfwd>
00038
00039 namespace theplu {
00040 namespace yat {
00041 namespace utility {
00042
00043 class VectorBase;
00044
00062 class Matrix
00063 {
00064 public:
00070 typedef double value_type;
00071
00077 typedef double& reference;
00078
00084 typedef const double& const_reference;
00085
00089 typedef StrideIterator<double*> iterator;
00090
00094 typedef StrideIterator<const double*> const_iterator;
00095
00099 typedef StrideIterator<double*> column_iterator;
00100
00104 typedef StrideIterator<const double*> const_column_iterator;
00105
00109 typedef StrideIterator<double*> row_iterator;
00110
00114 typedef StrideIterator<const double*> const_row_iterator;
00115
00122 Matrix(void);
00123
00132 Matrix(const size_t& r, const size_t& c, double init_value=0);
00133
00140 Matrix(const Matrix&);
00141
00172 explicit Matrix(std::istream &, char sep='\0')
00173 throw(utility::IO_error, std::exception);
00174
00178 ~Matrix(void);
00179
00183 void all(const double value);
00184
00191 iterator begin(void);
00192
00199 const_iterator begin(void) const;
00200
00206 iterator begin_column(size_t i);
00207
00213 const_iterator begin_column(size_t i) const;
00214
00220 iterator begin_row(size_t i);
00221
00227 const_iterator begin_row(size_t i) const;
00228
00232 VectorView column_view(size_t i);
00233
00237 const VectorConstView column_const_view(size_t) const;
00238
00242 size_t columns(void) const;
00243
00251 void div(const Matrix& b);
00252
00256 iterator end(void);
00257
00261 const_iterator end(void) const;
00262
00266 iterator end_column(size_t i);
00267
00271 const_iterator end_column(size_t i) const;
00272
00276 iterator end_row(size_t i);
00277
00281 const_iterator end_row(size_t i) const;
00282
00292 bool equal(const Matrix&, const double precision=0) const;
00293
00297 const gsl_matrix* gsl_matrix_p(void) const;
00298
00302 gsl_matrix* gsl_matrix_p(void);
00303
00311 void mul(const Matrix& b);
00312
00323 void resize(size_t r, size_t c, double init_value=0);
00324
00328 size_t rows(void) const;
00329
00333 VectorView row_view(size_t);
00334
00338 const VectorConstView row_const_view(size_t) const;
00339
00345 void swap_columns(const size_t i,const size_t j);
00346
00355 void swap_rowcol(const size_t i,const size_t j);
00356
00362 void swap_rows(const size_t i, const size_t j);
00363
00370 void transpose(void);
00371
00381 double& operator()(size_t row,size_t column);
00382
00393 const double& operator()(size_t row,size_t column) const;
00394
00406 bool operator==(const Matrix& other) const;
00407
00419 bool operator!=(const Matrix& other) const;
00420
00426 const Matrix& operator=(const Matrix& other);
00427
00439 const Matrix& operator+=(const Matrix& b);
00440
00447 const Matrix& operator+=(const double d);
00448
00460 const Matrix& operator-=(const Matrix&);
00461
00468 const Matrix& operator-=(const double d);
00469
00477 const Matrix& operator*=(const Matrix&);
00478
00487 const Matrix& operator*=(double d);
00488
00489 private:
00490
00502 gsl_matrix* create_gsl_matrix_copy(void) const;
00503
00509 void delete_allocated_memory(void);
00510
00511
00512
00513
00514
00515 gsl_matrix* blas_result_;
00516 gsl_matrix* m_;
00517 };
00518
00527 bool isnull(const Matrix&);
00528
00536 double max(const Matrix&);
00537
00545 double min(const Matrix&);
00546
00557 void minmax_index(const Matrix&,
00558 std::pair<size_t,size_t>& min,
00559 std::pair<size_t,size_t>& max);
00560
00576 bool nan(const Matrix& templat, Matrix& flag);
00577
00587 void swap(Matrix&, Matrix&);
00588
00594 std::ostream& operator<< (std::ostream& s, const Matrix&);
00595
00601 Vector operator*(const Matrix&, const VectorBase&);
00602
00610 Vector operator*(const VectorBase&, const Matrix&);
00611
00612 }}}
00613
00614 #endif