00001 #ifndef __FloatSMatrix_H__
00002 #define __FloatSMatrix_H__
00003
00004
00005
00024 #include <stdio.h>
00025 #include "FloatVector.hpp"
00026
00027 #include "AFSymMatrix.hpp"
00028
00029
00030 class FloatSMatrix : public AFSymMatrix
00031 {
00032 private:
00033
00034 float** data;
00035
00036 public:
00037
00038 FloatSMatrix(int n, float value=0.0);
00039 FloatSMatrix(const FloatSMatrix& m);
00040 FloatSMatrix operator=(const FloatSMatrix& m);
00041
00042 virtual ~FloatSMatrix();
00043
00044 virtual AFSymMatrix* copyAnn();
00045 virtual AFloatMatrix* copy();
00046 virtual AFloatMatrix* t(AFloatMatrix* result=0);
00047
00048
00049 virtual void set0(int i, int j, float value){ data[i][j]= value; }
00050 virtual float get0(int i, int j){ return data[i][j]; }
00051
00052
00053 virtual void set(int i, int j, float value){ data[i-1][j-1]= value; }
00054 virtual float get(int i, int j){ return data[i-1][j-1]; }
00055
00056
00057 virtual void setAll(float value=0.0);
00058
00059 virtual float det();
00060 virtual float trace();
00061
00062 virtual float norme2();
00063 virtual float normeF();
00064 virtual float norme1();
00065 virtual float normeInf();
00066
00067 virtual float sum();
00068 virtual float sum2();
00069
00070 virtual float minimum();
00071 virtual float maximum();
00072 virtual float sigma();
00073
00074
00075 FloatSMatrix sqrt();
00076 FloatSMatrix pow(float pow);
00077 FloatSMatrix sqr();
00078 FloatSMatrix exp();
00079 FloatSMatrix log();
00080 FloatSMatrix log(float base);
00081
00082 FloatSMatrix sin();
00083 FloatSMatrix cos();
00084 FloatSMatrix tan();
00085
00086
00087 void operator+=(float value);
00088 void operator-=(float value);
00089 void operator*=(float value);
00090 void operator/=(float value);
00091
00092 virtual void add(float value);
00093 virtual void subst(float value);
00094 virtual void mult(float value);
00095 virtual void div(float value);
00096
00097
00098 void operator+=(FloatSMatrix& m);
00099 void operator-=(FloatSMatrix& m);
00100
00101 virtual void add(AFloatMatrix& m);
00102 virtual void subst(AFloatMatrix& m);
00103
00104
00105 FloatVector** arnoldi(FloatSMatrix* h);
00106
00107
00108 virtual FloatVector* mult_Av(FloatVector* v, FloatVector* result=0);
00109 virtual FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0);
00110
00111 virtual FloatVector* mult_vA(FloatVector* v, FloatVector* result=0) { return mult_ATv(v, result); }
00112 virtual FloatVector* mult_vAT(FloatVector* vt, FloatVector* result=0){ return mult_Av(vt, result); }
00113
00114
00115
00116 FloatVector* mult_Av(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0);
00117 FloatVector* mult_ATv(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0);
00118
00119 FloatVector* mult_vA(FloatVector* v, int row0, int col0, bool incremental=false, FloatVector* result=0)
00120 { return mult_ATv(v, col0, row0, incremental, result); }
00121 FloatVector* mult_vAT(FloatVector* vt, int row0, int col0, bool incremental=false, FloatVector* result=0)
00122 { return mult_Av(vt, col0, row0, incremental, result); }
00123
00124
00125 float cond1();
00126
00127
00128 AFloatMatrix* inverseOfU0(AFloatMatrix* uinv=0);
00129 AFloatMatrix* inverseOfU1(AFloatMatrix* uinv=0);
00130
00131
00132 virtual AFloatMatrix* ilu0();
00133 virtual AFloatMatrix* milu0();
00134 virtual AFloatMatrix* rilu0(float omega=0.95);
00135 virtual AFloatMatrix* iluth(double threshold=0.001);
00136 virtual AFloatMatrix* ilut(int p, double eps=0.001);
00137 virtual AFloatMatrix* icf();
00138 virtual AFloatMatrix* ildlt();
00139
00140
00141 virtual AFloatMatrix* apinv(int iterOuter, int iterInner);
00142
00143
00144 friend FloatVectorT operator*(FloatVectorT& vt, FloatSMatrix& m);
00145 friend FloatVector operator*(FloatSMatrix& m, FloatVector& v);
00146
00147 virtual void output(){ printf("Full "); AFSymMatrix::output(); }
00148 };
00149
00150 #endif
00151
00152
00153