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