📄 newmat.h
字号:
Real& element(int, int); // access element
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*(m+1); }
const Real* operator[](int m) const { return store+lower*(m+1); }
#endif
MatrixType Type() const;
SymmetricBandMatrix(const SymmetricBandMatrix& gm) { GetMatrix(&gm); }
GeneralMatrix* MakeSolver();
Real SumSquare() const;
Real SumAbsoluteValue() const;
Real Sum() const;
Real MaximumAbsoluteValue() const
{ CornerClear(); return GeneralMatrix::MaximumAbsoluteValue(); }
Real MinimumAbsoluteValue() const
{ int i, j; return GeneralMatrix::MinimumAbsoluteValue2(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 LogDeterminant() 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(const GeneralMatrix& 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*);
NEW_DELETE(SymmetricBandMatrix)
};
class BandLUMatrix : public GeneralMatrix
// for LU decomposition of band matrix
{
int* indx;
bool d;
bool 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(MatrixColX&, const MatrixColX&);
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void GetCol(MatrixColX& c) { GetCol((MatrixRowCol&)c); }
void operator=(const BaseMatrix&);
void operator=(const BandLUMatrix& m) { operator=((const BaseMatrix&)m); }
void CleanUp(); // to clear store
bool IsEqual(const GeneralMatrix&) const;
bool IsSingular() const { return sing; }
NEW_DELETE(BandLUMatrix)
};
// ************************** special matrices ****************************
class IdentityMatrix : public GeneralMatrix
{
GeneralMatrix* Image() const; // copy of matrix
public:
IdentityMatrix() {}
~IdentityMatrix() {}
IdentityMatrix(ArrayLengthSpecifier n) : GeneralMatrix(1)
{ nrows = ncols = n.Value(); *store = 1; }
IdentityMatrix(const IdentityMatrix& gm) { GetMatrix(&gm); }
IdentityMatrix(const BaseMatrix&);
void operator=(const BaseMatrix&);
void operator=(Real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
LogAndSign LogDeterminant() const;
Real Trace() const;
Real SumSquare() const;
Real SumAbsoluteValue() 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(const GeneralMatrix& A);
MatrixBandWidth BandWidth() const;
// ReturnMatrix Reverse() const; // reverse order of elements
NEW_DELETE(IdentityMatrix)
};
// ************************** GenericMatrix class ************************/
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)
{ 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(); }
GeneralMatrix* Evaluate(MatrixType = MatrixTypeUnSp);
MatrixBandWidth BandWidth() const;
NEW_DELETE(GenericMatrix)
};
// *************************** temporary classes *************************/
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)
};
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)
};
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;
#ifndef TEMPS_DESTROYED_QUICKLY
friend SPMatrix SP(const BaseMatrix&, const BaseMatrix&);
#else
friend SPMatrix& SP(const BaseMatrix&, const BaseMatrix&);
#endif
NEW_DELETE(SPMatrix)
};
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);
#ifndef TEMPS_DESTROYED_QUICKLY
friend KPMatrix KP(const BaseMatrix&, const BaseMatrix&);
#else
friend KPMatrix& KP(const BaseMatrix&, const BaseMatrix&);
#endif
NEW_DELETE(KPMatrix)
};
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)
};
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)
};
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)
};
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* Evaluate(MatrixType mt=MatrixTypeUnSp);
NEW_DELETE(SubtractedMatrix)
};
class ShiftedMatrix : public BaseMatrix
{
protected:
union { const BaseMatrix* bm; GeneralMatrix* gm; };
Real f;
ShiftedMatrix(const BaseMatrix* bmx, Real fx) : bm(bmx),f(fx) {}
int search(const BaseMatrix*) const;
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~ShiftedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
#ifndef TEMPS_DESTROYED_QUICKLY
friend ShiftedMatrix operator+(Real f, const BaseMatrix& BM)
{ return ShiftedMatrix(&BM, f); }
#endif
NEW_DELETE(ShiftedMatrix)
};
class NegShiftedMatrix : public ShiftedMatrix
{
protected:
NegShiftedMatrix(Real fx, const BaseMatrix* bmx) : ShiftedMatrix(bmx,fx) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~NegShiftedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
#ifndef TEMPS_DESTROYED_QUICKLY
friend NegShiftedMatrix operator-(Real, const BaseMatrix&);
#else
friend NegShiftedMatrix& operator-(Real, const BaseMatrix&);
#endif
NEW_DELETE(NegShiftedMatrix)
};
class ScaledMatrix : public ShiftedMatrix
{
ScaledMatrix(const BaseMatrix* bmx, Real fx) : ShiftedMatrix(bmx,fx) {}
friend class BaseMatrix;
friend class GeneralMatrix;
friend class GenericMatrix;
public:
~ScaledMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
MatrixBandWidth BandWidth() const;
#ifndef TEMPS_DESTROYED_QUICKLY
friend ScaledMatrix operator*(Real f, const BaseMatrix& BM)
{ return ScaledMatrix(&BM, f); }
#endif
NEW_DELETE(ScaledMatrix)
};
class NegatedMatrix : public BaseMatrix
{
protected:
union { const BaseMatrix* bm; GeneralMatrix* gm; };
NegatedMatrix(const BaseMatrix* bmx) : bm(bmx) {}
int search(const BaseMatrix*) const;
private:
friend class BaseMatrix;
public:
~NegatedMatrix() {}
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -