1815 lines
67 KiB
C
1815 lines
67 KiB
C
|
//$$ newmat.h definition file for new version of matrix package
|
||
|
|
||
|
// Copyright (C) 1991,2,3,4,7,2000,2002: R B Davies
|
||
|
|
||
|
#ifndef NEWMAT_LIB
|
||
|
#define NEWMAT_LIB 0
|
||
|
|
||
|
#include "include.h"
|
||
|
|
||
|
#include "boolean.h"
|
||
|
#include "myexcept.h"
|
||
|
|
||
|
|
||
|
#ifdef use_namespace
|
||
|
namespace NEWMAT { using namespace RBD_COMMON; }
|
||
|
namespace RBD_LIBRARIES { using namespace NEWMAT; }
|
||
|
namespace NEWMAT {
|
||
|
#endif
|
||
|
|
||
|
//#define DO_REPORT // to activate REPORT
|
||
|
|
||
|
#ifdef NO_LONG_NAMES
|
||
|
#define UpperTriangularMatrix UTMatrix
|
||
|
#define LowerTriangularMatrix LTMatrix
|
||
|
#define SymmetricMatrix SMatrix
|
||
|
#define DiagonalMatrix DMatrix
|
||
|
#define BandMatrix BMatrix
|
||
|
#define UpperBandMatrix UBMatrix
|
||
|
#define LowerBandMatrix LBMatrix
|
||
|
#define SymmetricBandMatrix SBMatrix
|
||
|
#define BandLUMatrix BLUMatrix
|
||
|
#endif
|
||
|
|
||
|
#ifndef TEMPS_DESTROYED_QUICKLY_R
|
||
|
#define ReturnMatrix ReturnMatrixX
|
||
|
#else
|
||
|
#define ReturnMatrix ReturnMatrixX&
|
||
|
#endif
|
||
|
|
||
|
// ************************** general utilities ****************************/
|
||
|
|
||
|
class GeneralMatrix;
|
||
|
|
||
|
void MatrixErrorNoSpace(void*); // no space handler
|
||
|
|
||
|
class LogAndSign
|
||
|
// Return from LogDeterminant function
|
||
|
// - value of the log plus the sign (+, - or 0)
|
||
|
{
|
||
|
Real log_value;
|
||
|
int sign;
|
||
|
public:
|
||
|
LogAndSign() { log_value=0.0; sign=1; }
|
||
|
LogAndSign(Real);
|
||
|
void operator*=(Real);
|
||
|
void PowEq(int k); // raise to power of k
|
||
|
void ChangeSign() { sign = -sign; }
|
||
|
Real LogValue() const { return log_value; }
|
||
|
int Sign() const { return sign; }
|
||
|
Real Value() const;
|
||
|
FREE_CHECK(LogAndSign)
|
||
|
};
|
||
|
|
||
|
// the following class is for counting the number of times a piece of code
|
||
|
// is executed. It is used for locating any code not executed by test
|
||
|
// routines. Use turbo GREP locate all places this code is called and
|
||
|
// check which ones are not accessed.
|
||
|
// Somewhat implementation dependent as it relies on "cout" still being
|
||
|
// present when ExeCounter objects are destructed.
|
||
|
|
||
|
#ifdef DO_REPORT
|
||
|
|
||
|
class ExeCounter
|
||
|
{
|
||
|
int line; // code line number
|
||
|
int fileid; // file identifier
|
||
|
long nexe; // number of executions
|
||
|
static int nreports; // number of reports
|
||
|
public:
|
||
|
ExeCounter(int,int);
|
||
|
void operator++() { nexe++; }
|
||
|
~ExeCounter(); // prints out reports
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// ************************** class MatrixType *****************************/
|
||
|
|
||
|
// Is used for finding the type of a matrix resulting from the binary operations
|
||
|
// +, -, * and identifying what conversions are permissible.
|
||
|
// This class must be updated when new matrix types are added.
|
||
|
|
||
|
class GeneralMatrix; // defined later
|
||
|
class BaseMatrix; // defined later
|
||
|
class MatrixInput; // defined later
|
||
|
|
||
|
class MatrixType
|
||
|
{
|
||
|
public:
|
||
|
enum Attribute { Valid = 1,
|
||
|
Diagonal = 2, // order of these is important
|
||
|
Symmetric = 4,
|
||
|
Band = 8,
|
||
|
Lower = 16,
|
||
|
Upper = 32,
|
||
|
LUDeco = 64,
|
||
|
Ones = 128 };
|
||
|
|
||
|
enum { US = 0,
|
||
|
UT = Valid + Upper,
|
||
|
LT = Valid + Lower,
|
||
|
Rt = Valid,
|
||
|
Sm = Valid + Symmetric,
|
||
|
Dg = Valid + Diagonal + Band + Lower + Upper + Symmetric,
|
||
|
Id = Valid + Diagonal + Band + Lower + Upper + Symmetric
|
||
|
+ Ones,
|
||
|
RV = Valid, // do not separate out
|
||
|
CV = Valid, // vectors
|
||
|
BM = Valid + Band,
|
||
|
UB = Valid + Band + Upper,
|
||
|
LB = Valid + Band + Lower,
|
||
|
SB = Valid + Band + Symmetric,
|
||
|
Ct = Valid + LUDeco,
|
||
|
BC = Valid + Band + LUDeco
|
||
|
};
|
||
|
|
||
|
|
||
|
static int nTypes() { return 10; } // number of different types
|
||
|
// exclude Ct, US, BC
|
||
|
public:
|
||
|
int attribute;
|
||
|
bool DataLossOK; // true if data loss is OK when
|
||
|
// this represents a destination
|
||
|
public:
|
||
|
MatrixType () : DataLossOK(false) {}
|
||
|
MatrixType (int i) : attribute(i), DataLossOK(false) {}
|
||
|
MatrixType (int i, bool dlok) : attribute(i), DataLossOK(dlok) {}
|
||
|
MatrixType (const MatrixType& mt)
|
||
|
: attribute(mt.attribute), DataLossOK(mt.DataLossOK) {}
|
||
|
void operator=(const MatrixType& mt)
|
||
|
{ attribute = mt.attribute; DataLossOK = mt.DataLossOK; }
|
||
|
void SetDataLossOK() { DataLossOK = true; }
|
||
|
int operator+() const { return attribute; }
|
||
|
MatrixType operator+(MatrixType mt) const
|
||
|
{ return MatrixType(attribute & mt.attribute); }
|
||
|
MatrixType operator*(const MatrixType&) const;
|
||
|
MatrixType SP(const MatrixType&) const;
|
||
|
MatrixType KP(const MatrixType&) const;
|
||
|
MatrixType operator|(const MatrixType& mt) const
|
||
|
{ return MatrixType(attribute & mt.attribute & Valid); }
|
||
|
MatrixType operator&(const MatrixType& mt) const
|
||
|
{ return MatrixType(attribute & mt.attribute & Valid); }
|
||
|
bool operator>=(MatrixType mt) const
|
||
|
{ return ( attribute & mt.attribute ) == attribute; }
|
||
|
bool operator<(MatrixType mt) const // for MS Visual C++ 4
|
||
|
{ return ( attribute & mt.attribute ) != attribute; }
|
||
|
bool operator==(MatrixType t) const
|
||
|
{ return (attribute == t.attribute); }
|
||
|
bool operator!=(MatrixType t) const
|
||
|
{ return (attribute != t.attribute); }
|
||
|
bool operator!() const { return (attribute & Valid) == 0; }
|
||
|
MatrixType i() const; // type of inverse
|
||
|
MatrixType t() const; // type of transpose
|
||
|
MatrixType AddEqualEl() const // Add constant to matrix
|
||
|
{ return MatrixType(attribute & (Valid + Symmetric)); }
|
||
|
MatrixType MultRHS() const; // type for rhs of multiply
|
||
|
MatrixType sub() const // type of submatrix
|
||
|
{ return MatrixType(attribute & Valid); }
|
||
|
MatrixType ssub() const // type of sym submatrix
|
||
|
{ return MatrixType(attribute); } // not for selection matrix
|
||
|
GeneralMatrix* New() const; // new matrix of given type
|
||
|
GeneralMatrix* New(int,int,BaseMatrix*) const;
|
||
|
// new matrix of given type
|
||
|
const char* Value() const; // to print type
|
||
|
friend bool Rectangular(MatrixType a, MatrixType b, MatrixType c);
|
||
|
friend bool Compare(const MatrixType&, MatrixType&);
|
||
|
// compare and check conv.
|
||
|
bool IsBand() const { return (attribute & Band) != 0; }
|
||
|
bool IsDiagonal() const { return (attribute & Diagonal) != 0; }
|
||
|
bool IsSymmetric() const { return (attribute & Symmetric) != 0; }
|
||
|
bool CannotConvert() const { return (attribute & LUDeco) != 0; }
|
||
|
// used by operator==
|
||
|
FREE_CHECK(MatrixType)
|
||
|
};
|
||
|
|
||
|
|
||
|
// *********************** class MatrixBandWidth ***********************/
|
||
|
|
||
|
class MatrixBandWidth
|
||
|
{
|
||
|
public:
|
||
|
int lower;
|
||
|
int upper;
|
||
|
MatrixBandWidth(const int l, const int u) : lower(l), upper (u) {}
|
||
|
MatrixBandWidth(const int i) : lower(i), upper(i) {}
|
||
|
MatrixBandWidth operator+(const MatrixBandWidth&) const;
|
||
|
MatrixBandWidth operator*(const MatrixBandWidth&) const;
|
||
|
MatrixBandWidth minimum(const MatrixBandWidth&) const;
|
||
|
MatrixBandWidth t() const { return MatrixBandWidth(upper,lower); }
|
||
|
bool operator==(const MatrixBandWidth& bw) const
|
||
|
{ return (lower == bw.lower) && (upper == bw.upper); }
|
||
|
bool operator!=(const MatrixBandWidth& bw) const { return !operator==(bw); }
|
||
|
int Upper() const { return upper; }
|
||
|
int Lower() const { return lower; }
|
||
|
FREE_CHECK(MatrixBandWidth)
|
||
|
};
|
||
|
|
||
|
|
||
|
// ********************* Array length specifier ************************/
|
||
|
|
||
|
// This class is introduced to avoid constructors such as
|
||
|
// ColumnVector(int)
|
||
|
// being used for conversions
|
||
|
|
||
|
class ArrayLengthSpecifier
|
||
|
{
|
||
|
int value;
|
||
|
public:
|
||
|
int Value() const { return value; }
|
||
|
ArrayLengthSpecifier(int l) : value(l) {}
|
||
|
};
|
||
|
|
||
|
// ************************* Matrix routines ***************************/
|
||
|
|
||
|
|
||
|
class MatrixRowCol; // defined later
|
||
|
class MatrixRow;
|
||
|
class MatrixCol;
|
||
|
class MatrixColX;
|
||
|
|
||
|
class GeneralMatrix; // defined later
|
||
|
class AddedMatrix;
|
||
|
class MultipliedMatrix;
|
||
|
class SubtractedMatrix;
|
||
|
class SPMatrix;
|
||
|
class KPMatrix;
|
||
|
class ConcatenatedMatrix;
|
||
|
class StackedMatrix;
|
||
|
class SolvedMatrix;
|
||
|
class ShiftedMatrix;
|
||
|
class NegShiftedMatrix;
|
||
|
class ScaledMatrix;
|
||
|
class TransposedMatrix;
|
||
|
class ReversedMatrix;
|
||
|
class NegatedMatrix;
|
||
|
class InvertedMatrix;
|
||
|
class RowedMatrix;
|
||
|
class ColedMatrix;
|
||
|
class DiagedMatrix;
|
||
|
class MatedMatrix;
|
||
|
class GetSubMatrix;
|
||
|
class ReturnMatrixX;
|
||
|
class Matrix;
|
||
|
class nricMatrix;
|
||
|
class RowVector;
|
||
|
class ColumnVector;
|
||
|
class SymmetricMatrix;
|
||
|
class UpperTriangularMatrix;
|
||
|
class LowerTriangularMatrix;
|
||
|
class DiagonalMatrix;
|
||
|
class CroutMatrix;
|
||
|
class BandMatrix;
|
||
|
class LowerBandMatrix;
|
||
|
class UpperBandMatrix;
|
||
|
class SymmetricBandMatrix;
|
||
|
class LinearEquationSolver;
|
||
|
class GenericMatrix;
|
||
|
|
||
|
|
||
|
#define MatrixTypeUnSp 0
|
||
|
//static MatrixType MatrixTypeUnSp(MatrixType::US);
|
||
|
// // AT&T needs this
|
||
|
|
||
|
class BaseMatrix : public Janitor // base of all matrix classes
|
||
|
{
|
||
|
protected:
|
||
|
virtual int search(const BaseMatrix*) const = 0;
|
||
|
// count number of times matrix
|
||
|
// is referred to
|
||
|
|
||
|
public:
|
||
|
virtual GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp) = 0;
|
||
|
// evaluate temporary
|
||
|
// for old version of G++
|
||
|
// virtual GeneralMatrix* Evaluate(MatrixType mt) = 0;
|
||
|
// GeneralMatrix* Evaluate() { return Evaluate(MatrixTypeUnSp); }
|
||
|
#ifndef TEMPS_DESTROYED_QUICKLY
|
||
|
AddedMatrix operator+(const BaseMatrix&) const; // results of operations
|
||
|
MultipliedMatrix operator*(const BaseMatrix&) const;
|
||
|
SubtractedMatrix operator-(const BaseMatrix&) const;
|
||
|
ConcatenatedMatrix operator|(const BaseMatrix&) const;
|
||
|
StackedMatrix operator&(const BaseMatrix&) const;
|
||
|
ShiftedMatrix operator+(Real) const;
|
||
|
ScaledMatrix operator*(Real) const;
|
||
|
ScaledMatrix operator/(Real) const;
|
||
|
ShiftedMatrix operator-(Real) const;
|
||
|
TransposedMatrix t() const;
|
||
|
// TransposedMatrix t;
|
||
|
NegatedMatrix operator-() const; // change sign of elements
|
||
|
ReversedMatrix Reverse() const;
|
||
|
InvertedMatrix i() const;
|
||
|
// InvertedMatrix i;
|
||
|
RowedMatrix AsRow() const;
|
||
|
ColedMatrix AsColumn() const;
|
||
|
DiagedMatrix AsDiagonal() const;
|
||
|
MatedMatrix AsMatrix(int,int) const;
|
||
|
GetSubMatrix SubMatrix(int,int,int,int) const;
|
||
|
GetSubMatrix SymSubMatrix(int,int) const;
|
||
|
GetSubMatrix Row(int) const;
|
||
|
GetSubMatrix Rows(int,int) const;
|
||
|
GetSubMatrix Column(int) const;
|
||
|
GetSubMatrix Columns(int,int) const;
|
||
|
#else
|
||
|
AddedMatrix& operator+(const BaseMatrix&) const; // results of operations
|
||
|
MultipliedMatrix& operator*(const BaseMatrix&) const;
|
||
|
SubtractedMatrix& operator-(const BaseMatrix&) const;
|
||
|
ConcatenatedMatrix& operator|(const BaseMatrix&) const;
|
||
|
StackedMatrix& operator&(const BaseMatrix&) const;
|
||
|
ShiftedMatrix& operator+(Real) const;
|
||
|
ScaledMatrix& operator*(Real) const;
|
||
|
ScaledMatrix& operator/(Real) const;
|
||
|
ShiftedMatrix& operator-(Real) const;
|
||
|
TransposedMatrix& t() const;
|
||
|
// TransposedMatrix& t;
|
||
|
NegatedMatrix& operator-() const; // change sign of elements
|
||
|
ReversedMatrix& Reverse() const;
|
||
|
InvertedMatrix& i() const;
|
||
|
// InvertedMatrix& i;
|
||
|
RowedMatrix& AsRow() const;
|
||
|
ColedMatrix& AsColumn() const;
|
||
|
DiagedMatrix& AsDiagonal() const;
|
||
|
MatedMatrix& AsMatrix(int,int) const;
|
||
|
GetSubMatrix& SubMatrix(int,int,int,int) const;
|
||
|
GetSubMatrix& SymSubMatrix(int,int) const;
|
||
|
GetSubMatrix& Row(int) const;
|
||
|
GetSubMatrix& Rows(int,int) const;
|
||
|
GetSubMatrix& Column(int) const;
|
||
|
GetSubMatrix& Columns(int,int) const;
|
||
|
#endif
|
||
|
Real AsScalar() const; // conversion of 1 x 1 matrix
|
||
|
virtual LogAndSign LogDeterminant() const;
|
||
|
Real Determinant() const;
|
||
|
virtual Real SumSquare() const;
|
||
|
Real NormFrobenius() const;
|
||
|
virtual Real SumAbsoluteValue() const;
|
||
|
virtual Real Sum() const;
|
||
|
virtual Real MaximumAbsoluteValue() const;
|
||
|
virtual Real MaximumAbsoluteValue1(int& i) const;
|
||
|
virtual Real MaximumAbsoluteValue2(int& i, int& j) const;
|
||
|
virtual Real MinimumAbsoluteValue() const;
|
||
|
virtual Real MinimumAbsoluteValue1(int& i) const;
|
||
|
virtual Real MinimumAbsoluteValue2(int& i, int& j) const;
|
||
|
virtual Real Maximum() const;
|
||
|
virtual Real Maximum1(int& i) const;
|
||
|
virtual Real Maximum2(int& i, int& j) const;
|
||
|
virtual Real Minimum() const;
|
||
|
virtual Real Minimum1(int& i) const;
|
||
|
virtual Real Minimum2(int& i, int& j) const;
|
||
|
virtual Real Trace() const;
|
||
|
Real Norm1() const;
|
||
|
Real NormInfinity() const;
|
||
|
virtual MatrixBandWidth BandWidth() const; // bandwidths of band matrix
|
||
|
virtual void CleanUp() {} // to clear store
|
||
|
void IEQND() const; // called by ineq. ops
|
||
|
// virtual ReturnMatrix Reverse() const; // reverse order of elements
|
||
|
|
||
|
|
||
|
//protected:
|
||
|
// BaseMatrix() : t(this), i(this) {}
|
||
|
|
||
|
friend class GeneralMatrix;
|
||
|
friend class Matrix;
|
||
|
friend class nricMatrix;
|
||
|
friend class RowVector;
|
||
|
friend class ColumnVector;
|
||
|
friend class SymmetricMatrix;
|
||
|
friend class UpperTriangularMatrix;
|
||
|
friend class LowerTriangularMatrix;
|
||
|
friend class DiagonalMatrix;
|
||
|
friend class CroutMatrix;
|
||
|
friend class BandMatrix;
|
||
|
friend class LowerBandMatrix;
|
||
|
friend class UpperBandMatrix;
|
||
|
friend class SymmetricBandMatrix;
|
||
|
friend class AddedMatrix;
|
||
|
friend class MultipliedMatrix;
|
||
|
friend class SubtractedMatrix;
|
||
|
friend class SPMatrix;
|
||
|
friend class KPMatrix;
|
||
|
friend class ConcatenatedMatrix;
|
||
|
friend class StackedMatrix;
|
||
|
friend class SolvedMatrix;
|
||
|
friend class ShiftedMatrix;
|
||
|
friend class NegShiftedMatrix;
|
||
|
friend class ScaledMatrix;
|
||
|
friend class TransposedMatrix;
|
||
|
friend class ReversedMatrix;
|
||
|
friend class NegatedMatrix;
|
||
|
friend class InvertedMatrix;
|
||
|
friend class RowedMatrix;
|
||
|
friend class ColedMatrix;
|
||
|
friend class DiagedMatrix;
|
||
|
friend class MatedMatrix;
|
||
|
friend class GetSubMatrix;
|
||
|
friend class ReturnMatrixX;
|
||
|
friend class LinearEquationSolver;
|
||
|
friend class GenericMatrix;
|
||
|
NEW_DELETE(BaseMatrix)
|
||
|
};
|
||
|
|
||
|
|
||
|
// ***************************** working classes **************************/
|
||
|
|
||
|
class GeneralMatrix : public BaseMatrix // declarable matrix types
|
||
|
{
|
||
|
virtual GeneralMatrix* Image() const; // copy of matrix
|
||
|
protected:
|
||
|
int tag; // shows whether can reuse
|
||
|
int nrows, ncols; // dimensions
|
||
|
int storage; // total store required
|
||
|
Real* store; // point to store (0=not set)
|
||
|
GeneralMatrix(); // initialise with no store
|
||
|
GeneralMatrix(ArrayLengthSpecifier); // constructor getting store
|
||
|
void Add(GeneralMatrix*, Real); // sum of GM and Real
|
||
|
void Add(Real); // add Real to this
|
||
|
void NegAdd(GeneralMatrix*, Real); // Real - GM
|
||
|
void NegAdd(Real); // this = this - Real
|
||
|
void Multiply(GeneralMatrix*, Real); // product of GM and Real
|
||
|
void Multiply(Real); // multiply this by Real
|
||
|
void Negate(GeneralMatrix*); // change sign
|
||
|
void Negate(); // change sign
|
||
|
void ReverseElements(); // internal reverse of elements
|
||
|
void ReverseElements(GeneralMatrix*); // reverse order of elements
|
||
|
void operator=(Real); // set matrix to constant
|
||
|
Real* GetStore(); // get store or copy
|
||
|
GeneralMatrix* BorrowStore(GeneralMatrix*, MatrixType);
|
||
|
// temporarily access store
|
||
|
void GetMatrix(const GeneralMatrix*); // used by = and initialise
|
||
|
void Eq(const BaseMatrix&, MatrixType); // used by =
|
||
|
void Eq(const BaseMatrix&, MatrixType, bool);// used by <<
|
||
|
void Eq2(const BaseMatrix&, MatrixType); // cut down version of Eq
|
||
|
int search(const BaseMatrix*) const;
|
||
|
virtual GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
|
||
|
void CheckConversion(const BaseMatrix&); // check conversion OK
|
||
|
void ReSize(int, int, int); // change dimensions
|
||
|
virtual short SimpleAddOK(const GeneralMatrix* gm) { return 0; }
|
||
|
// see bandmat.cpp for explanation
|
||
|
public:
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
virtual MatrixType Type() const = 0; // type of a matrix
|
||
|
int Nrows() const { return nrows; } // get dimensions
|
||
|
int Ncols() const { return ncols; }
|
||
|
int Storage() const { return storage; }
|
||
|
Real* Store() const { return store; }
|
||
|
virtual ~GeneralMatrix(); // delete store if set
|
||
|
void tDelete(); // delete if tag permits
|
||
|
bool reuse(); // true if tag allows reuse
|
||
|
void Protect() { tag=-1; } // cannot delete or reuse
|
||
|
int Tag() const { return tag; }
|
||
|
bool IsZero() const; // test matrix has all zeros
|
||
|
void Release() { tag=1; } // del store after next use
|
||
|
void Release(int t) { tag=t; } // del store after t accesses
|
||
|
void ReleaseAndDelete() { tag=0; } // delete matrix after use
|
||
|
void operator<<(const Real*); // assignment from an array
|
||
|
void operator<<(const BaseMatrix& X)
|
||
|
{ Eq(X,this->Type(),true); } // = without checking type
|
||
|
void Inject(const GeneralMatrix&); // copy stored els only
|
||
|
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); }
|
||
|
virtual GeneralMatrix* MakeSolver(); // for solving
|
||
|
virtual void Solver(MatrixColX&, const MatrixColX&) {}
|
||
|
virtual void GetRow(MatrixRowCol&) = 0; // Get matrix row
|
||
|
virtual void RestoreRow(MatrixRowCol&) {} // Restore matrix row
|
||
|
virtual void NextRow(MatrixRowCol&); // Go to next row
|
||
|
virtual void GetCol(MatrixRowCol&) = 0; // Get matrix col
|
||
|
virtual void GetCol(MatrixColX&) = 0; // Get matrix col
|
||
|
virtual void RestoreCol(MatrixRowCol&) {} // Restore matrix col
|
||
|
virtual void RestoreCol(MatrixColX&) {} // Restore matrix col
|
||
|
virtual void NextCol(MatrixRowCol&); // Go to next col
|
||
|
virtual void NextCol(MatrixColX&); // Go to next col
|
||
|
Real SumSquare() const;
|
||
|
Real SumAbsoluteValue() const;
|
||
|
Real Sum() const;
|
||
|
Real MaximumAbsoluteValue1(int& i) const;
|
||
|
Real MinimumAbsoluteValue1(int& i) const;
|
||
|
Real Maximum1(int& i) const;
|
||
|
Real Minimum1(int& i) const;
|
||
|
Real MaximumAbsoluteValue() const;
|
||
|
Real MaximumAbsoluteValue2(int& i, int& j) const;
|
||
|
Real MinimumAbsoluteValue() const;
|
||
|
Real MinimumAbsoluteValue2(int& i, int& j) const;
|
||
|
Real Maximum() const;
|
||
|
Real Maximum2(int& i, int& j) const;
|
||
|
Real Minimum() const;
|
||
|
Real Minimum2(int& i, int& j) const;
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
virtual bool IsEqual(const GeneralMatrix&) const;
|
||
|
// same type, same values
|
||
|
void CheckStore() const; // check store is non-zero
|
||
|
virtual void SetParameters(const GeneralMatrix*) {}
|
||
|
// set parameters in GetMatrix
|
||
|
operator ReturnMatrix() const; // for building a ReturnMatrix
|
||
|
ReturnMatrix ForReturn() const;
|
||
|
virtual bool SameStorageType(const GeneralMatrix& A) const;
|
||
|
virtual void ReSizeForAdd(const GeneralMatrix& A, const GeneralMatrix& B);
|
||
|
virtual void ReSizeForSP(const GeneralMatrix& A, const GeneralMatrix& B);
|
||
|
virtual void ReSize(const GeneralMatrix& A);
|
||
|
MatrixInput operator<<(Real); // for loading a list
|
||
|
MatrixInput operator<<(int f);
|
||
|
// ReturnMatrix Reverse() const; // reverse order of elements
|
||
|
void CleanUp(); // to clear store
|
||
|
|
||
|
friend class Matrix;
|
||
|
friend class nricMatrix;
|
||
|
friend class SymmetricMatrix;
|
||
|
friend class UpperTriangularMatrix;
|
||
|
friend class LowerTriangularMatrix;
|
||
|
friend class DiagonalMatrix;
|
||
|
friend class CroutMatrix;
|
||
|
friend class RowVector;
|
||
|
friend class ColumnVector;
|
||
|
friend class BandMatrix;
|
||
|
friend class LowerBandMatrix;
|
||
|
friend class UpperBandMatrix;
|
||
|
friend class SymmetricBandMatrix;
|
||
|
friend class BaseMatrix;
|
||
|
friend class AddedMatrix;
|
||
|
friend class MultipliedMatrix;
|
||
|
friend class SubtractedMatrix;
|
||
|
friend class SPMatrix;
|
||
|
friend class KPMatrix;
|
||
|
friend class ConcatenatedMatrix;
|
||
|
friend class StackedMatrix;
|
||
|
friend class SolvedMatrix;
|
||
|
friend class ShiftedMatrix;
|
||
|
friend class NegShiftedMatrix;
|
||
|
friend class ScaledMatrix;
|
||
|
friend class TransposedMatrix;
|
||
|
friend class ReversedMatrix;
|
||
|
friend class NegatedMatrix;
|
||
|
friend class InvertedMatrix;
|
||
|
friend class RowedMatrix;
|
||
|
friend class ColedMatrix;
|
||
|
friend class DiagedMatrix;
|
||
|
friend class MatedMatrix;
|
||
|
friend class GetSubMatrix;
|
||
|
friend class ReturnMatrixX;
|
||
|
friend class LinearEquationSolver;
|
||
|
friend class GenericMatrix;
|
||
|
NEW_DELETE(GeneralMatrix)
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
class Matrix : public GeneralMatrix // usual rectangular matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
Matrix() {}
|
||
|
~Matrix() {}
|
||
|
Matrix(int, int); // standard declaration
|
||
|
Matrix(const BaseMatrix&); // evaluate BaseMatrix
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const Matrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
MatrixType Type() const;
|
||
|
Real& operator()(int, int); // access element
|
||
|
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+m*ncols; }
|
||
|
const Real* operator[](int m) const { return store+m*ncols; }
|
||
|
#endif
|
||
|
Matrix(const Matrix& gm) { GetMatrix(&gm); }
|
||
|
GeneralMatrix* MakeSolver();
|
||
|
Real Trace() const;
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&);
|
||
|
void RestoreCol(MatrixColX&);
|
||
|
void NextRow(MatrixRowCol&);
|
||
|
void NextCol(MatrixRowCol&);
|
||
|
void NextCol(MatrixColX&);
|
||
|
virtual void ReSize(int,int); // change dimensions
|
||
|
// virtual so we will catch it being used in a vector called as a matrix
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
Real MaximumAbsoluteValue2(int& i, int& j) const;
|
||
|
Real MinimumAbsoluteValue2(int& i, int& j) const;
|
||
|
Real Maximum2(int& i, int& j) const;
|
||
|
Real Minimum2(int& i, int& j) const;
|
||
|
friend Real DotProduct(const Matrix& A, const Matrix& B);
|
||
|
NEW_DELETE(Matrix)
|
||
|
};
|
||
|
|
||
|
class nricMatrix : public Matrix // for use with Numerical
|
||
|
// Recipes in C
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
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 nricMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
void operator<<(const BaseMatrix& X)
|
||
|
{ DeleteRowPointer(); Eq(X,this->Type(),true); MakeRowPointer(); }
|
||
|
nricMatrix(const nricMatrix& gm) { GetMatrix(&gm); MakeRowPointer(); }
|
||
|
void ReSize(int m, int n) // change dimensions
|
||
|
{ DeleteRowPointer(); Matrix::ReSize(m,n); MakeRowPointer(); }
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
~nricMatrix() { DeleteRowPointer(); }
|
||
|
Real** nric() const { CheckStore(); return row_pointer-1; }
|
||
|
void CleanUp(); // to clear store
|
||
|
NEW_DELETE(nricMatrix)
|
||
|
};
|
||
|
|
||
|
class SymmetricMatrix : public GeneralMatrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
SymmetricMatrix() {}
|
||
|
~SymmetricMatrix() {}
|
||
|
SymmetricMatrix(ArrayLengthSpecifier);
|
||
|
SymmetricMatrix(const BaseMatrix&);
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const SymmetricMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int, int); // access element
|
||
|
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+(m*(m+1))/2; }
|
||
|
const Real* operator[](int m) const { return store+(m*(m+1))/2; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
SymmetricMatrix(const SymmetricMatrix& gm) { GetMatrix(&gm); }
|
||
|
Real SumSquare() const;
|
||
|
Real SumAbsoluteValue() const;
|
||
|
Real Sum() const;
|
||
|
Real Trace() const;
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&) {}
|
||
|
void RestoreCol(MatrixColX&);
|
||
|
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
|
||
|
void ReSize(int); // change dimensions
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
NEW_DELETE(SymmetricMatrix)
|
||
|
};
|
||
|
|
||
|
class UpperTriangularMatrix : public GeneralMatrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
UpperTriangularMatrix() {}
|
||
|
~UpperTriangularMatrix() {}
|
||
|
UpperTriangularMatrix(ArrayLengthSpecifier);
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(const UpperTriangularMatrix& m)
|
||
|
{ operator=((const BaseMatrix&)m); }
|
||
|
UpperTriangularMatrix(const BaseMatrix&);
|
||
|
UpperTriangularMatrix(const UpperTriangularMatrix& gm) { GetMatrix(&gm); }
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
Real& operator()(int, int); // access element
|
||
|
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+m*ncols-(m*(m+1))/2; }
|
||
|
const Real* operator[](int m) const { return store+m*ncols-(m*(m+1))/2; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
GeneralMatrix* MakeSolver() { return this; } // for solving
|
||
|
void Solver(MatrixColX&, const MatrixColX&);
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
Real Trace() const;
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&);
|
||
|
void RestoreCol(MatrixColX& c) { RestoreCol((MatrixRowCol&)c); }
|
||
|
void NextRow(MatrixRowCol&);
|
||
|
void ReSize(int); // change dimensions
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(UpperTriangularMatrix)
|
||
|
};
|
||
|
|
||
|
class LowerTriangularMatrix : public GeneralMatrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
LowerTriangularMatrix() {}
|
||
|
~LowerTriangularMatrix() {}
|
||
|
LowerTriangularMatrix(ArrayLengthSpecifier);
|
||
|
LowerTriangularMatrix(const LowerTriangularMatrix& gm) { GetMatrix(&gm); }
|
||
|
LowerTriangularMatrix(const BaseMatrix& M);
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const LowerTriangularMatrix& m)
|
||
|
{ operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int, int); // access element
|
||
|
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+(m*(m+1))/2; }
|
||
|
const Real* operator[](int m) const { return store+(m*(m+1))/2; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
GeneralMatrix* MakeSolver() { return this; } // for solving
|
||
|
void Solver(MatrixColX&, const MatrixColX&);
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
Real Trace() const;
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&);
|
||
|
void RestoreCol(MatrixColX& c) { RestoreCol((MatrixRowCol&)c); }
|
||
|
void NextRow(MatrixRowCol&);
|
||
|
void ReSize(int); // change dimensions
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(LowerTriangularMatrix)
|
||
|
};
|
||
|
|
||
|
class DiagonalMatrix : public GeneralMatrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
DiagonalMatrix() {}
|
||
|
~DiagonalMatrix() {}
|
||
|
DiagonalMatrix(ArrayLengthSpecifier);
|
||
|
DiagonalMatrix(const BaseMatrix&);
|
||
|
DiagonalMatrix(const DiagonalMatrix& gm) { GetMatrix(&gm); }
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const DiagonalMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int, int); // access element
|
||
|
Real& operator()(int); // access element
|
||
|
Real operator()(int, int) const; // access element
|
||
|
Real operator()(int) const;
|
||
|
Real& element(int, int); // access element
|
||
|
Real& element(int); // access element
|
||
|
Real element(int, int) const; // access element
|
||
|
Real element(int) const; // access element
|
||
|
#ifdef SETUP_C_SUBSCRIPTS
|
||
|
Real& operator[](int m) { return store[m]; }
|
||
|
const Real& operator[](int m) const { return store[m]; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
Real Trace() const;
|
||
|
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); // change dimensions
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
Real* nric() const
|
||
|
{ CheckStore(); return store-1; } // for use by NRIC
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
// ReturnMatrix Reverse() const; // reverse order of elements
|
||
|
NEW_DELETE(DiagonalMatrix)
|
||
|
};
|
||
|
|
||
|
class RowVector : public Matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
RowVector() { nrows = 1; }
|
||
|
~RowVector() {}
|
||
|
RowVector(ArrayLengthSpecifier n) : Matrix(1,n.Value()) {}
|
||
|
RowVector(const BaseMatrix&);
|
||
|
RowVector(const RowVector& gm) { GetMatrix(&gm); }
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const RowVector& m) { operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int); // access element
|
||
|
Real& element(int); // access element
|
||
|
Real operator()(int) const; // access element
|
||
|
Real element(int) const; // access element
|
||
|
#ifdef SETUP_C_SUBSCRIPTS
|
||
|
Real& operator[](int m) { return store[m]; }
|
||
|
const Real& operator[](int m) const { return store[m]; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void NextCol(MatrixRowCol&);
|
||
|
void NextCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&) {}
|
||
|
void RestoreCol(MatrixColX& c);
|
||
|
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
|
||
|
void ReSize(int); // change dimensions
|
||
|
void ReSize(int,int); // in case access is matrix
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
Real* nric() const
|
||
|
{ CheckStore(); return store-1; } // for use by NRIC
|
||
|
void CleanUp(); // to clear store
|
||
|
// friend ReturnMatrix GetMatrixRow(Matrix& A, int row);
|
||
|
NEW_DELETE(RowVector)
|
||
|
};
|
||
|
|
||
|
class ColumnVector : public Matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
ColumnVector() { ncols = 1; }
|
||
|
~ColumnVector() {}
|
||
|
ColumnVector(ArrayLengthSpecifier n) : Matrix(n.Value(),1) {}
|
||
|
ColumnVector(const BaseMatrix&);
|
||
|
ColumnVector(const ColumnVector& gm) { GetMatrix(&gm); }
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const ColumnVector& m) { operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int); // access element
|
||
|
Real& element(int); // access element
|
||
|
Real operator()(int) const; // access element
|
||
|
Real element(int) const; // access element
|
||
|
#ifdef SETUP_C_SUBSCRIPTS
|
||
|
Real& operator[](int m) { return store[m]; }
|
||
|
const Real& operator[](int m) const { return store[m]; }
|
||
|
#endif
|
||
|
MatrixType Type() const;
|
||
|
GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
|
||
|
void ReSize(int); // change dimensions
|
||
|
void ReSize(int,int); // in case access is matrix
|
||
|
void ReSize(const GeneralMatrix& A);
|
||
|
Real* nric() const
|
||
|
{ CheckStore(); return store-1; } // for use by NRIC
|
||
|
void CleanUp(); // to clear store
|
||
|
// ReturnMatrix Reverse() const; // reverse order of elements
|
||
|
NEW_DELETE(ColumnVector)
|
||
|
};
|
||
|
|
||
|
class CroutMatrix : public GeneralMatrix // for LU decomposition
|
||
|
{
|
||
|
int* indx;
|
||
|
bool d;
|
||
|
bool 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(MatrixColX&, const MatrixColX&);
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX& c) { GetCol((MatrixRowCol&)c); }
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(const CroutMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
void CleanUp(); // to clear store
|
||
|
bool IsEqual(const GeneralMatrix&) const;
|
||
|
bool IsSingular() const { return sing; }
|
||
|
NEW_DELETE(CroutMatrix)
|
||
|
};
|
||
|
|
||
|
// ***************************** band matrices ***************************/
|
||
|
|
||
|
class BandMatrix : public GeneralMatrix // band matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
protected:
|
||
|
void CornerClear() const; // set unused elements to zero
|
||
|
short SimpleAddOK(const GeneralMatrix* gm);
|
||
|
public:
|
||
|
int lower, upper; // band widths
|
||
|
BandMatrix() { lower=0; upper=0; CornerClear(); }
|
||
|
~BandMatrix() {}
|
||
|
BandMatrix(int n,int lb,int ub) { ReSize(n,lb,ub); CornerClear(); }
|
||
|
// standard declaration
|
||
|
BandMatrix(const BaseMatrix&); // evaluate BaseMatrix
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const BandMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
MatrixType Type() const;
|
||
|
Real& operator()(int, int); // access element
|
||
|
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+(upper+lower)*m+lower; }
|
||
|
const Real* operator[](int m) const { return store+(upper+lower)*m+lower; }
|
||
|
#endif
|
||
|
BandMatrix(const BandMatrix& gm) { GetMatrix(&gm); }
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
GeneralMatrix* MakeSolver();
|
||
|
Real Trace() const;
|
||
|
Real SumSquare() const { CornerClear(); return GeneralMatrix::SumSquare(); }
|
||
|
Real SumAbsoluteValue() const
|
||
|
{ CornerClear(); return GeneralMatrix::SumAbsoluteValue(); }
|
||
|
Real Sum() const
|
||
|
{ CornerClear(); return GeneralMatrix::Sum(); }
|
||
|
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); }
|
||
|
void GetRow(MatrixRowCol&);
|
||
|
void GetCol(MatrixRowCol&);
|
||
|
void GetCol(MatrixColX&);
|
||
|
void RestoreCol(MatrixRowCol&);
|
||
|
void RestoreCol(MatrixColX& c) { RestoreCol((MatrixRowCol&)c); }
|
||
|
void NextRow(MatrixRowCol&);
|
||
|
virtual void ReSize(int, 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*);
|
||
|
MatrixInput operator<<(Real); // will give error
|
||
|
MatrixInput operator<<(int f);
|
||
|
void operator<<(const Real* r); // will give error
|
||
|
// the next is included because Zortech and Borland
|
||
|
// cannot find the copy in GeneralMatrix
|
||
|
void operator<<(const BaseMatrix& X) { GeneralMatrix::operator<<(X); }
|
||
|
NEW_DELETE(BandMatrix)
|
||
|
};
|
||
|
|
||
|
class UpperBandMatrix : public BandMatrix // upper band matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
UpperBandMatrix() {}
|
||
|
~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); }
|
||
|
void operator=(const UpperBandMatrix& m)
|
||
|
{ operator=((const BaseMatrix&)m); }
|
||
|
MatrixType Type() const;
|
||
|
UpperBandMatrix(const UpperBandMatrix& gm) { GetMatrix(&gm); }
|
||
|
GeneralMatrix* MakeSolver() { return this; }
|
||
|
void Solver(MatrixColX&, const MatrixColX&);
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
void ReSize(int, int, int); // change dimensions
|
||
|
void ReSize(int n,int ubw) // change dimensions
|
||
|
{ BandMatrix::ReSize(n,0,ubw); }
|
||
|
void ReSize(const GeneralMatrix& A) { BandMatrix::ReSize(A); }
|
||
|
Real& operator()(int, int);
|
||
|
Real operator()(int, int) const;
|
||
|
Real& element(int, int);
|
||
|
Real element(int, int) const;
|
||
|
#ifdef SETUP_C_SUBSCRIPTS
|
||
|
Real* operator[](int m) { return store+upper*m; }
|
||
|
const Real* operator[](int m) const { return store+upper*m; }
|
||
|
#endif
|
||
|
NEW_DELETE(UpperBandMatrix)
|
||
|
};
|
||
|
|
||
|
class LowerBandMatrix : public BandMatrix // upper band matrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
public:
|
||
|
LowerBandMatrix() {}
|
||
|
~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); }
|
||
|
void operator=(const LowerBandMatrix& m)
|
||
|
{ operator=((const BaseMatrix&)m); }
|
||
|
MatrixType Type() const;
|
||
|
LowerBandMatrix(const LowerBandMatrix& gm) { GetMatrix(&gm); }
|
||
|
GeneralMatrix* MakeSolver() { return this; }
|
||
|
void Solver(MatrixColX&, const MatrixColX&);
|
||
|
LogAndSign LogDeterminant() const;
|
||
|
void ReSize(int, int, int); // change dimensions
|
||
|
void ReSize(int n,int lbw) // change dimensions
|
||
|
{ BandMatrix::ReSize(n,lbw,0); }
|
||
|
void ReSize(const GeneralMatrix& A) { BandMatrix::ReSize(A); }
|
||
|
Real& operator()(int, int);
|
||
|
Real operator()(int, int) const;
|
||
|
Real& element(int, int);
|
||
|
Real element(int, int) const;
|
||
|
#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
|
||
|
NEW_DELETE(LowerBandMatrix)
|
||
|
};
|
||
|
|
||
|
class SymmetricBandMatrix : public GeneralMatrix
|
||
|
{
|
||
|
GeneralMatrix* Image() const; // copy of matrix
|
||
|
void CornerClear() const; // set unused elements to zero
|
||
|
short SimpleAddOK(const GeneralMatrix* gm);
|
||
|
public:
|
||
|
int lower; // lower band width
|
||
|
SymmetricBandMatrix() { lower=0; CornerClear(); }
|
||
|
~SymmetricBandMatrix() {}
|
||
|
SymmetricBandMatrix(int n, int lb) { ReSize(n,lb); CornerClear(); }
|
||
|
SymmetricBandMatrix(const BaseMatrix&);
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator=(Real f) { GeneralMatrix::operator=(f); }
|
||
|
void operator=(const SymmetricBandMatrix& m)
|
||
|
{ operator=((const BaseMatrix&)m); }
|
||
|
Real& operator()(int, int); // access element
|
||
|
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);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(NegatedMatrix)
|
||
|
};
|
||
|
|
||
|
class TransposedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
TransposedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~TransposedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(TransposedMatrix)
|
||
|
};
|
||
|
|
||
|
class ReversedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
ReversedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~ReversedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
NEW_DELETE(ReversedMatrix)
|
||
|
};
|
||
|
|
||
|
class InvertedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
InvertedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
public:
|
||
|
~InvertedMatrix() {}
|
||
|
#ifndef TEMPS_DESTROYED_QUICKLY
|
||
|
SolvedMatrix operator*(const BaseMatrix&) const; // inverse(A) * B
|
||
|
ScaledMatrix operator*(Real t) const { return BaseMatrix::operator*(t); }
|
||
|
#else
|
||
|
SolvedMatrix& operator*(const BaseMatrix&); // inverse(A) * B
|
||
|
ScaledMatrix& operator*(Real t) const { return BaseMatrix::operator*(t); }
|
||
|
#endif
|
||
|
friend class BaseMatrix;
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(InvertedMatrix)
|
||
|
};
|
||
|
|
||
|
class RowedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
RowedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~RowedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(RowedMatrix)
|
||
|
};
|
||
|
|
||
|
class ColedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
ColedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~ColedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(ColedMatrix)
|
||
|
};
|
||
|
|
||
|
class DiagedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
DiagedMatrix(const BaseMatrix* bmx) : NegatedMatrix(bmx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~DiagedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(DiagedMatrix)
|
||
|
};
|
||
|
|
||
|
class MatedMatrix : public NegatedMatrix
|
||
|
{
|
||
|
int nr, nc;
|
||
|
MatedMatrix(const BaseMatrix* bmx, int nrx, int ncx)
|
||
|
: NegatedMatrix(bmx), nr(nrx), nc(ncx) {}
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
~MatedMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(MatedMatrix)
|
||
|
};
|
||
|
|
||
|
class ReturnMatrixX : public BaseMatrix // for matrix return
|
||
|
{
|
||
|
GeneralMatrix* gm;
|
||
|
int search(const BaseMatrix*) const;
|
||
|
public:
|
||
|
~ReturnMatrixX() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
friend class BaseMatrix;
|
||
|
#ifdef TEMPS_DESTROYED_QUICKLY_R
|
||
|
ReturnMatrixX(const ReturnMatrixX& tm);
|
||
|
#else
|
||
|
ReturnMatrixX(const ReturnMatrixX& tm) : gm(tm.gm) {}
|
||
|
#endif
|
||
|
ReturnMatrixX(const GeneralMatrix* gmx) : gm((GeneralMatrix*&)gmx) {}
|
||
|
// ReturnMatrixX(GeneralMatrix&);
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(ReturnMatrixX)
|
||
|
};
|
||
|
|
||
|
|
||
|
// ************************** submatrices ******************************/
|
||
|
|
||
|
class GetSubMatrix : public NegatedMatrix
|
||
|
{
|
||
|
int row_skip;
|
||
|
int row_number;
|
||
|
int col_skip;
|
||
|
int col_number;
|
||
|
bool IsSym;
|
||
|
|
||
|
GetSubMatrix
|
||
|
(const BaseMatrix* bmx, int rs, int rn, int cs, int cn, bool is)
|
||
|
: NegatedMatrix(bmx),
|
||
|
row_skip(rs), row_number(rn), col_skip(cs), col_number(cn), IsSym(is) {}
|
||
|
void SetUpLHS();
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
GetSubMatrix(const GetSubMatrix& g)
|
||
|
: NegatedMatrix(g.bm), row_skip(g.row_skip), row_number(g.row_number),
|
||
|
col_skip(g.col_skip), col_number(g.col_number), IsSym(g.IsSym) {}
|
||
|
~GetSubMatrix() {}
|
||
|
GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
|
||
|
void operator=(const BaseMatrix&);
|
||
|
void operator+=(const BaseMatrix&);
|
||
|
void operator-=(const BaseMatrix&);
|
||
|
void operator=(const GetSubMatrix& m) { operator=((const BaseMatrix&)m); }
|
||
|
void operator<<(const BaseMatrix&);
|
||
|
void operator<<(const Real*); // copy from array
|
||
|
MatrixInput operator<<(Real); // for loading a list
|
||
|
MatrixInput operator<<(int f);
|
||
|
void operator=(Real); // copy from constant
|
||
|
void operator+=(Real); // add constant
|
||
|
void operator-=(Real r) { operator+=(-r); } // subtract constant
|
||
|
void operator*=(Real); // multiply by constant
|
||
|
void operator/=(Real r) { operator*=(1.0/r); } // divide by constant
|
||
|
void Inject(const GeneralMatrix&); // copy stored els only
|
||
|
MatrixBandWidth BandWidth() const;
|
||
|
NEW_DELETE(GetSubMatrix)
|
||
|
};
|
||
|
|
||
|
// ******************** linear equation solving ****************************/
|
||
|
|
||
|
class LinearEquationSolver : public BaseMatrix
|
||
|
{
|
||
|
GeneralMatrix* gm;
|
||
|
int search(const BaseMatrix*) const { return 0; }
|
||
|
friend class BaseMatrix;
|
||
|
public:
|
||
|
LinearEquationSolver(const BaseMatrix& bm);
|
||
|
~LinearEquationSolver() { delete gm; }
|
||
|
void CleanUp() { delete gm; }
|
||
|
GeneralMatrix* Evaluate(MatrixType) { return gm; }
|
||
|
// probably should have an error message if MatrixType != UnSp
|
||
|
NEW_DELETE(LinearEquationSolver)
|
||
|
};
|
||
|
|
||
|
// ************************** matrix input *******************************/
|
||
|
|
||
|
class MatrixInput // for reading a list of values into a matrix
|
||
|
// the difficult part is detecting a mismatch
|
||
|
// in the number of elements
|
||
|
{
|
||
|
int n; // number values still to be read
|
||
|
Real* r; // pointer to next location to be read to
|
||
|
public:
|
||
|
MatrixInput(const MatrixInput& mi) : n(mi.n), r(mi.r) {}
|
||
|
MatrixInput(int nx, Real* rx) : n(nx), r(rx) {}
|
||
|
~MatrixInput();
|
||
|
MatrixInput operator<<(Real);
|
||
|
MatrixInput operator<<(int f);
|
||
|
friend class GeneralMatrix;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
// **************** a very simple integer array class ********************/
|
||
|
|
||
|
// A minimal array class to imitate a C style array but giving dynamic storage
|
||
|
// mostly intended for internal use by newmat
|
||
|
|
||
|
class SimpleIntArray : public Janitor
|
||
|
{
|
||
|
protected:
|
||
|
int* a; // pointer to the array
|
||
|
int n; // length of the array
|
||
|
public:
|
||
|
SimpleIntArray(int xn); // build an array length xn
|
||
|
~SimpleIntArray(); // return the space to memory
|
||
|
int& operator[](int i); // access element of the array - start at 0
|
||
|
int operator[](int i) const;
|
||
|
// access element of constant array
|
||
|
void operator=(int ai); // set the array equal to a constant
|
||
|
void operator=(const SimpleIntArray& b);
|
||
|
// copy the elements of an array
|
||
|
SimpleIntArray(const SimpleIntArray& b);
|
||
|
// make a new array equal to an existing one
|
||
|
int Size() const { return n; }
|
||
|
// return the size of the array
|
||
|
int* Data() { return a; } // pointer to the data
|
||
|
const int* Data() const { return a; }
|
||
|
// pointer to the data
|
||
|
void ReSize(int i, bool keep = false);
|
||
|
// change length, keep data if keep = true
|
||
|
void CleanUp() { ReSize(0); }
|
||
|
NEW_DELETE(SimpleIntArray)
|
||
|
};
|
||
|
|
||
|
// *************************** exceptions ********************************/
|
||
|
|
||
|
class NPDException : public Runtime_error // Not positive definite
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
NPDException(const GeneralMatrix&);
|
||
|
};
|
||
|
|
||
|
class ConvergenceException : public Runtime_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
ConvergenceException(const GeneralMatrix& A);
|
||
|
ConvergenceException(const char* c);
|
||
|
};
|
||
|
|
||
|
class SingularException : public Runtime_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
SingularException(const GeneralMatrix& A);
|
||
|
};
|
||
|
|
||
|
class OverflowException : public Runtime_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
OverflowException(const char* c);
|
||
|
};
|
||
|
|
||
|
class ProgramException : public Logic_error
|
||
|
{
|
||
|
protected:
|
||
|
ProgramException();
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
ProgramException(const char* c);
|
||
|
ProgramException(const char* c, const GeneralMatrix&);
|
||
|
ProgramException(const char* c, const GeneralMatrix&, const GeneralMatrix&);
|
||
|
ProgramException(const char* c, MatrixType, MatrixType);
|
||
|
};
|
||
|
|
||
|
class IndexException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
IndexException(int i, const GeneralMatrix& A);
|
||
|
IndexException(int i, int j, const GeneralMatrix& A);
|
||
|
// next two are for access via element function
|
||
|
IndexException(int i, const GeneralMatrix& A, bool);
|
||
|
IndexException(int i, int j, const GeneralMatrix& A, bool);
|
||
|
};
|
||
|
|
||
|
class VectorException : public Logic_error // cannot convert to vector
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
VectorException();
|
||
|
VectorException(const GeneralMatrix& A);
|
||
|
};
|
||
|
|
||
|
class NotSquareException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
NotSquareException(const GeneralMatrix& A);
|
||
|
};
|
||
|
|
||
|
class SubMatrixDimensionException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
SubMatrixDimensionException();
|
||
|
};
|
||
|
|
||
|
class IncompatibleDimensionsException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
IncompatibleDimensionsException();
|
||
|
IncompatibleDimensionsException(const GeneralMatrix&, const GeneralMatrix&);
|
||
|
};
|
||
|
|
||
|
class NotDefinedException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
NotDefinedException(const char* op, const char* matrix);
|
||
|
};
|
||
|
|
||
|
class CannotBuildException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
CannotBuildException(const char* matrix);
|
||
|
};
|
||
|
|
||
|
|
||
|
class InternalException : public Logic_error
|
||
|
{
|
||
|
public:
|
||
|
static unsigned long Select; // for identifying exception
|
||
|
InternalException(const char* c);
|
||
|
};
|
||
|
|
||
|
// ************************ functions ************************************ //
|
||
|
|
||
|
bool operator==(const GeneralMatrix& A, const GeneralMatrix& B);
|
||
|
bool operator==(const BaseMatrix& A, const BaseMatrix& B);
|
||
|
inline bool operator!=(const GeneralMatrix& A, const GeneralMatrix& B)
|
||
|
{ return ! (A==B); }
|
||
|
inline bool operator!=(const BaseMatrix& A, const BaseMatrix& B)
|
||
|
{ return ! (A==B); }
|
||
|
|
||
|
// inequality operators are dummies included for compatibility
|
||
|
// with STL. They throw an exception if actually called.
|
||
|
inline bool operator<=(const BaseMatrix& A, const BaseMatrix&)
|
||
|
{ A.IEQND(); return true; }
|
||
|
inline bool operator>=(const BaseMatrix& A, const BaseMatrix&)
|
||
|
{ A.IEQND(); return true; }
|
||
|
inline bool operator<(const BaseMatrix& A, const BaseMatrix&)
|
||
|
{ A.IEQND(); return true; }
|
||
|
inline bool operator>(const BaseMatrix& A, const BaseMatrix&)
|
||
|
{ A.IEQND(); return true; }
|
||
|
|
||
|
bool IsZero(const BaseMatrix& A);
|
||
|
|
||
|
|
||
|
// *********************** friend functions ****************************** //
|
||
|
|
||
|
bool Rectangular(MatrixType a, MatrixType b, MatrixType c);
|
||
|
bool Compare(const MatrixType&, MatrixType&);
|
||
|
Real DotProduct(const Matrix& A, const Matrix& B);
|
||
|
#ifndef TEMPS_DESTROYED_QUICKLY
|
||
|
SPMatrix SP(const BaseMatrix&, const BaseMatrix&);
|
||
|
KPMatrix KP(const BaseMatrix&, const BaseMatrix&);
|
||
|
ShiftedMatrix operator+(Real f, const BaseMatrix& BM);
|
||
|
NegShiftedMatrix operator-(Real, const BaseMatrix&);
|
||
|
ScaledMatrix operator*(Real f, const BaseMatrix& BM);
|
||
|
#else
|
||
|
SPMatrix& SP(const BaseMatrix&, const BaseMatrix&);
|
||
|
KPMatrix& KP(const BaseMatrix&, const BaseMatrix&);
|
||
|
NegShiftedMatrix& operator-(Real, const BaseMatrix&);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
// ********************* inline functions ******************************** //
|
||
|
|
||
|
inline LogAndSign LogDeterminant(const BaseMatrix& B)
|
||
|
{ return B.LogDeterminant(); }
|
||
|
inline Real Determinant(const BaseMatrix& B)
|
||
|
{ return B.Determinant(); }
|
||
|
inline Real SumSquare(const BaseMatrix& B) { return B.SumSquare(); }
|
||
|
inline Real NormFrobenius(const BaseMatrix& B) { return B.NormFrobenius(); }
|
||
|
inline Real Trace(const BaseMatrix& B) { return B.Trace(); }
|
||
|
inline Real SumAbsoluteValue(const BaseMatrix& B)
|
||
|
{ return B.SumAbsoluteValue(); }
|
||
|
inline Real Sum(const BaseMatrix& B)
|
||
|
{ return B.Sum(); }
|
||
|
inline Real MaximumAbsoluteValue(const BaseMatrix& B)
|
||
|
{ return B.MaximumAbsoluteValue(); }
|
||
|
inline Real MinimumAbsoluteValue(const BaseMatrix& B)
|
||
|
{ return B.MinimumAbsoluteValue(); }
|
||
|
inline Real Maximum(const BaseMatrix& B) { return B.Maximum(); }
|
||
|
inline Real Minimum(const BaseMatrix& B) { return B.Minimum(); }
|
||
|
inline Real Norm1(const BaseMatrix& B) { return B.Norm1(); }
|
||
|
inline Real Norm1(RowVector& RV) { return RV.MaximumAbsoluteValue(); }
|
||
|
inline Real NormInfinity(const BaseMatrix& B) { return B.NormInfinity(); }
|
||
|
inline Real NormInfinity(ColumnVector& CV)
|
||
|
{ return CV.MaximumAbsoluteValue(); }
|
||
|
inline bool IsZero(const GeneralMatrix& A) { return A.IsZero(); }
|
||
|
|
||
|
#ifdef TEMPS_DESTROYED_QUICKLY
|
||
|
inline ShiftedMatrix& operator+(Real f, const BaseMatrix& BM)
|
||
|
{ return BM + f; }
|
||
|
inline ScaledMatrix& operator*(Real f, const BaseMatrix& BM)
|
||
|
{ return BM * f; }
|
||
|
#endif
|
||
|
|
||
|
// these are moved out of the class definitions because of a problem
|
||
|
// with the Intel 8.1 compiler
|
||
|
#ifndef TEMPS_DESTROYED_QUICKLY
|
||
|
inline ShiftedMatrix operator+(Real f, const BaseMatrix& BM)
|
||
|
{ return ShiftedMatrix(&BM, f); }
|
||
|
inline ScaledMatrix operator*(Real f, const BaseMatrix& BM)
|
||
|
{ return ScaledMatrix(&BM, f); }
|
||
|
#endif
|
||
|
|
||
|
|
||
|
inline MatrixInput MatrixInput::operator<<(int f) { return *this << (Real)f; }
|
||
|
inline MatrixInput GeneralMatrix::operator<<(int f) { return *this << (Real)f; }
|
||
|
inline MatrixInput BandMatrix::operator<<(int f) { return *this << (Real)f; }
|
||
|
inline MatrixInput GetSubMatrix::operator<<(int f) { return *this << (Real)f; }
|
||
|
|
||
|
|
||
|
|
||
|
#ifdef use_namespace
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// body file: newmat1.cpp
|
||
|
// body file: newmat2.cpp
|
||
|
// body file: newmat3.cpp
|
||
|
// body file: newmat4.cpp
|
||
|
// body file: newmat5.cpp
|
||
|
// body file: newmat6.cpp
|
||
|
// body file: newmat7.cpp
|
||
|
// body file: newmat8.cpp
|
||
|
// body file: newmatex.cpp
|
||
|
// body file: bandmat.cpp
|
||
|
// body file: submat.cpp
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|