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(Real);
00076 void Add(Real);
00077 void Multiply(Real);
00078 Real SumAbsoluteValue();
00079 Real MaximumAbsoluteValue1(Real r, int& i);
00080 Real MinimumAbsoluteValue1(Real r, int& i);
00081 Real Maximum1(Real r, int& i);
00082 Real Minimum1(Real r, int& i);
00083 Real Sum();
00084 void Inject(const MatrixRowCol&);
00085 void Negate(const MatrixRowCol&);
00086 void Multiply(const MatrixRowCol&, Real);
00087 friend Real DotProd(const MatrixRowCol&, const MatrixRowCol&);
00088
00089 Real* Data() { return data; }
00090 int Skip() { return skip; }
00091 int Storage() { return storage; }
00092 int Length() { return length; }
00093 void Skip(int i) { skip=i; }
00094 void Storage(int i) { storage=i; }
00095 void Length(int i) { length=i; }
00096 void SubRowCol(MatrixRowCol&, int, int) const;
00097
00098 MatrixRowCol() {}
00099 ~MatrixRowCol();
00100 FREE_CHECK(MatrixRowCol)
00101 };
00102
00103 class MatrixRow : public MatrixRowCol
00104 {
00105 public:
00106
00107 MatrixRow(GeneralMatrix*, LoadAndStoreFlag, int=0);
00108
00109 ~MatrixRow();
00110 void Next();
00111 FREE_CHECK(MatrixRow)
00112 };
00113
00114 class MatrixCol : public MatrixRowCol
00115 {
00116 public:
00117
00118 MatrixCol(GeneralMatrix*, LoadAndStoreFlag, int=0);
00119
00120 MatrixCol(GeneralMatrix*, Real*, LoadAndStoreFlag, int=0);
00121
00122 ~MatrixCol();
00123 void Next();
00124 FREE_CHECK(MatrixCol)
00125 };
00126
00127
00128
00129
00130 class MatrixColX : public MatrixRowCol
00131 {
00132 public:
00133
00134 MatrixColX(GeneralMatrix*, Real*, LoadAndStoreFlag, int=0);
00135
00136 ~MatrixColX();
00137 void Next();
00138 Real* store;
00139
00140 FREE_CHECK(MatrixColX)
00141 };
00142
00143
00144
00145 inline MatrixRow::MatrixRow(GeneralMatrix* gmx, LoadAndStoreFlag cwx, int row)
00146 { gm=gmx; cw=cwx; rowcol=row; gm->GetRow(*this); }
00147
00148 inline void MatrixRow::Next() { gm->NextRow(*this); }
00149
00150 inline MatrixCol::MatrixCol(GeneralMatrix* gmx, LoadAndStoreFlag cwx, int col)
00151 { gm=gmx; cw=cwx; rowcol=col; gm->GetCol(*this); }
00152
00153 inline MatrixCol::MatrixCol(GeneralMatrix* gmx, Real* r,
00154 LoadAndStoreFlag cwx, int col)
00155 { gm=gmx; data=r; cw=cwx+StoreHere; rowcol=col; gm->GetCol(*this); }
00156
00157 inline MatrixColX::MatrixColX(GeneralMatrix* gmx, Real* r,
00158 LoadAndStoreFlag cwx, int col)
00159 { gm=gmx; store=data=r; cw=cwx+StoreHere; rowcol=col; gm->GetCol(*this); }
00160
00161
00162 inline void MatrixCol::Next() { gm->NextCol(*this); }
00163
00164 inline void MatrixColX::Next() { gm->NextCol(*this); }
00165
00166 #ifdef use_namespace
00167 }
00168 #endif
00169
00170 #endif