newmatrc.h
Go to the documentation of this file.00001
00002
00003
00004
00005 #ifndef NEWMATRC_LIB
00006 #define NEWMATRC_LIB 0
00007
00008 #ifdef use_namespace
00009 namespace NEWMAT {
00010 #endif
00011
00012 #include "controlw.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021 enum LSF { LoadOnEntry=1,StoreOnExit=2,DirectPart=4,StoreHere=8,HaveStore=16 };
00022
00023
00024 class LoadAndStoreFlag : public ControlWord
00025 {
00026 public:
00027 LoadAndStoreFlag() {}
00028 LoadAndStoreFlag(int i) : ControlWord(i) {}
00029 LoadAndStoreFlag(LSF lsf) : ControlWord(lsf) {}
00030 LoadAndStoreFlag(const ControlWord& cwx) : ControlWord(cwx) {}
00031 };
00032
00033 class MatrixRowCol
00034
00035 {
00036 public:
00037
00038 int length;
00039 int skip;
00040 int storage;
00041 int rowcol;
00042 GeneralMatrix* gm;
00043 Real* data;
00044 LoadAndStoreFlag cw;
00045 void IncrMat() { rowcol++; data += storage; }
00046 void IncrDiag() { rowcol++; skip++; data++; }
00047 void IncrId() { rowcol++; skip++; }
00048 void IncrUT() { rowcol++; data += storage; storage--; skip++; }
00049 void IncrLT() { rowcol++; data += storage; storage++; }
00050
00051 public:
00052 void Zero();
00053 void Add(const MatrixRowCol&);
00054 void AddScaled(const MatrixRowCol&, Real);
00055 void Add(const MatrixRowCol&, const MatrixRowCol&);
00056
00057 void Add(const MatrixRowCol&, Real);
00058 void NegAdd(const MatrixRowCol&, Real);
00059 void Sub(const MatrixRowCol&);
00060 void Sub(const MatrixRowCol&, const MatrixRowCol&);
00061
00062 void RevSub(const MatrixRowCol&);
00063 void ConCat(const MatrixRowCol&, const MatrixRowCol&);
00064
00065 void Multiply(const MatrixRowCol&);
00066 void Multiply(const MatrixRowCol&, const MatrixRowCol&);
00067
00068 void KP(const MatrixRowCol&, const MatrixRowCol&);
00069
00070 void Copy(const MatrixRowCol&);
00071 void CopyCheck(const MatrixRowCol&);
00072 void Check(const MatrixRowCol&);
00073 void Check();
00074 void Copy(const Real*&);
00075 void Copy(const int*&);
00076 void Copy(Real);
00077 void Add(Real);
00078 void Multiply(Real);
00079 Real SumAbsoluteValue();
00080 Real MaximumAbsoluteValue1(Real r, int& i);
00081 Real MinimumAbsoluteValue1(Real r, int& i);
00082 Real Maximum1(Real r, int& i);
00083 Real Minimum1(Real r, int& i);
00084 Real Sum();
00085 void Inject(const MatrixRowCol&);
00086 void Negate(const MatrixRowCol&);
00087 void Multiply(const MatrixRowCol&, Real);
00088 friend Real DotProd(const MatrixRowCol&, const MatrixRowCol&);
00089
00090 Real* Data() { return data; }
00091 int Skip() { return skip; }
00092 int Storage() { return storage; }
00093 int Length() { return length; }
00094 void Skip(int i) { skip=i; }
00095 void Storage(int i) { storage=i; }
00096 void Length(int i) { length=i; }
00097 void SubRowCol(MatrixRowCol&, int, int) const;
00098
00099 MatrixRowCol() {}
00100 ~MatrixRowCol();
00101 FREE_CHECK(MatrixRowCol)
00102 };
00103
00104 class MatrixRow : public MatrixRowCol
00105 {
00106 public:
00107
00108 MatrixRow(GeneralMatrix*, LoadAndStoreFlag, int=0);
00109
00110 ~MatrixRow();
00111 void Next();
00112 FREE_CHECK(MatrixRow)
00113 };
00114
00115 class MatrixCol : public MatrixRowCol
00116 {
00117 public:
00118
00119 MatrixCol(GeneralMatrix*, LoadAndStoreFlag, int=0);
00120
00121 MatrixCol(GeneralMatrix*, Real*, LoadAndStoreFlag, int=0);
00122
00123 ~MatrixCol();
00124 void Next();
00125 FREE_CHECK(MatrixCol)
00126 };
00127
00128
00129
00130
00131 class MatrixColX : public MatrixRowCol
00132 {
00133 public:
00134
00135 MatrixColX(GeneralMatrix*, Real*, LoadAndStoreFlag, int=0);
00136
00137 ~MatrixColX();
00138 void Next();
00139 Real* store;
00140
00141 FREE_CHECK(MatrixColX)
00142 };
00143
00144
00145
00146 inline MatrixRow::MatrixRow(GeneralMatrix* gmx, LoadAndStoreFlag cwx, int row)
00147 { gm=gmx; cw=cwx; rowcol=row; gm->GetRow(*this); }
00148
00149 inline void MatrixRow::Next() { gm->NextRow(*this); }
00150
00151 inline MatrixCol::MatrixCol(GeneralMatrix* gmx, LoadAndStoreFlag cwx, int col)
00152 { gm=gmx; cw=cwx; rowcol=col; gm->GetCol(*this); }
00153
00154 inline MatrixCol::MatrixCol(GeneralMatrix* gmx, Real* r,
00155 LoadAndStoreFlag cwx, int col)
00156 { gm=gmx; data=r; cw=cwx+StoreHere; rowcol=col; gm->GetCol(*this); }
00157
00158 inline MatrixColX::MatrixColX(GeneralMatrix* gmx, Real* r,
00159 LoadAndStoreFlag cwx, int col)
00160 { gm=gmx; store=data=r; cw=cwx+StoreHere; rowcol=col; gm->GetCol(*this); }
00161
00162
00163 inline void MatrixCol::Next() { gm->NextCol(*this); }
00164
00165 inline void MatrixColX::Next() { gm->NextCol(*this); }
00166
00167 #ifdef use_namespace
00168 }
00169 #endif
00170
00171 #endif