home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume26
/
newmat04
/
part02
/
newmat.hxx
< prev
next >
Wrap
Text File
|
1991-11-30
|
26KB
|
782 lines
//$$ newmat.hxx definition file for new version of matrix package
// Copyright (C) 1991: R B Davies and DSIR
#ifndef MATRIX_LIB
#define MATRIX_LIB 0
#ifdef NO_LONG_NAMES
#define UpperTriangularMatrix UTMatrix
#define LowerTriangularMatrix LTMatrix
#define SymmetricMatrix SMatrix
#define DiagonalMatrix DMatrix
#endif
#include "boolean.hxx"
/**************************** general utilities ****************************/
void MatrixError(char*); // error handler
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; }
void operator*=(real);
void ChangeSign() { sign = -sign; }
real LogValue() { return log_value; }
int Sign() { return sign; }
real Value();
};
// 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.
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
};
/**************************** 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 MatrixType
{
public:
enum Type { UnSp,UT,LT,Rect,Sym,Diag,RowV,ColV,EqEl,Crout };
static nTypes() { return 8; } // number of different types
// exclude Crout, UnSp
private:
Type type;
public:
MatrixType operator+(const MatrixType&) const;
MatrixType operator-(const MatrixType&) const;
MatrixType operator*(const MatrixType&) const;
BOOL operator>=(const MatrixType&) const;
BOOL operator==(const MatrixType& t) const; // { return (type == t.type); }
BOOL operator!=(const MatrixType& t) const; // { return !(*this == t); }
BOOL operator!() const { return type == UnSp; }
MatrixType operator-() const; // type of negative
MatrixType i() const; // type of inverse
MatrixType t() const; // type of transpose
MatrixType sub() const; // type of submatrix
MatrixType ssub() const; // type of sym submatrix
MatrixType (Type tx) : type(tx) {} // (& doesn't work with AT&T)
MatrixType () {}
GeneralMatrix* New() const; // new matrix of given type
GeneralMatrix* New(int,int) const; // new matrix of given type
operator int() const { return (int)type; }
operator char*() const; // for printing type
};
void TestTypeAdd(); // test +
void TestTypeMult(); // test *
void TestTypeOrder(); // test >=
/*************************** Matrix routines ***************************/
class MatrixRowCol; // defined later
class MatrixRow;
class MatrixCol;
class GeneralMatrix; // defined later
class AddedMatrix;
class MultipliedMatrix;
class SubtractedMatrix;
class SolvedMatrix;
class ShiftedMatrix;
class ScaledMatrix;
class TransposedMatrix;
class NegatedMatrix;
class InvertedMatrix;
class RowedMatrix;
class ColedMatrix;
class DiagedMatrix;
class MatedMatrix;
class GetSubMatrix;
class ConstMatrix;
class ReturnMatrix;
class Matrix;
class nricMatrix;
class RowVector;
class ColumnVector;
class SymmetricMatrix;
class UpperTriangularMatrix;
class LowerTriangularMatrix;
class DiagonalMatrix;
class CroutMatrix;
static MatrixType MatrixTypeUnSp(MatrixType::UnSp);
// AT&T needs this
class BaseMatrix // base of all matrix classes
{
protected:
// BaseMatrix() {}
virtual int search(const GeneralMatrix*) const = 0;
// count number of times matrix
// is referred to
virtual MatrixType Type() const = 0; // type of a matrix
virtual int NrowsV() const = 0;
virtual int NcolsV() const = 0;
public:
#ifndef GXX
virtual GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp) = 0;
// evaluate temporary
#else
virtual GeneralMatrix* Evaluate(MatrixType mt) = 0;
GeneralMatrix* Evaluate() { return Evaluate(MatrixTypeUnSp); }
#endif
void MatrixParameters(int& nr, int& nc, MatrixType& mt)
{ nr = NrowsV(); nc = NcolsV(); mt = Type(); }
AddedMatrix operator+(BaseMatrix&); // results of operations
MultipliedMatrix operator*(BaseMatrix&);
SubtractedMatrix operator-(BaseMatrix&);
ShiftedMatrix operator+(real);
ScaledMatrix operator*(real);
ScaledMatrix operator/(real);
ShiftedMatrix operator-(real);
TransposedMatrix t();
NegatedMatrix operator-(); // change sign of elements
InvertedMatrix i();
RowedMatrix CopyToRow();
ColedMatrix CopyToColumn();
DiagedMatrix CopyToDiagonal();
MatedMatrix CopyToMatrix(int,int);
GetSubMatrix SubMatrix(int,int,int,int);
GetSubMatrix SymSubMatrix(int,int);
GetSubMatrix Row(int);
GetSubMatrix Rows(int,int);
GetSubMatrix Column(int);
GetSubMatrix Columns(int,int);
operator real(); // conversion of 1 x 1 matrix
virtual LogAndSign LogDeterminant();
virtual real SumSquare();
virtual real SumAbsoluteValue();
virtual real MaximumAbsoluteValue();
virtual real Trace();
real Norm1();
real NormInfinity();
friend GeneralMatrix;
friend Matrix;
friend nricMatrix;
friend RowVector;
friend ColumnVector;
friend SymmetricMatrix;
friend UpperTriangularMatrix;
friend LowerTriangularMatrix;
friend DiagonalMatrix;
friend CroutMatrix;
friend AddedMatrix;
friend MultipliedMatrix;
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 ReturnMatrix;
};
/******************************* working classes **************************/
class GeneralMatrix : public BaseMatrix // declarable matrix types
{
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(int); // constructor getting store
void Add(GeneralMatrix*, real); // sum of GM and real
void Add(real); // add real to this
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 operator=(real); // set matrix to constant
real* GetStore(); // get store or copy
GeneralMatrix* BorrowStore(GeneralMatrix*, MatrixType);
// temporarily access store
void GetMatrix(GeneralMatrix*); // used by = and initialise
#ifndef __ZTC__
void GetMatrixC(const GeneralMatrix*); // used by = and initialise
#endif
void Eq(BaseMatrix&, MatrixType); // used by =
int search(const GeneralMatrix*) const;
virtual GeneralMatrix* Transpose(MatrixType);
void CheckConversion(const BaseMatrix&); // check conversion OK
void ReDimension(int, int, int); // change dimensions
int NrowsV() const; // get dimensions
int NcolsV() const; // virtual version
public:
GeneralMatrix* Evaluate(MatrixType);
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; } // can't 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<<(BaseMatrix& X) { Eq(X,this->Type()); }
// = without checking type
void Inject(const GeneralMatrix&); // copy stored els only
virtual GeneralMatrix* MakeSolver(); // for solving
virtual void Solver(MatrixRowCol&, const MatrixRowCol&) {}
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 RestoreCol(MatrixRowCol&) {} // Restore matrix col
virtual void NextCol(MatrixRowCol&); // Go to next col
real SumSquare();
real SumAbsoluteValue();
real MaximumAbsoluteValue();
LogAndSign LogDeterminant();
ConstMatrix c() const; // to access constant matrices
void CheckStore() const; // check store is non-zero
friend Matrix;
friend nricMatrix;
friend SymmetricMatrix;
friend UpperTriangularMatrix;
friend LowerTriangularMatrix;
friend DiagonalMatrix;
friend CroutMatrix;
friend RowVector;
friend ColumnVector;
friend BaseMatrix;
friend AddedMatrix;
friend MultipliedMatrix;
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 ReturnMatrix;
};
class Matrix : public GeneralMatrix // usual rectangular matrix
{
public:
Matrix() {}
Matrix(int, int); // standard declaration
Matrix(BaseMatrix&); // evaluate BaseMatrix
void operator=(BaseMatrix&);
void operator=(real f) { GeneralMatrix::operator=(f); }
MatrixType Type() const;
real& operator()(int, int); // access element
real& element(int, int); // access element
Matrix(Matrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int, int) const; // access element
Matrix(const Matrix& gm) { GetMatrixC(&gm); }
#endif
GeneralMatrix* MakeSolver();
real Trace();
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void NextCol(MatrixRowCol&);
void ReDimension(int,int); // change dimensions
};
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(BaseMatrix& bm) // evaluate BaseMatrix
: Matrix(bm) { MakeRowPointer(); }
void operator=(BaseMatrix& bm)
{ DeleteRowPointer(); Matrix::operator=(bm); MakeRowPointer(); }
void operator=(real f) { GeneralMatrix::operator=(f); }
void operator<<(BaseMatrix& X)
{ DeleteRowPointer(); Eq(X,this->Type()); MakeRowPointer(); }
nricMatrix(nricMatrix& gm) { GetMatrix(&gm); MakeRowPointer(); }
#ifndef __ZTC__
nricMatrix(const nricMatrix& gm) { GetMatrixC(&gm); MakeRowPointer(); }
#endif
void ReDimension(int m, int n) // change dimensions
{ DeleteRowPointer(); Matrix::ReDimension(m,n); MakeRowPointer(); }
~nricMatrix() { DeleteRowPointer(); }
#ifndef __ZTC__
operator real**() const { CheckStore(); return row_pointer-1; }
#endif
};
class SymmetricMatrix : public GeneralMatrix
{
public:
SymmetricMatrix() {}
SymmetricMatrix(int);
SymmetricMatrix(BaseMatrix&);
void operator=(BaseMatrix&);
void operator=(real f) { GeneralMatrix::operator=(f); }
real& operator()(int, int); // access element
real& element(int, int); // access element
MatrixType Type() const;
SymmetricMatrix(SymmetricMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int, int) const; // access element
SymmetricMatrix(const SymmetricMatrix& gm) { GetMatrixC(&gm); }
#endif
real SumSquare();
real SumAbsoluteValue();
real Trace();
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
GeneralMatrix* Transpose(MatrixType);
void ReDimension(int); // change dimensions
};
class UpperTriangularMatrix : public GeneralMatrix
{
public:
UpperTriangularMatrix() {}
UpperTriangularMatrix(int);
void operator=(BaseMatrix&);
UpperTriangularMatrix(BaseMatrix&);
UpperTriangularMatrix(UpperTriangularMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int, int) const; // access element
UpperTriangularMatrix(const UpperTriangularMatrix& gm) { GetMatrixC(&gm); }
#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();
real Trace();
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void ReDimension(int); // change dimensions
};
class LowerTriangularMatrix : public GeneralMatrix
{
public:
LowerTriangularMatrix() {}
LowerTriangularMatrix(int);
LowerTriangularMatrix(LowerTriangularMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int, int) const; // access element
LowerTriangularMatrix(const LowerTriangularMatrix& gm) { GetMatrixC(&gm); }
#endif
LowerTriangularMatrix(BaseMatrix& M);
void operator=(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();
real Trace();
void GetRow(MatrixRowCol&);
void GetCol(MatrixRowCol&);
void RestoreCol(MatrixRowCol&);
void NextRow(MatrixRowCol&);
void ReDimension(int); // change dimensions
};
class DiagonalMatrix : public GeneralMatrix
{
public:
DiagonalMatrix() {}
DiagonalMatrix(int);
DiagonalMatrix(BaseMatrix&);
DiagonalMatrix(DiagonalMatrix& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int, int) const; // access element
real operator()(int) const;
DiagonalMatrix(const DiagonalMatrix& gm) { GetMatrixC(&gm); }
#endif
void operator=(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();
real Trace();
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(MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
operator real*() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
};
class RowVector : public Matrix
{
public:
RowVector() {}
RowVector(int n) : Matrix(1,n) {}
RowVector(BaseMatrix&);
RowVector(RowVector& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int) const; // access element
RowVector(const RowVector& gm) {GetMatrixC(&gm); }
#endif
void operator=(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(MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
operator real*() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
};
class ColumnVector : public Matrix
{
public:
ColumnVector() {}
ColumnVector(int n) : Matrix(n,1) {}
ColumnVector(BaseMatrix&);
ColumnVector(ColumnVector& gm) { GetMatrix(&gm); }
#ifndef __ZTC__
real operator()(int) const; // access element
ColumnVector(const ColumnVector& gm) { GetMatrixC(&gm); }
#endif
void operator=(BaseMatrix&);
void operator=(real f) { GeneralMatrix::operator=(f); }
real& operator()(int); // access element
real& element(int); // access element
MatrixType Type() const;
GeneralMatrix* Transpose(MatrixType);
void ReDimension(int); // change dimensions
#ifndef __ZTC__
operator real*() const
{ CheckStore(); return store-1; } // for use by NRIC
#endif
};
class CroutMatrix : public GeneralMatrix // for LU decomposition
{
int* indx;
BOOL d;
void ludcmp();
public:
CroutMatrix(BaseMatrix&);
MatrixType Type() const;
void lubksb(real*, int=0);
~CroutMatrix() { delete [nrows] indx; }
GeneralMatrix* MakeSolver() { return this; } // for solving
LogAndSign LogDeterminant();
void Solver(MatrixRowCol&, const MatrixRowCol&);
void GetRow(MatrixRowCol&) { MatrixError("GetRow not defined for Crout"); }
void GetCol(MatrixRowCol&) { MatrixError("GetCol not defined for Crout"); }
void operator=(BaseMatrix&)
{ MatrixError("operator= not defined for Crout"); }
};
/***************************** temporary classes *************************/
class AddedMatrix : public BaseMatrix
{
protected:
BaseMatrix* bm1; // pointers to summands
BaseMatrix* bm2;
AddedMatrix(BaseMatrix* bm1x, BaseMatrix* bm2x) : bm1(bm1x),bm2(bm2x) {}
int search(const GeneralMatrix*) const;
int NrowsV() const;
int NcolsV() const;
private:
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class MultipliedMatrix : public AddedMatrix
{
MultipliedMatrix(BaseMatrix* bm1x, BaseMatrix* bm2x)
: AddedMatrix(bm1x,bm2x) {}
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class SolvedMatrix : public AddedMatrix
{
SolvedMatrix(BaseMatrix* bm1x, BaseMatrix* bm2x)
: AddedMatrix(bm1x,bm2x) {}
MatrixType Type() const;
friend BaseMatrix;
friend InvertedMatrix; // for operator*
public:
GeneralMatrix* Evaluate(MatrixType);
};
class SubtractedMatrix : public AddedMatrix
{
SubtractedMatrix(BaseMatrix* bm1x, BaseMatrix* bm2x)
: AddedMatrix(bm1x,bm2x) {}
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class ShiftedMatrix : public BaseMatrix
{
protected:
real f;
BaseMatrix* bm;
ShiftedMatrix(BaseMatrix* bmx, real fx) : bm(bmx),f(fx) {}
int search(const GeneralMatrix*) const;
int NrowsV() const;
int NcolsV() const;
private:
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class ScaledMatrix : public ShiftedMatrix
{
ScaledMatrix(BaseMatrix* bmx, real fx) : ShiftedMatrix(bmx,fx) {}
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class NegatedMatrix : public BaseMatrix
{
protected:
BaseMatrix* bm;
NegatedMatrix(BaseMatrix* bmx) : bm(bmx) {}
int search(const GeneralMatrix*) const;
int NrowsV() const;
int NcolsV() const;
private:
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class TransposedMatrix : public NegatedMatrix
{
TransposedMatrix(BaseMatrix* bmx) : NegatedMatrix(bmx) {}
int NrowsV() const;
int NcolsV() const;
MatrixType Type() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class InvertedMatrix : public NegatedMatrix
{
InvertedMatrix(BaseMatrix* bmx) : NegatedMatrix(bmx) {}
MatrixType Type() const;
public:
SolvedMatrix operator*(BaseMatrix&); // inverse(A) * B
friend BaseMatrix;
GeneralMatrix* Evaluate(MatrixType);
};
class RowedMatrix : public NegatedMatrix
{
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
RowedMatrix(BaseMatrix* bmx) : NegatedMatrix(bmx) {}
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class ColedMatrix : public NegatedMatrix
{
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
ColedMatrix(BaseMatrix* bmx) : NegatedMatrix(bmx) {}
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class DiagedMatrix : public NegatedMatrix
{
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
DiagedMatrix(BaseMatrix* bmx) : NegatedMatrix(bmx) {}
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class MatedMatrix : public NegatedMatrix
{
int nr, nc;
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
MatedMatrix(BaseMatrix* bmx, int nrx, int ncx)
: NegatedMatrix(bmx), nr(nrx), nc(ncx) {}
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class ConstMatrix : public BaseMatrix
{
const GeneralMatrix* cgm;
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
int search(const GeneralMatrix*) const;
ConstMatrix(const GeneralMatrix* cgmx) : cgm(cgmx) {}
friend BaseMatrix;
friend GeneralMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
};
class ReturnMatrix : public BaseMatrix // for matrix return
{
GeneralMatrix* gm;
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
int search(const GeneralMatrix*) const;
public:
GeneralMatrix* Evaluate(MatrixType);
friend BaseMatrix;
ReturnMatrix(const ReturnMatrix& tm) : gm(tm.gm) {}
ReturnMatrix(GeneralMatrix&);
};
/**************************** submatrices ******************************/
class GetSubMatrix : public NegatedMatrix
{
int row_skip;
int row_number;
int col_skip;
int col_number;
MatrixType mt;
GetSubMatrix
(BaseMatrix* bmx, int rs, int rn, int cs, int cn, MatrixType mtx)
: NegatedMatrix(bmx),
row_skip(rs), row_number(rn), col_skip(cs), col_number(cn), mt(mtx) {}
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), mt(g.mt) {}
MatrixType Type() const;
int NrowsV() const;
int NcolsV() const;
friend BaseMatrix;
public:
GeneralMatrix* Evaluate(MatrixType);
void operator=(BaseMatrix&)
{ MatrixError("= not defined for submatrix; use <<"); }
void operator<<(BaseMatrix&);
void operator<<(const real*); // copy from array
void operator<<(real); // copy from constant
void Inject(const GeneralMatrix&); // copy stored els only
};
/***************************** functions ***********************************/
inline LogAndSign LogDeterminant(BaseMatrix& B) { return B.LogDeterminant(); }
inline real SumSquare(BaseMatrix& B) { return B.SumSquare(); }
inline real Trace(BaseMatrix& B) { return B.Trace(); }
inline real SumAbsoluteValue(BaseMatrix& B) { return B.SumAbsoluteValue(); }
inline real MaximumAbsoluteValue(BaseMatrix& B)
{ return B.MaximumAbsoluteValue(); }
inline real Norm1(BaseMatrix& B) { return B.Norm1(); }
inline real Norm1(RowVector& RV) { return RV.MaximumAbsoluteValue(); }
inline real NormInfinity(BaseMatrix& B) { return B.NormInfinity(); }
inline real NormInfinity(ColumnVector& CV)
{ return CV.MaximumAbsoluteValue(); }
#endif