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;
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
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
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
00081
00082 virtual void setAll(float value=0.0){ band[0]->setAll(value); band[1]->setAll(value); }
00083
00084
00085 virtual FloatVector* solve(FloatVector* b, FloatVector* x=0);
00086
00087 virtual FloatVector* linearSolverL0(FloatVector* b, FloatVector* x=0);
00088 virtual FloatVector* linearSolverL1(FloatVector* b, FloatVector* x=0);
00089
00090
00091 AFSymMatrix* invert();
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
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
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
00120 FloatVector* mult_Av(FloatVector* v, FloatVector* result=0);
00121 FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0);
00122
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
00127
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
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