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&);
00125
void restore(
StateIn&);
00126 };
00127
RefSCVector operator*(
double,
const RefSCVector&);
00128
00129
class RefSymmSCMatrix;
00130
class RefDiagSCMatrix;
00134 class RefSCMatrix:
public Ref<SCMatrix> {
00135
00136
public:
00139
RefSCMatrix();
00141
RefSCMatrix(
const RefSCMatrix& m);
00143
RefSCMatrix(
SCMatrix* m);
00144 ~
RefSCMatrix();
00146
RefSCMatrix&
operator=(
SCMatrix* m);
00148
RefSCMatrix&
operator=(
const RefSCMatrix& m);
00149
00150
00151
public:
00154
RefSCMatrix(
const RefSCDimension& d1,
const RefSCDimension& d2,
00155
const Ref<SCMatrixKit>&);
00156
00158
RefSCVector operator*(
const RefSCVector&)
const;
00159
00161
RefSCMatrix operator*(
const RefSCMatrix&)
const;
00162
RefSCMatrix operator*(
const RefSymmSCMatrix&)
const;
00163
RefSCMatrix operator*(
const RefDiagSCMatrix&)
const;
00164
00166
RefSCMatrix operator*(
double)
const;
00167
00169
RefSCMatrix operator+(
const RefSCMatrix&)
const;
00171
RefSCMatrix operator-(
const RefSCMatrix&)
const;
00172
00174
RefSCMatrix t()
const;
00176
RefSCMatrix i()
const;
00178
RefSCMatrix gi()
const;
00179
00182
RefSCMatrix clone()
const;
00183
RefSCMatrix copy()
const;
00184
00185
RefSCMatrix get_subblock(
int br,
int er,
int bc,
int ec);
00186
void assign_subblock(
const RefSCMatrix&,
int br,
int er,
int bc,
int ec,
00187
int source_br = 0,
int source_bc = 0);
00188
void accumulate_subblock(
const RefSCMatrix&,
int,
int,
int,
int,
00189
int source_br = 0,
int source_bc = 0);
00190
RefSCVector get_row(
int)
const;
00191
RefSCVector get_column(
int)
const;
00192
void assign_row(
const RefSCVector&,
int)
const;
00193
void assign_column(
const RefSCVector&,
int)
const;
00194
void accumulate_row(
const RefSCVector&,
int)
const;
00195
void accumulate_column(
const RefSCVector&,
int)
const;
00196
00197
void accumulate_outer_product(
const RefSCVector&,
const RefSCVector&)
const;
00198
void accumulate_product(
const RefSCMatrix&,
const RefSCMatrix&)
const;
00199
void assign(
const RefSCMatrix&)
const;
00200
void scale(
double)
const;
00201
void randomize()
const;
00202
void assign(
double)
const;
00203
void assign(
const double*)
const;
00204
void assign(
const double**)
const;
00205
void convert(
double*)
const;
00206
void convert(
double**)
const;
00207
void accumulate(
const RefSCMatrix&)
const;
00208
void accumulate(
const RefSymmSCMatrix&)
const;
00209
void accumulate(
const RefDiagSCMatrix&)
const;
00210
void element_op(
const Ref<SCElementOp>&)
const;
00211
void element_op(
const Ref<SCElementOp2>&,
00212
const RefSCMatrix&)
const;
00213
void element_op(
const Ref<SCElementOp3>&,
00214
const RefSCMatrix&,
00215
const RefSCMatrix&)
const;
00216
int nrow()
const;
00217
int ncol()
const;
00218
RefSCDimension rowdim()
const;
00219
RefSCDimension coldim()
const;
00220
Ref<SCMatrixKit> kit()
const;
00221
void set_element(
int,
int,
double)
const;
00222
void accumulate_element(
int,
int,
double)
const;
00223
double get_element(
int,
int)
const;
00224
void print(std::ostream&)
const;
00225
void print(
const char*title=0,
00226 std::ostream&out=ExEnv::out0(),
int =10)
const;
00227
double trace()
const;
00228
void save(
StateOut&);
00229
void restore(
StateIn&);
00230
00235
void svd(
const RefSCMatrix &U,
00236
const RefDiagSCMatrix &sigma,
00237
const RefSCMatrix &V);
00239
double solve_lin(
const RefSCVector& v)
const;
00241
double determ()
const;
00243 SCMatrixdouble
operator()(
int i,
int j)
const;
00244
00248
int nblock()
const;
00252
RefSCMatrix block(
int i)
const;
00253 };
00255
RefSCMatrix operator*(
double,
const RefSCMatrix&);
00256
00259 class RefSymmSCMatrix:
public Ref<SymmSCMatrix> {
00260
00261
public:
00264
RefSymmSCMatrix();
00266
RefSymmSCMatrix(
const RefSymmSCMatrix& m);
00268
RefSymmSCMatrix(
SymmSCMatrix *m);
00269 ~
RefSymmSCMatrix();
00271
RefSymmSCMatrix&
operator=(
SymmSCMatrix* m);
00273
RefSymmSCMatrix&
operator=(
const RefSymmSCMatrix& m);
00274
00275
00276
public:
00279
RefSymmSCMatrix(
const RefSCDimension& d,
const Ref<SCMatrixKit>&);
00281
RefSCMatrix operator*(
const RefSCMatrix&)
const;
00282
RefSCMatrix operator*(
const RefSymmSCMatrix&)
const;
00284
RefSCVector operator*(
const RefSCVector&a)
const;
00285
RefSymmSCMatrix operator*(
double)
const;
00287
RefSymmSCMatrix operator+(
const RefSymmSCMatrix&)
const;
00288
RefSymmSCMatrix operator-(
const RefSymmSCMatrix&)
const;
00290
RefSymmSCMatrix i()
const;
00292
RefSymmSCMatrix gi()
const;
00295
RefSymmSCMatrix clone()
const;
00296
RefSymmSCMatrix copy()
const;
00297
void set_element(
int,
int,
double)
const;
00298
void accumulate_element(
int,
int,
double)
const;
00299
double get_element(
int,
int)
const;
00300
00301
RefSCMatrix get_subblock(
int br,
int er,
int bc,
int ec);
00302
RefSymmSCMatrix get_subblock(
int br,
int er);
00303
void assign_subblock(
const RefSCMatrix&,
int br,
int er,
int bc,
int ec);
00304
void assign_subblock(
const RefSymmSCMatrix&,
int br,
int er);
00305
void accumulate_subblock(
const RefSCMatrix&,
int,
int,
int,
int);
00306
void accumulate_subblock(
const RefSymmSCMatrix&,
int,
int);
00307
RefSCVector get_row(
int);
00308
void assign_row(
const RefSCVector&,
int);
00309
void accumulate_row(
const RefSCVector&,
int);
00310
00311
void accumulate_symmetric_outer_product(
const RefSCVector&)
const;
00312
double scalar_product(
const RefSCVector&)
const;
00313
void accumulate_symmetric_product(
const RefSCMatrix&)
const;
00314
void accumulate_symmetric_sum(
const RefSCMatrix&)
const;
00316
void accumulate_transform(
const RefSCMatrix&a,
const RefSymmSCMatrix&b,
00317 SCMatrix::Transform = SCMatrix::NormalTransform)
const;
00318
void accumulate_transform(
const RefSCMatrix&a,
const RefDiagSCMatrix&b,
00319 SCMatrix::Transform = SCMatrix::NormalTransform)
const;
00320
void accumulate_transform(
const RefSymmSCMatrix&a,
00321
const RefSymmSCMatrix&b)
const;
00322
00323
void randomize()
const;
00324
void assign(
const RefSymmSCMatrix&)
const;
00325
void scale(
double)
const;
00326
void assign(
double)
const;
00327
void assign(
const double*)
const;
00328
void assign(
const double**)
const;
00329
void convert(
double*)
const;
00330
void convert(
double**)
const;
00331
void accumulate(
const RefSymmSCMatrix&)
const;
00332
void element_op(
const Ref<SCElementOp>&)
const;
00333
void element_op(
const Ref<SCElementOp2>&,
00334
const RefSymmSCMatrix&)
const;
00335
void element_op(
const Ref<SCElementOp3>&,
00336
const RefSymmSCMatrix&,
00337
const RefSymmSCMatrix&)
const;
00338
double trace()
const;
00339
int n()
const;
00340
RefSCDimension dim()
const;
00341
Ref<SCMatrixKit> kit()
const;
00342
void print(std::ostream&)
const;
00343
void print(
const char*title=0,
00344 std::ostream&out=ExEnv::out0(),
int =10)
const;
00345
void save(
StateOut&);
00346
void restore(
StateIn&);
00347
00349
double solve_lin(
const RefSCVector&)
const;
00351
double determ()
const;
00353
RefDiagSCMatrix eigvals()
const;
00355
RefSCMatrix eigvecs()
const;
00358
void diagonalize(
const RefDiagSCMatrix&
eigvals,
00359
const RefSCMatrix&
eigvecs)
const;
00361 SymmSCMatrixdouble
operator()(
int i,
int j)
const;
00365
int nblock()
const;
00369
RefSymmSCMatrix block(
int i)
const;
00370 };
00372
RefSymmSCMatrix operator*(
double,
const RefSymmSCMatrix&);
00373
00376 class RefDiagSCMatrix:
public Ref<DiagSCMatrix> {
00377
00378
public:
00381
RefDiagSCMatrix();
00383
RefDiagSCMatrix(
const RefDiagSCMatrix& m);
00385
RefDiagSCMatrix(
DiagSCMatrix *m);
00386 ~
RefDiagSCMatrix();
00388
RefDiagSCMatrix&
operator=(
DiagSCMatrix* m);
00390
RefDiagSCMatrix&
operator=(
const RefDiagSCMatrix & m);
00391
00392
00393
public:
00396
RefDiagSCMatrix(
const RefSCDimension&,
const Ref<SCMatrixKit>&);
00398
RefSCMatrix operator*(
const RefSCMatrix&)
const;
00399
RefDiagSCMatrix operator*(
double)
const;
00401
RefDiagSCMatrix operator+(
const RefDiagSCMatrix&)
const;
00402
RefDiagSCMatrix operator-(
const RefDiagSCMatrix&)
const;
00404
RefDiagSCMatrix i()
const;
00406
RefDiagSCMatrix gi()
const;
00409
RefDiagSCMatrix clone()
const;
00410
RefDiagSCMatrix copy()
const;
00411
void set_element(
int,
double)
const;
00412
void accumulate_element(
int,
double)
const;
00413
double get_element(
int)
const;
00414
void randomize()
const;
00415
void assign(
const RefDiagSCMatrix&)
const;
00416
void scale(
double)
const;
00417
void assign(
double)
const;
00418
void assign(
const double*)
const;
00419
void convert(
double*)
const;
00420
void accumulate(
const RefDiagSCMatrix&)
const;
00421
void element_op(
const Ref<SCElementOp>&)
const;
00422
void element_op(
const Ref<SCElementOp2>&,
00423
const RefDiagSCMatrix&)
const;
00424
void element_op(
const Ref<SCElementOp3>&,
00425
const RefDiagSCMatrix&,
00426
const RefDiagSCMatrix&)
const;
00427
int n()
const;
00428
RefSCDimension dim()
const;
00429
Ref<SCMatrixKit> kit()
const;
00430
double trace()
const;
00431
void print(std::ostream&)
const;
00432
void print(
const char*title=0,
00433 std::ostream&out=ExEnv::out0(),
int =10)
const;
00434
void save(
StateOut&);
00435
void restore(
StateIn&);
00437
double determ()
const;
00439 DiagSCMatrixdouble
operator()(
int i)
const;
00443
int nblock()
const;
00447
RefDiagSCMatrix block(
int i)
const;
00448 };
00450
RefDiagSCMatrix operator*(
double,
const RefDiagSCMatrix&);
00451
00452
class SCVectordouble {
00453
friend class RefSCVector;
00454
private:
00455
RefSCVector vector;
00456
int i;
00457
00458 SCVectordouble(
SCVector*,
int);
00459
public:
00460 SCVectordouble(
const SCVectordouble&);
00461 ~SCVectordouble();
00462
double operator=(
double a);
00463
double operator=(
const SCVectordouble&);
00464 operator double();
00465
double val() const;
00466 };
00467
00468 class SCMatrixdouble {
00469
friend class RefSCMatrix;
00470
private:
00471
RefSCMatrix matrix;
00472
int i;
00473
int j;
00474
00475 SCMatrixdouble(
SCMatrix*,
int,
int);
00476
public:
00477 SCMatrixdouble(
const SCMatrixdouble&);
00478 ~SCMatrixdouble();
00479
double operator=(
double a);
00480
double operator=(
const SCMatrixdouble&);
00481 operator double();
00482
double val() const;
00483 };
00484
00485 class SymmSCMatrixdouble {
00486
friend class RefSymmSCMatrix;
00487
private:
00488
RefSymmSCMatrix matrix;
00489
int i;
00490
int j;
00491
00492 SymmSCMatrixdouble(
SymmSCMatrix*,
int,
int);
00493
public:
00494 SymmSCMatrixdouble(
const SCMatrixdouble&);
00495 ~SymmSCMatrixdouble();
00496
double operator=(
double a);
00497
double operator=(
const SymmSCMatrixdouble&);
00498 operator double();
00499
double val() const;
00500 };
00501
00502 class DiagSCMatrixdouble {
00503
friend class RefDiagSCMatrix;
00504
private:
00505
RefDiagSCMatrix matrix;
00506
int i;
00507
int j;
00508
00509 DiagSCMatrixdouble(
DiagSCMatrix*,
int,
int);
00510
public:
00511 DiagSCMatrixdouble(
const SCMatrixdouble&);
00512 ~DiagSCMatrixdouble();
00513
double operator=(
double a);
00514
double operator=(
const DiagSCMatrixdouble&);
00515 operator double();
00516
double val() const;
00517 };
00518
00519 }
00520
00521 #ifdef INLINE_FUNCTIONS
00522 #include <math/scmat/matrix_i.h>
00523 #endif
00524
00525 #endif
00526
00527
00528
00529
00530