00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __FLOAT_MATRIX_H
00018 #define __FLOAT_MATRIX_H
00019
00020
00021 #include <plObject.h>
00022 #include <plMath.h>
00023 #include <plFloatVector.h>
00024 #include <plError.h>
00025
00026
00027 #define Error_Number 15
00028
00029
00030
00031
00032
00033
00034
00036 class plFloatMatrix :public plObject
00037 {
00038
00039 protected:
00041 void Output(ostream &out) const;
00042
00043 void init(unsigned int r, unsigned int c, bool init_to_zero);
00044
00045 protected:
00046 plFloat **m;
00047
00048 unsigned int rz;
00049 unsigned int cz;
00050
00051
00052 plFloat elem_check(unsigned int r, unsigned int c) const;
00053 plFloat& elem_check(unsigned int r, unsigned int c);
00054
00055 public:
00056
00058 plFloatMatrix();
00059
00061 plFloatMatrix( unsigned int r, unsigned int c, bool init_to_zero = false);
00062
00064 plFloatMatrix( unsigned int d, bool init_to_zero = false);
00065
00070 plFloatMatrix( unsigned int d, const float * float_vector);
00071
00076 plFloatMatrix( unsigned int d, const double * double_vector);
00077
00083 plFloatMatrix( unsigned int d, const long double * long_double_vector);
00084
00085
00090 explicit plFloatMatrix(const vector <float> &float_vector);
00091
00096 explicit plFloatMatrix(const vector <double> &double_vector);
00097
00103 explicit plFloatMatrix(const vector <long double> &long_double_vector);
00104
00105
00107 explicit plFloatMatrix(const vector <vector <float> > &stl_matrix);
00108
00110 explicit plFloatMatrix(const vector <vector <double> > &stl_matrix);
00111
00113 explicit plFloatMatrix(const vector <vector <long double> > &stl_matrix);
00114
00116 plFloatMatrix( const plFloatMatrix &);
00117
00119 explicit plFloatMatrix( const plFloatVector &diag_vector);
00120
00122 void resize(unsigned int nr, unsigned int nc, bool init_to_zero = false);
00123
00125 void resize(unsigned int nr, bool init_to_zero = false);
00126
00128 virtual ~plFloatMatrix();
00129
00131 unsigned int rows() const {return rz;};
00132
00134 unsigned int cols() const {return cz;};
00135
00137 plFloat operator()(unsigned int r, unsigned int c) const { return elem_check(r,c); };
00138
00140 plFloat& operator()(unsigned int r, unsigned int c) { return elem_check(r,c); };
00141
00142 #ifndef RAVI_INTERFACE
00143
00144 plFloat* operator[](unsigned int i) const { return m[i];};
00145
00147 plFloat* operator[](unsigned int i) { return m[i];};
00148 #endif
00149
00151 plFloatVector row(unsigned int i) const;
00152
00154 plFloatVector column(unsigned int j) const;
00155
00156
00157
00159 plFloatMatrix& operator=(const plFloatMatrix &);
00160
00162 plFloatMatrix operator+(const plFloatMatrix&) const;
00163
00164
00166 plFloatMatrix &operator+=(const plFloatMatrix&);
00167
00169 plFloatMatrix operator-(const plFloatMatrix&) const;
00170
00172 plFloatMatrix &operator-=(const plFloatMatrix&);
00173
00175 plFloatMatrix operator*(const plFloatMatrix&) const;
00176
00178 friend plFloatMatrix operator*(const long double&,const plFloatMatrix&);
00179
00181 friend plFloatMatrix operator*(const double&,const plFloatMatrix&);
00182
00184 friend plFloatMatrix operator*(const float&,const plFloatMatrix&);
00185
00187 friend plFloatMatrix operator*(const int&,const plFloatMatrix&);
00188
00190 friend plFloatMatrix operator*(const unsigned int&,const plFloatMatrix&);
00191
00192
00193
00195 plFloatVector operator*(const plFloatVector&) const;
00196
00198 bool operator==(const plFloatMatrix&) const;
00199
00201 plFloatMatrix transpose() const;
00202
00204 void transpose(plFloatMatrix & result) const;
00205
00207 plFloat trace() const;
00208
00213 plFloat inverse(plFloatMatrix& inverse,plFloat threshold=PL_ONE) const;
00214
00221 void diagonalize( plFloatMatrix& Eigen_Matrix , plFloatVector& Eigen_Vector) const;
00222
00224 void reset();
00225
00227 void reset(float val);
00228
00230 void reset(double val);
00231
00233 void reset(long double val);
00234
00235 };
00236
00237
00238 #endif
00239