00001
00002
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 #ifndef _math_scmat_matrix_h
00029 #define _math_scmat_matrix_h
00030 #ifdef __GNUC__
00031 #pragma interface
00032 #endif
00033
00034 #include <iostream>
00035
00036 #include <math/scmat/abstract.h>
00037
00038 namespace sc {
00039
00040 class SCVectordouble;
00041 class SCMatrixdouble;
00042 class SymmSCMatrixdouble;
00043 class DiagSCMatrixdouble;
00044
00045 class SCMatrixBlockIter;
00046 class SCMatrixRectBlock;
00047 class SCMatrixLTriBlock;
00048 class SCMatrixDiagBlock;
00049 class SCVectorSimpleBlock;
00050
00051 class RefSCMatrix;
00052 class RefSymmSCMatrix;
00055 class RefSCVector: public Ref<SCVector> {
00056
00057 public:
00060 RefSCVector();
00062 RefSCVector(const RefSCVector& v);
00064 RefSCVector(SCVector *v);
00065
00066
00067 ~RefSCVector();
00069 RefSCVector& operator=(SCVector* v);
00071 RefSCVector& operator=(const RefSCVector& v);
00072
00073
00074 public:
00077 RefSCVector(const RefSCDimension& dim,const Ref<SCMatrixKit>&);
00078
00080 SCVectordouble operator()(int) const;
00082 SCVectordouble operator[](int) const;
00084 RefSCVector operator+(const RefSCVector&a) const;
00086 RefSCVector operator-(const RefSCVector&a) const;
00088 RefSCVector operator*(double) const;
00090 RefSCMatrix outer_product(const RefSCVector& v) const;
00092 RefSymmSCMatrix symmetric_outer_product() const;
00093
00094 void set_element(int i,double val) const;
00095 void accumulate_element(int i,double val) const;
00096 double get_element(int) const;
00097 int n() const;
00098 RefSCDimension dim() const;
00099 Ref<SCMatrixKit> kit() const;
00100 RefSCVector clone() const;
00101 RefSCVector copy() const;
00102 double maxabs() const;
00103 double scalar_product(const RefSCVector&) const;
00104 double dot(const RefSCVector&) const;
00105 void normalize() const;
00106 void randomize() const;
00107 void assign(const RefSCVector& v) const;
00108 void assign(double val) const;
00109 void assign(const double* v) const;
00110 void convert(double*) const;
00111 void scale(double val) const;
00112 void accumulate(const RefSCVector& v) const;
00113 void accumulate_product(const RefSymmSCMatrix&, const RefSCVector&);
00114 void accumulate_product(const RefSCMatrix&, const RefSCVector&);
00115 void element_op(const Ref<SCElementOp>& op) const;
00116 void element_op(const Ref<SCElementOp2>&,
00117 const RefSCVector&) const;
00118 void element_op(const Ref<SCElementOp3>&,
00119 const RefSCVector&,
00120 const RefSCVector&) const;
00121 void print(std::ostream&out) const;
00122 void print(const char*title=0,
00123 std::ostream&out=ExEnv::out0(), int precision=10) const;
00124 void save(StateOut&);
00126 void restore(StateIn&);
00127 };
00128 RefSCVector operator*(double,const RefSCVector&);
00129
00130 class RefSymmSCMatrix;
00131 class RefDiagSCMatrix;
00135 class RefSCMatrix: public Ref<SCMatrix> {
00136
00137 public:
00140 RefSCMatrix();
00142 RefSCMatrix(const RefSCMatrix& m);
00144 RefSCMatrix(SCMatrix* m);
00145 ~RefSCMatrix();
00147 RefSCMatrix& operator=(SCMatrix* m);
00149 RefSCMatrix& operator=(const RefSCMatrix& m);
00150
00151
00152 public:
00155 RefSCMatrix(const RefSCDimension& d1,const RefSCDimension& d2,
00156 const Ref<SCMatrixKit>&);
00157
00159 RefSCVector operator*(const RefSCVector&) const;
00160
00162 RefSCMatrix operator*(const RefSCMatrix&) const;
00163 RefSCMatrix operator*(const RefSymmSCMatrix&) const;
00164 RefSCMatrix operator*(const RefDiagSCMatrix&) const;
00165
00167 RefSCMatrix operator*(double) const;
00168
00170 RefSCMatrix operator+(const RefSCMatrix&) const;
00172 RefSCMatrix operator-(const RefSCMatrix&) const;
00173
00175 RefSCMatrix t() const;
00177 RefSCMatrix i() const;
00179 RefSCMatrix gi() const;
00180
00183 RefSCMatrix clone() const;
00184 RefSCMatrix copy() const;
00185
00186 RefSCMatrix get_subblock(int br, int er, int bc, int ec);
00187 void assign_subblock(const RefSCMatrix&, int br, int er, int bc, int ec,
00188 int source_br = 0, int source_bc = 0);
00189 void accumulate_subblock(const RefSCMatrix&, int, int, int, int,
00190 int source_br = 0, int source_bc = 0);
00191 RefSCVector get_row(int) const;
00192 RefSCVector get_column(int) const;
00193 void assign_row(const RefSCVector&, int) const;
00194 void assign_column(const RefSCVector&, int) const;
00195 void accumulate_row(const RefSCVector&, int) const;
00196 void accumulate_column(const RefSCVector&, int) const;
00197
00198 void accumulate_outer_product(const RefSCVector&,const RefSCVector&) const;
00199 void accumulate_product(const RefSCMatrix&,const RefSCMatrix&) const;
00200 void assign(const RefSCMatrix&) const;
00201 void scale(double) const;
00202 void randomize() const;
00203 void assign(double) const;
00204 void assign(const double*) const;
00205 void assign(const double**) const;
00206 void convert(double*) const;
00207 void convert(double**) const;
00208 void accumulate(const RefSCMatrix&) const;
00209 void accumulate(const RefSymmSCMatrix&) const;
00210 void accumulate(const RefDiagSCMatrix&) const;
00211 void element_op(const Ref<SCElementOp>&) const;
00212 void element_op(const Ref<SCElementOp2>&,
00213 const RefSCMatrix&) const;
00214 void element_op(const Ref<SCElementOp3>&,
00215 const RefSCMatrix&,
00216 const RefSCMatrix&) const;
00217 int nrow() const;
00218 int ncol() const;
00219 RefSCDimension rowdim() const;
00220 RefSCDimension coldim() const;
00221 Ref<SCMatrixKit> kit() const;
00222 void set_element(int,int,double) const;
00223 void accumulate_element(int,int,double) const;
00224 double get_element(int,int) const;
00225 void print(std::ostream&) const;
00226 void print(const char*title=0,
00227 std::ostream&out=ExEnv::out0(), int =10) const;
00228 double trace() const;
00229 void save(StateOut&);
00231 void restore(StateIn&);
00232
00237 void svd(const RefSCMatrix &U,
00238 const RefDiagSCMatrix &sigma,
00239 const RefSCMatrix &V);
00241 double solve_lin(const RefSCVector& v) const;
00243 double determ() const;
00245 SCMatrixdouble operator()(int i,int j) const;
00246
00250 int nblock() const;
00254 RefSCMatrix block(int i) const;
00255 };
00257 RefSCMatrix operator*(double,const RefSCMatrix&);
00258
00261 class RefSymmSCMatrix: public Ref<SymmSCMatrix> {
00262
00263 public:
00266 RefSymmSCMatrix();
00268 RefSymmSCMatrix(const RefSymmSCMatrix& m);
00270 RefSymmSCMatrix(SymmSCMatrix *m);
00271 ~RefSymmSCMatrix();
00273 RefSymmSCMatrix& operator=(SymmSCMatrix* m);
00275 RefSymmSCMatrix& operator=(const RefSymmSCMatrix& m);
00276
00277
00278 public:
00281 RefSymmSCMatrix(const RefSCDimension& d,const Ref<SCMatrixKit>&);
00283 RefSCMatrix operator*(const RefSCMatrix&) const;
00284 RefSCMatrix operator*(const RefSymmSCMatrix&) const;
00285 RefSCMatrix operator*(const RefDiagSCMatrix&) const;
00287 RefSCVector operator*(const RefSCVector&a) const;
00288 RefSymmSCMatrix operator*(double) const;
00290 RefSymmSCMatrix operator+(const RefSymmSCMatrix&) const;
00291 RefSymmSCMatrix operator-(const RefSymmSCMatrix&) const;
00293 RefSymmSCMatrix i() const;
00295 RefSymmSCMatrix gi() const;
00298 RefSymmSCMatrix clone() const;
00299 RefSymmSCMatrix copy() const;
00300 void set_element(int,int,double) const;
00301 void accumulate_element(int,int,double) const;
00302 double get_element(int,int) const;
00303
00304 RefSCMatrix get_subblock(int br, int er, int bc, int ec);
00305 RefSymmSCMatrix get_subblock(int br, int er);
00306 void assign_subblock(const RefSCMatrix&, int br, int er, int bc, int ec);
00307 void assign_subblock(const RefSymmSCMatrix&, int br, int er);
00308 void accumulate_subblock(const RefSCMatrix&, int, int, int, int);
00309 void accumulate_subblock(const RefSymmSCMatrix&, int, int);
00310 RefSCVector get_row(int);
00311 void assign_row(const RefSCVector&, int);
00312 void accumulate_row(const RefSCVector&, int);
00313
00314 void accumulate_symmetric_outer_product(const RefSCVector&) const;
00315 double scalar_product(const RefSCVector&) const;
00316 void accumulate_symmetric_product(const RefSCMatrix&) const;
00317 void accumulate_symmetric_sum(const RefSCMatrix&) const;
00319 void accumulate_transform(const RefSCMatrix&a,const RefSymmSCMatrix&b,
00320 SCMatrix::Transform = SCMatrix::NormalTransform) const;
00321 void accumulate_transform(const RefSCMatrix&a,const RefDiagSCMatrix&b,
00322 SCMatrix::Transform = SCMatrix::NormalTransform) const;
00323 void accumulate_transform(const RefSymmSCMatrix&a,
00324 const RefSymmSCMatrix&b) const;
00325
00326 void randomize() const;
00327 void assign(const RefSymmSCMatrix&) const;
00328 void scale(double) const;
00329 void scale_diagonal(double) const;
00330 void assign(double) const;
00331 void assign(const double*) const;
00332 void assign(const double**) const;
00333 void convert(double*) const;
00334 void convert(double**) const;
00335 void accumulate(const RefSymmSCMatrix&) const;
00336 void element_op(const Ref<SCElementOp>&) const;
00337 void element_op(const Ref<SCElementOp2>&,
00338 const RefSymmSCMatrix&) const;
00339 void element_op(const Ref<SCElementOp3>&,
00340 const RefSymmSCMatrix&,
00341 const RefSymmSCMatrix&) const;
00342 double trace() const;
00343 int n() const;
00344 RefSCDimension dim() const;
00345 Ref<SCMatrixKit> kit() const;
00346 void print(std::ostream&) const;
00347 void print(const char*title=0,
00348 std::ostream&out=ExEnv::out0(), int =10) const;
00349 void save(StateOut&);
00351 void restore(StateIn&);
00352
00354 double solve_lin(const RefSCVector&) const;
00356 double determ() const;
00358 RefDiagSCMatrix eigvals() const;
00360 RefSCMatrix eigvecs() const;
00364 void diagonalize(const RefDiagSCMatrix& eigvals,
00365 const RefSCMatrix& eigvecs) const;
00367 SymmSCMatrixdouble operator()(int i,int j) const;
00371 int nblock() const;
00375 RefSymmSCMatrix block(int i) const;
00376 };
00378 RefSymmSCMatrix operator*(double,const RefSymmSCMatrix&);
00379
00382 class RefDiagSCMatrix: public Ref<DiagSCMatrix> {
00383
00384 public:
00387 RefDiagSCMatrix();
00389 RefDiagSCMatrix(const RefDiagSCMatrix& m);
00391 RefDiagSCMatrix(DiagSCMatrix *m);
00392 ~RefDiagSCMatrix();
00394 RefDiagSCMatrix& operator=(DiagSCMatrix* m);
00396 RefDiagSCMatrix& operator=(const RefDiagSCMatrix & m);
00397
00398
00399 public:
00402 RefDiagSCMatrix(const RefSCDimension&,const Ref<SCMatrixKit>&);
00404 RefSCMatrix operator*(const RefSCMatrix&) const;
00405 RefSCMatrix operator*(const RefSymmSCMatrix&) const;
00406 RefDiagSCMatrix operator*(const RefDiagSCMatrix&) const;
00407 RefDiagSCMatrix operator*(double) const;
00409 RefDiagSCMatrix operator+(const RefDiagSCMatrix&) const;
00410 RefDiagSCMatrix operator-(const RefDiagSCMatrix&) const;
00412 RefDiagSCMatrix i() const;
00414 RefDiagSCMatrix gi() const;
00417 RefDiagSCMatrix clone() const;
00418 RefDiagSCMatrix copy() const;
00419 void set_element(int,double) const;
00420 void accumulate_element(int,double) const;
00421 double get_element(int) const;
00422 void randomize() const;
00423 void assign(const RefDiagSCMatrix&) const;
00424 void scale(double) const;
00425 void assign(double) const;
00426 void assign(const double*) const;
00427 void convert(double*) const;
00428 void accumulate(const RefDiagSCMatrix&) const;
00429 void element_op(const Ref<SCElementOp>&) const;
00430 void element_op(const Ref<SCElementOp2>&,
00431 const RefDiagSCMatrix&) const;
00432 void element_op(const Ref<SCElementOp3>&,
00433 const RefDiagSCMatrix&,
00434 const RefDiagSCMatrix&) const;
00435 int n() const;
00436 RefSCDimension dim() const;
00437 Ref<SCMatrixKit> kit() const;
00438 double trace() const;
00439 void print(std::ostream&) const;
00440 void print(const char*title=0,
00441 std::ostream&out=ExEnv::out0(), int =10) const;
00442 void save(StateOut&);
00444 void restore(StateIn&);
00446 double determ() const;
00448 DiagSCMatrixdouble operator()(int i) const;
00452 int nblock() const;
00456 RefDiagSCMatrix block(int i) const;
00457 };
00459 RefDiagSCMatrix operator*(double,const RefDiagSCMatrix&);
00460
00461 class SCVectordouble {
00462 friend class RefSCVector;
00463 private:
00464 RefSCVector vector;
00465 int i;
00466
00467 SCVectordouble(SCVector*,int);
00468 public:
00469 SCVectordouble(const SCVectordouble&);
00470 ~SCVectordouble();
00471 double operator=(double a);
00472 double operator=(const SCVectordouble&);
00473 operator double();
00474 double val() const;
00475 };
00476
00477 class SCMatrixdouble {
00478 friend class RefSCMatrix;
00479 private:
00480 RefSCMatrix matrix;
00481 int i;
00482 int j;
00483
00484 SCMatrixdouble(SCMatrix*,int,int);
00485 public:
00486 SCMatrixdouble(const SCMatrixdouble&);
00487 ~SCMatrixdouble();
00488 double operator=(double a);
00489 double operator=(const SCMatrixdouble&);
00490 operator double();
00491 double val() const;
00492 };
00493
00494 class SymmSCMatrixdouble {
00495 friend class RefSymmSCMatrix;
00496 private:
00497 RefSymmSCMatrix matrix;
00498 int i;
00499 int j;
00500
00501 SymmSCMatrixdouble(SymmSCMatrix*,int,int);
00502 public:
00503 SymmSCMatrixdouble(const SCMatrixdouble&);
00504 ~SymmSCMatrixdouble();
00505 double operator=(double a);
00506 double operator=(const SymmSCMatrixdouble&);
00507 operator double();
00508 double val() const;
00509 };
00510
00511 class DiagSCMatrixdouble {
00512 friend class RefDiagSCMatrix;
00513 private:
00514 RefDiagSCMatrix matrix;
00515 int i;
00516 int j;
00517
00518 DiagSCMatrixdouble(DiagSCMatrix*,int,int);
00519 public:
00520 DiagSCMatrixdouble(const SCMatrixdouble&);
00521 ~DiagSCMatrixdouble();
00522 double operator=(double a);
00523 double operator=(const DiagSCMatrixdouble&);
00524 operator double();
00525 double val() const;
00526 };
00527
00528 }
00529
00530 #ifdef INLINE_FUNCTIONS
00531 #include <math/scmat/matrix_i.h>
00532 #endif
00533
00534 #endif
00535
00536
00537
00538
00539