📄 newmat.h
字号:
Real operator()(int, int) const; // access element
Real element(int, int) const; // access element
#ifdef SETUP_C_SUBSCRIPTS
Real* operator[](int m) { return store+lower_val*(m+1); }
const Real* operator[](int m) const { return store+lower_val*(m+1); }
#endif
MatrixType type() const;
SymmetricBandMatrix(const SymmetricBandMatrix& gm)
: GeneralMatrix() { GetMatrix(&gm); }
GeneralMatrix* MakeSolver();
Real sum_square() const;
Real sum_absolute_value() const;
Real sum() const;
Real maximum_absolute_value() const
{ CornerClear(); return GeneralMatrix::maximum_absolute_value(); }
Real minimum_absolute_value() const
{ int i, j; return GeneralMatrix::minimum_absolute_value2(i, j); }
Real maximum() const { int i, j; return GeneralMatrix::maximum2(i, j); }
Real minimum() const { int i, j; return GeneralMatrix::minimum2(i, j); }
Real trace() const;
LogAndSign log_determinant() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void GetCol(MatrixColX&);
void RestoreCol(MatrixRowCol&) {}
void RestoreCol(MatrixColX&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void resize(int,int); // change dimensions
void ReSize(int m,int b) { resize(m, b); }
void resize(const GeneralMatrix& A);
void ReSize(const GeneralMatrix& A) { resize(A); }
//bool SameStorageType(const GeneralMatrix& A) const;
//void ReSizeForAdd(const GeneralMatrix& A, const GeneralMatrix& B);
//void ReSizeForSP(const GeneralMatrix& A, const GeneralMatrix& B);
MatrixBandWidth bandwidth() const;
void SetParameters(const GeneralMatrix*);
void operator<<(const double* r); // will give error
void operator<<(const float* r); // will give error
void operator<<(const int* r); // will give error
void operator<<(const BaseMatrix& X) { GeneralMatrix::operator<<(X); }
void swap(SymmetricBandMatrix& gm);
NEW_DELETE(SymmetricBandMatrix)
};
/// LU decomposition of a band matrix.
class BandLUMatrix : public GeneralMatrix
{
int* indx;
bool d;
bool sing; // true if singular
Real* store2;
int storage2;
int m1,m2; // lower and upper
void ludcmp();
void get_aux(BandLUMatrix&); // for copying indx[] etc
GeneralMatrix* Image() const; // copy of matrix
public:
BandLUMatrix(const BaseMatrix&);
BandLUMatrix()
: indx(0), d(true), sing(true), store2(0), storage2(0), m1(0), m2(0) {}
BandLUMatrix(const BandLUMatrix&);
void operator=(const BandLUMatrix&);
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixType type() const;
void lubksb(Real*, int=0);
~BandLUMatrix();
GeneralMatrix* MakeSolver() { return this; } // for solving
LogAndSign log_determinant() const;
void Solver(MatrixColX&, const MatrixColX&);
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void GetCol(MatrixColX& c) { GetCol((MatrixRowCol&)c); }
void cleanup(); // to clear store
void MiniCleanUp();
bool IsEqual(const GeneralMatrix&) const;
bool is_singular() const { return sing; }
bool IsSingular() const { return sing; }
const Real* const_data2() const { return store2; }
int size2() const { return storage2; }
const int* const_data_indx() const { return indx; }
bool even_exchanges() const { return d; }
MatrixBandWidth bandwidth() const;
void swap(BandLUMatrix& gm);
NEW_DELETE(BandLUMatrix)
};
// ************************** special matrices ****************************
/// Identity matrix.
class IdentityMatrix : public GeneralMatrix
{
GeneralMatrix* Image() const; // copy of matrix
public:
IdentityMatrix() {}
~IdentityMatrix() {}
IdentityMatrix(ArrayLengthSpecifier n) : GeneralMatrix(1)
{ nrows_val = ncols_val = n.Value(); *store = 1; }
IdentityMatrix(const IdentityMatrix& gm)
: GeneralMatrix() { GetMatrix(&gm); }
IdentityMatrix(const BaseMatrix&);
void operator=(const BaseMatrix&);
void operator=(const IdentityMatrix& m) { Eq(m); }
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType type() const;
LogAndSign log_determinant() const;
Real trace() const;
Real sum_square() const;
Real sum_absolute_value() const;
Real sum() const { return trace(); }
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void GetCol(MatrixColX&);
void NextRow(MatrixRowCol&);
void NextCol(MatrixRowCol&);
void NextCol(MatrixColX&);
GeneralMatrix* MakeSolver() { return this; } // for solving
void Solver(MatrixColX&, const MatrixColX&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void resize(int n);
void ReSize(int n) { resize(n); }
void resize(const GeneralMatrix& A);
void ReSize(const GeneralMatrix& A) { resize(A); }
MatrixBandWidth bandwidth() const;
// ReturnMatrix Reverse() const; // reverse order of elements
void swap(IdentityMatrix& gm)
{ GeneralMatrix::swap((GeneralMatrix&)gm); }
NEW_DELETE(IdentityMatrix)
};
// ************************** GenericMatrix class ************************/
/// A matrix which can be of any GeneralMatrix type.
class GenericMatrix : public BaseMatrix
{
GeneralMatrix* gm;
int search(const BaseMatrix* bm) const;
friend class BaseMatrix;
public:
GenericMatrix() : gm(0) {}
GenericMatrix(const BaseMatrix& bm)
{ gm = ((BaseMatrix&)bm).Evaluate(); gm = gm->Image(); }
GenericMatrix(const GenericMatrix& bm) : BaseMatrix()
{ gm = bm.gm->Image(); }
void operator=(const GenericMatrix&);
void operator=(const BaseMatrix&);
void operator+=(const BaseMatrix&);
void operator-=(const BaseMatrix&);
void operator*=(const BaseMatrix&);
void operator|=(const BaseMatrix&);
void operator&=(const BaseMatrix&);
void operator+=(Real);
void operator-=(Real r) { operator+=(-r); }
void operator*=(Real);
void operator/=(Real r) { operator*=(1.0/r); }
~GenericMatrix() { delete gm; }
void cleanup() { delete gm; gm = 0; }
void Release() { gm->Release(); }
void release() { gm->release(); }
GeneralMatrix* Evaluate(MatrixType = MatrixTypeUnSp);
MatrixBandWidth bandwidth() const;
void swap(GenericMatrix& x);
NEW_DELETE(GenericMatrix)
};
// *************************** temporary classes *************************/
/// Product of two matrices.
/// \internal
class MultipliedMatrix : public BaseMatrix
{
protected:
// if these union statements cause problems, simply remove them
// and declare the items individually
union { const BaseMatrix* bm1; GeneralMatrix* gm1; };
// pointers to summands
union { const BaseMatrix* bm2; GeneralMatrix* gm2; };
MultipliedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: bm1(bm1x),bm2(bm2x) {}
int search(const BaseMatrix*) const;
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~MultipliedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixBandWidth bandwidth() const;
NEW_DELETE(MultipliedMatrix)
};
/// Sum of two matrices.
/// \internal
class AddedMatrix : public MultipliedMatrix
{
protected:
AddedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: MultipliedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~AddedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixBandWidth bandwidth() const;
NEW_DELETE(AddedMatrix)
};
/// Schur (elementwise) product of two matrices.
/// \internal
class SPMatrix : public AddedMatrix
{
protected:
SPMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: AddedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~SPMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixBandWidth bandwidth() const;
friend SPMatrix SP(const BaseMatrix&, const BaseMatrix&);
NEW_DELETE(SPMatrix)
};
/// Kronecker product of two matrices.
/// \internal
class KPMatrix : public MultipliedMatrix
{
protected:
KPMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: MultipliedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~KPMatrix() {}
MatrixBandWidth bandwidth() const;
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
friend KPMatrix KP(const BaseMatrix&, const BaseMatrix&);
NEW_DELETE(KPMatrix)
};
/// Two matrices horizontally concatenated.
/// \internal
class ConcatenatedMatrix : public MultipliedMatrix
{
protected:
ConcatenatedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: MultipliedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~ConcatenatedMatrix() {}
MatrixBandWidth bandwidth() const;
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
NEW_DELETE(ConcatenatedMatrix)
};
/// Two matrices vertically concatenated.
/// \internal
class StackedMatrix : public ConcatenatedMatrix
{
protected:
StackedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: ConcatenatedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~StackedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
NEW_DELETE(StackedMatrix)
};
/// Inverted matrix times matrix.
/// \internal
class SolvedMatrix : public MultipliedMatrix
{
SolvedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: MultipliedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class InvertedMatrix; // for operator*
public:
~SolvedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixBandWidth bandwidth() const;
NEW_DELETE(SolvedMatrix)
};
/// Difference between two matrices.
/// \internal
class SubtractedMatrix : public AddedMatrix
{
SubtractedMatrix(const BaseMatrix* bm1x, const BaseMatrix* bm2x)
: AddedMatrix(bm1x,bm2x) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~SubtractedMatrix() {}
GeneralMatrix* Evalu
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -