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;
00286 RefSCVector operator*(const RefSCVector&a) const;
00287 RefSymmSCMatrix operator*(double) const;
00289 RefSymmSCMatrix operator+(const RefSymmSCMatrix&) const;
00290 RefSymmSCMatrix operator-(const RefSymmSCMatrix&) const;
00292 RefSymmSCMatrix i() const;
00294 RefSymmSCMatrix gi() const;
00297 RefSymmSCMatrix clone() const;
00298 RefSymmSCMatrix copy() const;
00299 void set_element(int,int,double) const;
00300 void accumulate_element(int,int,double) const;
00301 double get_element(int,int) const;
00302
00303 RefSCMatrix get_subblock(int br, int er, int bc, int ec);
00304 RefSymmSCMatrix get_subblock(int br, int er);
00305 void assign_subblock(const RefSCMatrix&, int br, int er, int bc, int ec);
00306 void assign_subblock(const RefSymmSCMatrix&, int br, int er);
00307 void accumulate_subblock(const RefSCMatrix&, int, int, int, int);
00308 void accumulate_subblock(const RefSymmSCMatrix&, int, int);
00309 RefSCVector get_row(int);
00310 void assign_row(const RefSCVector&, int);
00311 void accumulate_row(const RefSCVector&, int);
00312
00313 void accumulate_symmetric_outer_product(const RefSCVector&) const;
00314 double scalar_product(const RefSCVector&) const;
00315 void accumulate_symmetric_product(const RefSCMatrix&) const;
00316 void accumulate_symmetric_sum(const RefSCMatrix&) const;
00318 void accumulate_transform(const RefSCMatrix&a,const RefSymmSCMatrix&b,
00319 SCMatrix::Transform = SCMatrix::NormalTransform) const;
00320 void accumulate_transform(const RefSCMatrix&a,const RefDiagSCMatrix&b,
00321 SCMatrix::Transform = SCMatrix::NormalTransform) const;
00322 void accumulate_transform(const RefSymmSCMatrix&a,
00323 const RefSymmSCMatrix&b) const;
00324
00325 void randomize() const;
00326 void assign(const RefSymmSCMatrix&) const;
00327 void scale(double) const;
00328 void assign(double) const;
00329 void assign(const double*) const;
00330 void assign(const double**) const;
00331 void convert(double*) const;
00332 void convert(double**) const;
00333 void accumulate(const RefSymmSCMatrix&) const;
00334 void element_op(const Ref<SCElementOp>&) const;
00335 void element_op(const Ref<SCElementOp2>&,
00336 const RefSymmSCMatrix&) const;
00337 void element_op(const Ref<SCElementOp3>&,
00338 const RefSymmSCMatrix&,
00339 const RefSymmSCMatrix&) const;
00340 double trace() const;
00341 int n() const;
00342 RefSCDimension dim() const;
00343 Ref<SCMatrixKit> kit() const;
00344 void print(std::ostream&) const;
00345 void print(const char*title=0,
00346 std::ostream&out=ExEnv::out0(), int =10) const;
00347 void save(StateOut&);
00349 void restore(StateIn&);
00350
00352 double solve_lin(const RefSCVector&) const;
00354 double determ() const;
00356 RefDiagSCMatrix eigvals() const;
00358 RefSCMatrix eigvecs() const;
00362 void diagonalize(const RefDiagSCMatrix& eigvals,
00363 const RefSCMatrix& eigvecs) const;
00365 SymmSCMatrixdouble operator()(int i,int j) const;
00369 int nblock() const;
00373 RefSymmSCMatrix block(int i) const;
00374 };
00376 RefSymmSCMatrix operator*(double,const RefSymmSCMatrix&);
00377
00380 class RefDiagSCMatrix: public Ref<DiagSCMatrix> {
00381
00382 public:
00385 RefDiagSCMatrix();
00387 RefDiagSCMatrix(const RefDiagSCMatrix& m);
00389 RefDiagSCMatrix(DiagSCMatrix *m);
00390 ~RefDiagSCMatrix();
00392 RefDiagSCMatrix& operator=(DiagSCMatrix* m);
00394 RefDiagSCMatrix& operator=(const RefDiagSCMatrix & m);
00395
00396
00397 public:
00400 RefDiagSCMatrix(const RefSCDimension&,const Ref<SCMatrixKit>&);
00402 RefSCMatrix operator*(const RefSCMatrix&) const;
00403 RefDiagSCMatrix operator*(double) const;
00405 RefDiagSCMatrix operator+(const RefDiagSCMatrix&) const;
00406 RefDiagSCMatrix operator-(const RefDiagSCMatrix&) const;
00408 RefDiagSCMatrix i() const;
00410 RefDiagSCMatrix gi() const;
00413 RefDiagSCMatrix clone() const;
00414 RefDiagSCMatrix copy() const;
00415 void set_element(int,double) const;
00416 void accumulate_element(int,double) const;
00417 double get_element(int) const;
00418 void randomize() const;
00419 void assign(const RefDiagSCMatrix&) const;
00420 void scale(double) const;
00421 void assign(double) const;
00422 void assign(const double*) const;
00423 void convert(double*) const;
00424 void accumulate(const RefDiagSCMatrix&) const;
00425 void element_op(const Ref<SCElementOp>&) const;
00426 void element_op(const Ref<SCElementOp2>&,
00427 const RefDiagSCMatrix&) const;
00428 void element_op(const Ref<SCElementOp3>&,
00429 const RefDiagSCMatrix&,
00430 const RefDiagSCMatrix&) const;
00431 int n() const;
00432 RefSCDimension dim() const;
00433 Ref<SCMatrixKit> kit() const;
00434 double trace() const;
00435 void print(std::ostream&) const;
00436 void print(const char*title=0,
00437 std::ostream&out=ExEnv::out0(), int =10) const;
00438 void save(StateOut&);
00440 void restore(StateIn&);
00442 double determ() const;
00444 DiagSCMatrixdouble operator()(int i) const;
00448 int nblock() const;
00452 RefDiagSCMatrix block(int i) const;
00453 };
00455 RefDiagSCMatrix operator*(double,const RefDiagSCMatrix&);
00456
00457 class SCVectordouble {
00458 friend class RefSCVector;
00459 private:
00460 RefSCVector vector;
00461 int i;
00462
00463 SCVectordouble(SCVector*,int);
00464 public:
00465 SCVectordouble(const SCVectordouble&);
00466 ~SCVectordouble();
00467 double operator=(double a);
00468 double operator=(const SCVectordouble&);
00469 operator double();
00470 double val() const;
00471 };
00472
00473 class SCMatrixdouble {
00474 friend class RefSCMatrix;
00475 private:
00476 RefSCMatrix matrix;
00477 int i;
00478 int j;
00479
00480 SCMatrixdouble(SCMatrix*,int,int);
00481 public:
00482 SCMatrixdouble(const SCMatrixdouble&);
00483 ~SCMatrixdouble();
00484 double operator=(double a);
00485 double operator=(const SCMatrixdouble&);
00486 operator double();
00487 double val() const;
00488 };
00489
00490 class SymmSCMatrixdouble {
00491 friend class RefSymmSCMatrix;
00492 private:
00493 RefSymmSCMatrix matrix;
00494 int i;
00495 int j;
00496
00497 SymmSCMatrixdouble(SymmSCMatrix*,int,int);
00498 public:
00499 SymmSCMatrixdouble(const SCMatrixdouble&);
00500 ~SymmSCMatrixdouble();
00501 double operator=(double a);
00502 double operator=(const SymmSCMatrixdouble&);
00503 operator double();
00504 double val() const;
00505 };
00506
00507 class DiagSCMatrixdouble {
00508 friend class RefDiagSCMatrix;
00509 private:
00510 RefDiagSCMatrix matrix;
00511 int i;
00512 int j;
00513
00514 DiagSCMatrixdouble(DiagSCMatrix*,int,int);
00515 public:
00516 DiagSCMatrixdouble(const SCMatrixdouble&);
00517 ~DiagSCMatrixdouble();
00518 double operator=(double a);
00519 double operator=(const DiagSCMatrixdouble&);
00520 operator double();
00521 double val() const;
00522 };
00523
00524 }
00525
00526 #ifdef INLINE_FUNCTIONS
00527 #include <math/scmat/matrix_i.h>
00528 #endif
00529
00530 #endif
00531
00532
00533
00534
00535