home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
misc
/
volume26
/
newmat04
/
part02
/
newmatrc.hxx
< prev
next >
Wrap
Text File
|
1991-11-30
|
5KB
|
110 lines
//$$ newmatrc.hxx definition file for row/column classes
// Copyright (C) 1991: R B Davies and DSIR
#ifndef MATRIXRC_LIB
#define MATRIXRC_LIB 0
#include "controlw.hxx"
/************** classes MatrixRowCol, MatrixRow, MatrixCol *****************/
// Used for accessing the rows and columns of matrices
// All matrix classes must provide routines for calculating matrix rows and
// columns. Assume rows can be found very efficiently.
enum { LoadOnEntry=1,StoreOnExit=2,IsACopy=4,DirectPart=8,StoreHere=16 };
class MatrixRowCol
// the row or column of a matrix
{
public: // these are public to avoid
// numerous friend statements
int length; // row or column length
int skip; // initial number of zeros
int storage; // number of stored elements
int rowcol; // row or column number
GeneralMatrix* gm; // pointer to parent matrix
real* store; // pointer to local storage
// less skip
ControlWord cw; // Load? Store? Is a Copy?
void IncrMat() { rowcol++; store += storage; }
// used by NextRow
void IncrDiag() { rowcol++; skip++; }
void IncrUT() { rowcol++; storage--; store += storage; skip++; }
void IncrLT() { rowcol++; store += storage; storage++; }
public:
void Add(const MatrixRowCol&); // add a row/col
void AddScaled(const MatrixRowCol&, real); // add a multiple of a row/col
void Add(const MatrixRowCol&, const MatrixRowCol&);
// add two rows/cols
void Add(const MatrixRowCol&, real); // add a row/col
void Sub(const MatrixRowCol&); // subtract a row/col
void Sub(const MatrixRowCol&, const MatrixRowCol&);
// sub a row/col from another
void RevSub(const MatrixRowCol&); // subtract from a row/col
void Copy(const MatrixRowCol&); // copy a row/col
void Copy(const real*&); // copy from an array
void Copy(real); // copy from constant
real SumAbsoluteValue(); // sum of absolute values
void Inject(const MatrixRowCol&); // copy stored els of a row/col
void Negate(const MatrixRowCol&); // change sign of a row/col
void Multiply(const MatrixRowCol&, real); // scale a row/col
friend real DotProd(const MatrixRowCol&, const MatrixRowCol&);
// sum of pairwise product
real* operator()() { return store+skip; } // pointer to first element
real* Store() { return store; }
int Skip() { return skip; } // number of elements skipped
int Storage() { return storage; } // number of elements stored
void Skip(int i) { skip=i; }
void Storage(int i) { storage=i; }
void SubRowCol(MatrixRowCol&, int, int) const;
// get part of a row or column
MatrixRowCol() {} // to stop warning messages
virtual ~MatrixRowCol();
};
class MatrixRow : public MatrixRowCol
{
public:
// bodies for these are inline at the end of this hxx file
MatrixRow(GeneralMatrix*, ControlWord, int=0);
// extract a row
~MatrixRow();
void Next(); // get next row
};
class MatrixCol : public MatrixRowCol
{
public:
// bodies for these are inline at the end of this hxx file
MatrixCol(GeneralMatrix*, ControlWord, int=0);
// extract a col
MatrixCol(GeneralMatrix*, real*, ControlWord, int=0);
// store/retrieve a col
~MatrixCol();
void Next(); // get next row
};
/**************************** inline bodies ****************************/
inline MatrixRow::MatrixRow(GeneralMatrix* gmx, ControlWord cwx, int row)
{ gm=gmx; cw=cwx; rowcol=row; gm->GetRow(*this); }
inline void MatrixRow::Next() { gm->NextRow(*this); }
inline MatrixCol::MatrixCol(GeneralMatrix* gmx, ControlWord cwx, int col)
{ gm=gmx; cw=cwx; rowcol=col; gm->GetCol(*this); }
inline MatrixCol::MatrixCol(GeneralMatrix* gmx, real* r,
ControlWord cwx, int col)
{ gm=gmx; store=r; cw=cwx+StoreHere; rowcol=col; gm->GetCol(*this); }
inline void MatrixCol::Next() { gm->NextCol(*this); }
#endif