00001 #ifndef __NEW_MAT_BAND_MATRIX_H__
00002 #define __NEW_MAT_BAND_MATRIX_H__
00003
00004
00005
00007 class BandMatrix : public GeneralMatrix
00008 {
00009 GeneralMatrix* Image() const;
00010 protected:
00011 void CornerClear() const;
00012 short SimpleAddOK(const GeneralMatrix* gm);
00013 public:
00014 int lower_val, upper_val;
00015 BandMatrix() { lower_val=0; upper_val=0; CornerClear(); }
00016 ~BandMatrix() {}
00017 BandMatrix(int n,int lb,int ub) { resize(n,lb,ub); CornerClear(); }
00018
00019 BandMatrix(const BaseMatrix&);
00020 void operator=(const BaseMatrix&);
00021 void operator=(Real f) { GeneralMatrix::operator=(f); }
00022 void operator=(const BandMatrix& m) { Eq(m); }
00023 MatrixType type() const;
00024 Real& operator()(int, int);
00025 Real& element(int, int);
00026 Real operator()(int, int) const;
00027 Real element(int, int) const;
00028 #ifdef SETUP_C_SUBSCRIPTS
00029 Real* operator[](int m) { return store+(upper_val+lower_val)*m+lower_val; }
00030 const Real* operator[](int m) const
00031 { return store+(upper_val+lower_val)*m+lower_val; }
00032 #endif
00033 BandMatrix(const BandMatrix& gm) : GeneralMatrix() { GetMatrix(&gm); }
00034 LogAndSign log_determinant() const;
00035 GeneralMatrix* MakeSolver();
00036 Real trace() const;
00037 Real sum_square() const
00038 { CornerClear(); return GeneralMatrix::sum_square(); }
00039 Real sum_absolute_value() const
00040 { CornerClear(); return GeneralMatrix::sum_absolute_value(); }
00041 Real sum() const
00042 { CornerClear(); return GeneralMatrix::sum(); }
00043 Real maximum_absolute_value() const
00044 { CornerClear(); return GeneralMatrix::maximum_absolute_value(); }
00045 Real minimum_absolute_value() const
00046 { int i, j; return GeneralMatrix::minimum_absolute_value2(i, j); }
00047 Real maximum() const { int i, j; return GeneralMatrix::maximum2(i, j); }
00048 Real minimum() const { int i, j; return GeneralMatrix::minimum2(i, j); }
00049 void GetRow(MatrixRowCol&);
00050 void GetCol(MatrixRowCol&);
00051 void GetCol(MatrixColX&);
00052 void RestoreCol(MatrixRowCol&);
00053 void RestoreCol(MatrixColX& c) { RestoreCol((MatrixRowCol&)c); }
00054 void NextRow(MatrixRowCol&);
00055 virtual void resize(int, int, int);
00056 virtual void ReSize(int m, int n, int b) { resize(m, n, b); }
00057 void resize(const GeneralMatrix& A);
00058 void ReSize(const GeneralMatrix& A) { resize(A); }
00059
00060
00061
00062 MatrixBandWidth bandwidth() const;
00063 void SetParameters(const GeneralMatrix*);
00064 MatrixInput operator<<(double);
00065 MatrixInput operator<<(float);
00066 MatrixInput operator<<(int f);
00067 void operator<<(const double* r);
00068 void operator<<(const float* r);
00069 void operator<<(const int* r);
00070
00071
00072 void operator<<(const BaseMatrix& X) { GeneralMatrix::operator<<(X); }
00073 void swap(BandMatrix& gm);
00074 NEW_DELETE(BandMatrix)
00075 };
00076
00078 class UpperBandMatrix : public BandMatrix
00079 {
00080 GeneralMatrix* Image() const;
00081 public:
00082 UpperBandMatrix() {}
00083 ~UpperBandMatrix() {}
00084 UpperBandMatrix(int n, int ubw)
00085 : BandMatrix(n, 0, ubw) {}
00086 UpperBandMatrix(const BaseMatrix&);
00087 void operator=(const BaseMatrix&);
00088 void operator=(Real f) { GeneralMatrix::operator=(f); }
00089 void operator=(const UpperBandMatrix& m) { Eq(m); }
00090 MatrixType type() const;
00091 UpperBandMatrix(const UpperBandMatrix& gm) : BandMatrix() { GetMatrix(&gm); }
00092 GeneralMatrix* MakeSolver() { return this; }
00093 void Solver(MatrixColX&, const MatrixColX&);
00094 LogAndSign log_determinant() const;
00095 void resize(int, int, int);
00096 void ReSize(int m, int n, int b) { resize(m, n, b); }
00097 void resize(int n,int ubw)
00098 { BandMatrix::resize(n,0,ubw); }
00099 void ReSize(int n,int ubw)
00100 { BandMatrix::resize(n,0,ubw); }
00101 void resize(const GeneralMatrix& A) { BandMatrix::resize(A); }
00102 void ReSize(const GeneralMatrix& A) { BandMatrix::resize(A); }
00103 Real& operator()(int, int);
00104 Real operator()(int, int) const;
00105 Real& element(int, int);
00106 Real element(int, int) const;
00107 #ifdef SETUP_C_SUBSCRIPTS
00108 Real* operator[](int m) { return store+upper_val*m; }
00109 const Real* operator[](int m) const { return store+upper_val*m; }
00110 #endif
00111 void swap(UpperBandMatrix& gm)
00112 { BandMatrix::swap((BandMatrix&)gm); }
00113 NEW_DELETE(UpperBandMatrix)
00114 };
00115
00117 class LowerBandMatrix : public BandMatrix
00118 {
00119 GeneralMatrix* Image() const;
00120 public:
00121 LowerBandMatrix() {}
00122 ~LowerBandMatrix() {}
00123 LowerBandMatrix(int n, int lbw)
00124 : BandMatrix(n, lbw, 0) {}
00125 LowerBandMatrix(const BaseMatrix&);
00126 void operator=(const BaseMatrix&);
00127 void operator=(Real f) { GeneralMatrix::operator=(f); }
00128 void operator=(const LowerBandMatrix& m) { Eq(m); }
00129 MatrixType type() const;
00130 LowerBandMatrix(const LowerBandMatrix& gm) : BandMatrix() { GetMatrix(&gm); }
00131 GeneralMatrix* MakeSolver() { return this; }
00132 void Solver(MatrixColX&, const MatrixColX&);
00133 LogAndSign log_determinant() const;
00134 void resize(int, int, int);
00135 void ReSize(int m, int n, int b) { resize(m, n, b); }
00136 void resize(int n,int lbw)
00137 { BandMatrix::resize(n,lbw,0); }
00138 void ReSize(int n,int lbw)
00139 { BandMatrix::resize(n,lbw,0); }
00140 void resize(const GeneralMatrix& A) { BandMatrix::resize(A); }
00141 void ReSize(const GeneralMatrix& A) { BandMatrix::resize(A); }
00142 Real& operator()(int, int);
00143 Real operator()(int, int) const;
00144 Real& element(int, int);
00145 Real element(int, int) const;
00146 #ifdef SETUP_C_SUBSCRIPTS
00147 Real* operator[](int m) { return store+lower_val*(m+1); }
00148 const Real* operator[](int m) const { return store+lower_val*(m+1); }
00149 #endif
00150 void swap(LowerBandMatrix& gm)
00151 { BandMatrix::swap((BandMatrix&)gm); }
00152 NEW_DELETE(LowerBandMatrix)
00153 };
00154
00156 class SymmetricBandMatrix : public GeneralMatrix
00157 {
00158 GeneralMatrix* Image() const;
00159 void CornerClear() const;
00160 short SimpleAddOK(const GeneralMatrix* gm);
00161 public:
00162 int lower_val;
00163 SymmetricBandMatrix() { lower_val=0; CornerClear(); }
00164 ~SymmetricBandMatrix() {}
00165 SymmetricBandMatrix(int n, int lb) { resize(n,lb); CornerClear(); }
00166 SymmetricBandMatrix(const BaseMatrix&);
00167 void operator=(const BaseMatrix&);
00168 void operator=(Real f) { GeneralMatrix::operator=(f); }
00169 void operator=(const SymmetricBandMatrix& m) { Eq(m); }
00170 Real& operator()(int, int);
00171 Real& element(int, int);
00172 Real operator()(int, int) const;
00173 Real element(int, int) const;
00174 #ifdef SETUP_C_SUBSCRIPTS
00175 Real* operator[](int m) { return store+lower_val*(m+1); }
00176 const Real* operator[](int m) const { return store+lower_val*(m+1); }
00177 #endif
00178 MatrixType type() const;
00179 SymmetricBandMatrix(const SymmetricBandMatrix& gm)
00180 : GeneralMatrix() { GetMatrix(&gm); }
00181 GeneralMatrix* MakeSolver();
00182 Real sum_square() const;
00183 Real sum_absolute_value() const;
00184 Real sum() const;
00185 Real maximum_absolute_value() const
00186 { CornerClear(); return GeneralMatrix::maximum_absolute_value(); }
00187 Real minimum_absolute_value() const
00188 { int i, j; return GeneralMatrix::minimum_absolute_value2(i, j); }
00189 Real maximum() const { int i, j; return GeneralMatrix::maximum2(i, j); }
00190 Real minimum() const { int i, j; return GeneralMatrix::minimum2(i, j); }
00191 Real trace() const;
00192 LogAndSign log_determinant() const;
00193 void GetRow(MatrixRowCol&);
00194 void GetCol(MatrixRowCol&);
00195 void GetCol(MatrixColX&);
00196 void RestoreCol(MatrixRowCol&) {}
00197 void RestoreCol(MatrixColX&);
00198 GeneralMatrix* Transpose(TransposedMatrix*, MatrixType);
00199 void resize(int,int);
00200 void ReSize(int m,int b) { resize(m, b); }
00201 void resize(const GeneralMatrix& A);
00202 void ReSize(const GeneralMatrix& A) { resize(A); }
00203
00204
00205
00206 MatrixBandWidth bandwidth() const;
00207 void SetParameters(const GeneralMatrix*);
00208 void operator<<(const double* r);
00209 void operator<<(const float* r);
00210 void operator<<(const int* r);
00211 void operator<<(const BaseMatrix& X) { GeneralMatrix::operator<<(X); }
00212 void swap(SymmetricBandMatrix& gm);
00213 NEW_DELETE(SymmetricBandMatrix)
00214 };
00215
00217 class BandLUMatrix : public GeneralMatrix
00218 {
00219 int* indx;
00220 bool d;
00221 bool sing;
00222 Real* store2;
00223 int storage2;
00224 int m1,m2;
00225 void ludcmp();
00226 void get_aux(BandLUMatrix&);
00227 GeneralMatrix* Image() const;
00228 public:
00229 BandLUMatrix(const BaseMatrix&);
00230 BandLUMatrix()
00231 : indx(0), d(true), sing(true), store2(0), storage2(0), m1(0), m2(0) {}
00232 BandLUMatrix(const BandLUMatrix&);
00233 void operator=(const BandLUMatrix&);
00234 GeneralMatrix* Evaluate(MatrixType mt=MatrixTypeUnSp);
00235 MatrixType type() const;
00236 void lubksb(Real*, int=0);
00237 ~BandLUMatrix();
00238 GeneralMatrix* MakeSolver() { return this; }
00239 LogAndSign log_determinant() const;
00240 void Solver(MatrixColX&, const MatrixColX&);
00241 void GetRow(MatrixRowCol&);
00242 void GetCol(MatrixRowCol&);
00243 void GetCol(MatrixColX& c) { GetCol((MatrixRowCol&)c); }
00244 void cleanup();
00245 void MiniCleanUp();
00246 bool IsEqual(const GeneralMatrix&) const;
00247 bool is_singular() const { return sing; }
00248 bool IsSingular() const { return sing; }
00249 const Real* const_data2() const { return store2; }
00250 int size2() const { return storage2; }
00251 const int* const_data_indx() const { return indx; }
00252 bool even_exchanges() const { return d; }
00253 MatrixBandWidth bandwidth() const;
00254 void swap(BandLUMatrix& gm);
00255 NEW_DELETE(BandLUMatrix)
00256 };
00257
00258 #endif
00259