Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   Related Pages  

F_LBiDiag.hpp

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          
SourceForge.net Logo
Restoreinpaint sourceforge project `C++/Java Image Processing, Restoration, Inpainting Project'.

Bernard De Cuyper: Open Project Leader: Concept, design and development.
Bernard De Cuyper & Eddy Fraiha 2002, 2003. Bernard De Cuyper 2004. Open and free, for friendly usage only.
Modifications on Belgium ground of this piece of artistic work, by governement institutions or companies, must be notified to Bernard De Cuyper.
bern_bdc@hotmail.com