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