📄 newmat.h
字号:
friend SubtractedMatrix;
friend SolvedMatrix;
friend ShiftedMatrix;
friend ScaledMatrix;
friend TransposedMatrix;
friend NegatedMatrix;
friend InvertedMatrix;
friend RowedMatrix;
friend ColedMatrix;
friend DiagedMatrix;
friend MatedMatrix;
friend GetSubMatrix;
friend ConstMatrix;
friend ReturnMatrixX;
friend LinearEquationSolver;
NEW_DELETE(GeneralMatrix)
};
class Matrix : public GeneralMatrix // usual rectangular matrix
{
public:
Matrix() {}
Matrix(int, int); // standard declaration
Matrix(const BaseMatrix&); // evaluate BaseMatrix
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
Real& operator()(int, int); // access element
Real& element(int, int); // access element
Matrix(const Matrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
GeneralMatrix* MakeSolver();
Real Trace() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void NextCol(MatrixRowCol&);
void ReDimension(int,int); // change dimensions
NEW_DELETE(Matrix)
};
class nricMatrix : public Matrix // for use with Numerical
// Recipes in C
{
Real** row_pointer; // points to rows
void MakeRowPointer(); // build rowpointer
void DeleteRowPointer();
public:
nricMatrix() {}
nricMatrix(int m, int n) // standard declaration
: Matrix(m,n) { MakeRowPointer(); }
nricMatrix(const BaseMatrix& bm) // evaluate BaseMatrix
: Matrix(bm) { MakeRowPointer(); }
void operator=(const BaseMatrix& bm)
{ DeleteRowPointer(); Matrix::operator=(bm); MakeRowPointer(); }
void operator=(Real f) { GeneralMatrix::operator=(f); }
void operator<<(const BaseMatrix& X)
{ DeleteRowPointer(); Eq(X,this->Type()); MakeRowPointer(); }
nricMatrix(const nricMatrix& gm) { GetMatrix(&gm); MakeRowPointer(); }
void ReDimension(int m, int n) // change dimensions
{ DeleteRowPointer(); Matrix::ReDimension(m,n); MakeRowPointer(); }
~nricMatrix() { DeleteRowPointer(); }
#ifndef __ZTC__
Real** nric() const { CheckStore(); return row_pointer-1; }
#endif
void CleanUp(); // to clear store
NEW_DELETE(nricMatrix)
};
class SymmetricMatrix : public GeneralMatrix
{
public:
SymmetricMatrix() {}
SymmetricMatrix(ArrayLengthSpecifier);
SymmetricMatrix(const BaseMatrix&);
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int, int); // access element
Real& element(int, int); // access element
MatrixType Type() const;
SymmetricMatrix(const SymmetricMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
Real SumSquare() const;
Real SumAbsoluteValue() const;
Real Trace() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void ReDimension(int); // change dimensions
NEW_DELETE(SymmetricMatrix)
};
class UpperTriangularMatrix : public GeneralMatrix
{
public:
UpperTriangularMatrix() {}
UpperTriangularMatrix(ArrayLengthSpecifier);
void operator=(const BaseMatrix&);
UpperTriangularMatrix(const BaseMatrix&);
UpperTriangularMatrix(const UpperTriangularMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int, int); // access element
Real& element(int, int); // access element
MatrixType Type() const;
GeneralMatrix* MakeSolver() { return this; } // for solving
void Solver(MatrixRowCol&, const MatrixRowCol&);
LogAndSign LogDeterminant() const;
Real Trace() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void ReDimension(int); // change dimensions
NEW_DELETE(UpperTriangularMatrix)
};
class LowerTriangularMatrix : public GeneralMatrix
{
public:
LowerTriangularMatrix() {}
LowerTriangularMatrix(ArrayLengthSpecifier);
LowerTriangularMatrix(const LowerTriangularMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
LowerTriangularMatrix(const BaseMatrix& M);
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int, int); // access element
Real& element(int, int); // access element
MatrixType Type() const;
GeneralMatrix* MakeSolver() { return this; } // for solving
void Solver(MatrixRowCol&, const MatrixRowCol&);
LogAndSign LogDeterminant() const;
Real Trace() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void ReDimension(int); // change dimensions
NEW_DELETE(LowerTriangularMatrix)
};
class DiagonalMatrix : public GeneralMatrix
{
public:
DiagonalMatrix() {}
DiagonalMatrix(ArrayLengthSpecifier);
DiagonalMatrix(const BaseMatrix&);
DiagonalMatrix(const DiagonalMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
Real operator()(int) const;
#endif
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int, int); // access element
Real& operator()(int); // access element
Real& element(int, int); // access element
Real& element(int); // access element
MatrixType Type() const;
LogAndSign LogDeterminant() const;
Real Trace() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void NextCol(MatrixRowCol&);
GeneralMatrix* MakeSolver() { return this; } // for solving
void Solver(MatrixRowCol&, const MatrixRowCol&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
Real* nric() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
MatrixBandWidth BandWidth() const;
NEW_DELETE(DiagonalMatrix)
};
class RowVector : public Matrix
{
public:
RowVector() {}
RowVector(ArrayLengthSpecifier n) : Matrix(1,n.Value()) {}
RowVector(const BaseMatrix&);
RowVector(const RowVector& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int) const; // access element
#endif
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int); // access element
Real& element(int); // access element
MatrixType Type() const;
void GetCol(MatrixRowCol&);
void NextCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
Real* nric() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
void CleanUp(); // to clear store
NEW_DELETE(RowVector)
};
class ColumnVector : public Matrix
{
public:
ColumnVector() {}
ColumnVector(ArrayLengthSpecifier n) : Matrix(n.Value(),1) {}
ColumnVector(const BaseMatrix&);
ColumnVector(const ColumnVector& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int) const; // access element
#endif
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int); // access element
Real& element(int); // access element
MatrixType Type() const;
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
Real* nric() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
void CleanUp(); // to clear store
NEW_DELETE(ColumnVector)
};
class CroutMatrix : public GeneralMatrix // for LU decomposition
{
int* indx;
Boolean d;
Boolean sing;
void ludcmp();
public:
CroutMatrix(const BaseMatrix&);
MatrixType Type() const;
void lubksb(Real*, int=0);
~CroutMatrix();
GeneralMatrix* MakeSolver() { return this; } // for solving
LogAndSign LogDeterminant() const;
void Solver(MatrixRowCol&, const MatrixRowCol&);
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void operator=(const BaseMatrix&);
void CleanUp(); // to clear store
NEW_DELETE(CroutMatrix)
};
/******************************* band matrices ***************************/
class BandMatrix : public GeneralMatrix // band matrix
{
protected:
void CornerClear() const; // set unused elements to zero
public:
int lower, upper; // band widths
BandMatrix() { lower=0; upper=0; CornerClear(); }
BandMatrix(int n,int lb,int ub) { ReDimension(n,lb,ub); CornerClear(); }
// standard declaration
BandMatrix(const BaseMatrix&); // evaluate BaseMatrix
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
Real& operator()(int, int); // access element
Real& element(int, int); // access element
BandMatrix(const BandMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
LogAndSign LogDeterminant() const;
GeneralMatrix* MakeSolver();
Real Trace() const;
Real SumSquare() const { CornerClear(); return GeneralMatrix::SumSquare(); }
Real SumAbsoluteValue() const
{ CornerClear(); return GeneralMatrix::SumAbsoluteValue(); }
Real MaximumAbsoluteValue() const
{ CornerClear(); return GeneralMatrix::MaximumAbsoluteValue(); }
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void ReDimension(int, int, int); // change dimensions
MatrixBandWidth BandWidth() const;
void SetParameters(const GeneralMatrix*);
NEW_DELETE(BandMatrix)
};
class UpperBandMatrix : public BandMatrix // upper band matrix
{
public:
UpperBandMatrix() {}
UpperBandMatrix(int n, int ubw) // standard declaration
: BandMatrix(n, 0, ubw) {}
UpperBandMatrix(const BaseMatrix&); // evaluate BaseMatrix
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
UpperBandMatrix(const UpperBandMatrix& gm) { GetMatrix(&gm); }
GeneralMatrix* MakeSolver() { return this; }
void Solver(MatrixRowCol&, const MatrixRowCol&);
LogAndSign LogDeterminant() const;
void ReDimension(int n,int ubw) // change dimensions
{ BandMatrix::ReDimension(n,0,ubw); }
Real& operator()(int, int);
Real& element(int, int);
NEW_DELETE(UpperBandMatrix)
};
class LowerBandMatrix : public BandMatrix // upper band matrix
{
public:
LowerBandMatrix() {}
LowerBandMatrix(int n, int lbw) // standard declaration
: BandMatrix(n, lbw, 0) {}
LowerBandMatrix(const BaseMatrix&); // evaluate BaseMatrix
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
LowerBandMatrix(const LowerBandMatrix& gm) { GetMatrix(&gm); }
GeneralMatrix* MakeSolver() { return this; }
void Solver(MatrixRowCol&, const MatrixRowCol&);
LogAndSign LogDeterminant() const;
void ReDimension(int n,int lbw) // change dimensions
{ BandMatrix::ReDimension(n,lbw,0); }
Real& operator()(int, int);
Real& element(int, int);
NEW_DELETE(LowerBandMatrix)
};
class SymmetricBandMatrix : public GeneralMatrix
{
void CornerClear() const; // set unused elements to zero
public:
int lower; // lower band width
SymmetricBandMatrix() { lower=0; CornerClear(); }
SymmetricBandMatrix(int n, int lb) { ReDimension(n,lb); CornerClear(); }
SymmetricBandMatrix(const BaseMatrix&);
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
Real& operator()(int, int); // access element
Real& element(int, int); // access element
MatrixType Type() const;
SymmetricBandMatrix(const SymmetricBandMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
Real operator()(int, int) const; // access element
#endif
GeneralMatrix* MakeSolver();
Real SumSquare() const;
Real SumAbsoluteValue() const;
Real MaximumAbsoluteValue() const
{ CornerClear(); return GeneralMatrix::MaximumAbsoluteValue(); }
Real Trace() const;
LogAndSign LogDeterminant() const;
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
void ReDimension(int,int); // change dimensions
MatrixBandWidth BandWidth() const;
void SetParameters(const GeneralMatrix*);
NEW_DELETE(SymmetricBandMatrix)
};
class BandLUMatrix : public GeneralMatrix
// for LU decomposition of band matrix
{
int* indx;
Boolean d;
Boolean sing; // TRUE if singular
Real* store2;
int storage2;
void ludcmp();
int m1,m2; // lower and upper
public:
BandLUMatrix(const BaseMatrix&);
MatrixType Type() const;
void lubksb(Real*, int=0);
~BandLUMatrix();
GeneralMatrix* MakeSolver() { return this; } // for solving
LogAndSign LogDeterminant() const;
void Solver(MatrixRowCol&, const MatrixRowCol&);
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void operator=(const BaseMatrix&);
NEW_DELETE(BandLUMatrix)
void CleanUp(); // to clear store
};
/***************************** temporary classes *************************/
class MultipliedMatrix : public BaseMatrix
{
protected:
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;
// int NrowsV() const;
// int NcolsV() const;
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
MatrixBandWidth BandWidth() const;
NEW_DELETE(MultipliedMatrix)
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -