00001 #ifndef __F_LBiDiag_H__ 00002 #define __F_LBiDiag_H__ 00003 00004 00005 00026 #include <stdio.h> 00027 #include "FloatVector.hpp" 00028 #include "FloatVectorT.hpp" 00029 00030 #include "AFSymMatrix.hpp" 00031 00032 class F_LBiDiag : public AFSymMatrix 00033 { 00034 private: 00035 00036 FloatVector** band; // band0= Diagonal 00037 00038 public: 00039 00040 F_LBiDiag(int asize, float val=0.0); 00041 F_LBiDiag(const F_LBiDiag& v); 00042 F_LBiDiag operator=(const F_LBiDiag& v); 00043 00044 virtual ~F_LBiDiag(){delete band[0]; delete band[1]; delete[] band; } 00045 00046 virtual AFloatMatrix* copy(){return 0;} 00047 virtual AFloatMatrix* t(AFloatMatrix* result=0){return 0;} 00048 00049 void load(F_LBiDiag* m); 00050 void load(FloatVector* d, FloatVector* dnear); 00051 00052 virtual int size()const { return (2*width-1); } 00053 00054 FloatVector* getBand(int i){ return band[i]; } 00055 FloatVector* getLvalues(int i){ return band[1]; } 00056 FloatVector* getDvalues(){ return band[0]; } 00057 00058 virtual void setBand(int i, FloatVector* v){band[i]->load(v);} 00059 00060 // base 0 00061 virtual void set0(int i, int j, float value); 00062 virtual float get0(int i, int j); 00063 00064 inline void setD0(int i, float value){ band[0]->set0(i, value); } 00065 inline float getD0(int i) const{ return band[0]->get0(i); } 00066 00067 virtual void setL0(int i, float value){ band[1]->set0(i, value); } 00068 virtual float getL0(int i)const{ return band[1]->get0(i); } 00069 00070 // base 1 00071 virtual void set(int i, int j, float value){ set0(i-1, j-1, value); } 00072 virtual float get(int i, int j){ return get0(i-1, j-1); } 00073 00074 inline void setD(int i, float value){ band[0]->set(i, value); } 00075 inline float getD(int i) const{ return band[0]->get(i); } 00076 00077 virtual void setL(int i, float value){ band[1]->set(i, value); } 00078 virtual float getL(int i)const{ return band[1]->get(i); } 00079 00080 // computations 00081 00082 virtual void setAll(float value=0.0){ band[0]->setAll(value); band[1]->setAll(value); } 00083 00084 // direct solvers 00085 virtual FloatVector* solve(FloatVector* b, FloatVector* x=0); // Lx=b 00086 00087 virtual FloatVector* linearSolverL0(FloatVector* b, FloatVector* x=0); // Lx=b 00088 virtual FloatVector* linearSolverL1(FloatVector* b, FloatVector* x=0); // L1x=b 00089 00090 // direct inversion L 00091 AFSymMatrix* invert(); // Linv = L^-1 00092 00093 virtual float det(){return 0;} 00094 virtual float trace(){return 0;} 00095 00096 virtual float norme2(); 00097 virtual float sum(); 00098 00099 virtual float minimum(); 00100 virtual float maximum(); 00101 virtual float sigma(); 00102 00103 // scalar single operations 00104 void operator*=(float value); 00105 void operator/=(float value); 00106 00107 virtual void add(float value){} 00108 virtual void subst(float value){} 00109 virtual void mult(float value); 00110 virtual void div(float value); 00111 00112 // vector single operations 00113 void operator+=(F_LBiDiag& m); 00114 void operator-=(F_LBiDiag& m); 00115 00116 virtual void add(AFloatMatrix& m){} 00117 virtual void subst(AFloatMatrix& m){} 00118 00119 // u= A*v including implicit transposition 00120 FloatVector* mult_Av(FloatVector* v, FloatVector* result=0); 00121 FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0); 00122 // u= v*A 00123 FloatVector* mult_vA(FloatVector* v, FloatVector* result=0) { return mult_ATv(v, result); } 00124 FloatVector* mult_vAT(FloatVector* vt, FloatVector* result=0){ return mult_Av(vt, result); } 00125 00126 // sub vector usage 00127 // u= A*v 00128 FloatVector* mult_Av(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0); 00129 FloatVector* mult_ATv(FloatVector* v, int col0, int row0, bool incremental=false, FloatVector* result=0); 00130 // u= v*A 00131 FloatVector* mult_vA(FloatVector* v, int row0, int col0, bool incremental=false, FloatVector* result=0) 00132 { return mult_ATv(v, col0, row0, incremental, result); } 00133 FloatVector* mult_vAT(FloatVector* vt, int row0, int col0, bool incremental=false, FloatVector* result=0) 00134 { return mult_Av(vt, col0, row0, incremental, result); } 00135 00136 00137 virtual void output(); 00138 virtual void output(FILE* file); 00139 }; 00140 00141 #endif 00142 00143