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