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; // horizontal rows 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 // base 0 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 // base 1 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 // computations 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 // scalar single operations 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 // vector single operations 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 // u= A*v including implicit transposition 00093 virtual FloatVector* mult_Av(FloatVector* v, FloatVector* result=0); 00094 virtual FloatVector* mult_ATv(FloatVector* v, FloatVector* result=0); 00095 // u= v*A 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 // sub vector usage 00100 // u= A*v 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 // u= v*A 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 // friends 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