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