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