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

F_UBiDiag.hpp

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;           // band0= Diagonal                      
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 // base 0
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 // base 1
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 // computations
00076 
00077 virtual void setAll(float value=0.0){ band[0]->setAll(value); band[1]->setAll(value); }
00078 
00079 // direct solvers
00080 virtual FloatVector* solve(FloatVector* b, FloatVector* x=0);           // Ux=b
00081 
00082 virtual FloatVector* linearSolverU0(FloatVector* b, FloatVector* x=0);          // Ux=b
00083 virtual FloatVector* linearSolverU1(FloatVector* b, FloatVector* x=0);          // U1x=b
00084 
00085 // direct inversion U
00086 AFSymMatrix* invert();          // Uinv = U^-1
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 // scalar single operations
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 // vector single operations
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 // u= A*v including implicit transposition
00115 FloatVector* mult_Av(FloatVector* v, FloatVector* result=0);
00116 FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0);
00117 // u= v*A
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 // sub vector usage
00122 // u= A*v
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 // u= v*A
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 
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