00001 #ifndef ocmatrix_h
00002 #define ocmatrix_h
00003
00004 #ifndef MATRIXH
00005 #define MAT void
00006 #define SPMAT void
00007 #define PERM void
00008 #endif
00009
00010 struct Object;
00011 class IvocVect;
00012 class OcFullMatrix;
00013 #define Vect IvocVect
00014 #define Matrix OcMatrix
00015
00016 class OcMatrix {
00017 public:
00018 enum {MFULL=1, MSPARSE, MBAND};
00019 static OcMatrix* instance(int nrow, int ncol, int type = MFULL);
00020 virtual ~OcMatrix();
00021
00022 virtual double* mep(int i, int j) {unimp(); return nil;}
00023 virtual double getval(int i, int j) { unimp(); return 0.; }
00024 virtual int nrow() {unimp(); return 0;}
00025 virtual int ncol() {unimp(); return 0;}
00026 virtual void resize(int, int) {unimp();}
00027
00028 OcFullMatrix* full();
00029
00030 virtual void mulv(Vect* in, Vect* out){unimp();}
00031 virtual void mulm(Matrix* in, Matrix* out){unimp();}
00032 virtual void muls(double, Matrix* out){unimp();}
00033 virtual void add(Matrix*, Matrix* out){unimp();}
00034 virtual void getrow(int, Vect* out){unimp();}
00035 virtual void getcol(int, Vect* out){unimp();}
00036 virtual void getdiag(int, Vect* out){unimp();}
00037 virtual void setrow(int, Vect* in){unimp();}
00038 virtual void setcol(int, Vect* in){unimp();}
00039 virtual void setdiag(int, Vect* in){unimp();}
00040 virtual void setrow(int, double in){unimp();}
00041 virtual void setcol(int, double in){unimp();}
00042 virtual void setdiag(int, double in){unimp();}
00043 virtual void zero(){unimp();}
00044 virtual void ident(){unimp();}
00045 virtual void exp(Matrix* out){unimp();}
00046 virtual void pow(int, Matrix* out){unimp();}
00047 virtual void inverse(Matrix* out){unimp();}
00048 virtual void solv(Vect* vin, Vect* vout, boolean use_lu) {unimp();}
00049 virtual void copy(Matrix* out){unimp();}
00050 virtual void bcopy(Matrix* mout, int i0, int j0, int n0, int m0, int i1, int j1){unimp();}
00051 virtual void transpose(Matrix* out){unimp();}
00052 virtual void symmeigen(Matrix* mout, Vect* vout){unimp();}
00053 virtual void svd1(Matrix* u, Matrix* v, Vect* d){unimp();}
00054 virtual double det(int* e){unimp(); return 0.0;}
00055 virtual int sprowlen(int){unimp(); return 0;}
00056 virtual double spgetrowval(int i, int jindx, int* j){unimp(); return 0.;}
00057
00058 void unimp();
00059 Object** temp_objvar();
00060 protected:
00061 OcMatrix(int type);
00062 public:
00063 Object* obj_;
00064 private:
00065 int type_;
00066 };
00067
00068 extern "C" {
00069 extern Matrix* matrix_arg(int);
00070 }
00071
00072 class OcFullMatrix : public OcMatrix {
00073 public:
00074 OcFullMatrix(int, int);
00075 virtual ~OcFullMatrix();
00076
00077 virtual double* mep(int, int);
00078 virtual double getval(int i, int j);
00079 virtual int nrow();
00080 virtual int ncol();
00081 virtual void resize(int, int);
00082
00083 virtual void mulv(Vect* in, Vect* out);
00084 virtual void mulm(Matrix* in, Matrix* out);
00085 virtual void muls(double, Matrix* out);
00086 virtual void add(Matrix*, Matrix* out);
00087 virtual void getrow(int, Vect* out);
00088 virtual void getcol(int, Vect* out);
00089 virtual void getdiag(int, Vect* out);
00090 virtual void setrow(int, Vect* in);
00091 virtual void setcol(int, Vect* in);
00092 virtual void setdiag(int, Vect* in);
00093 virtual void setrow(int, double in);
00094 virtual void setcol(int, double in);
00095 virtual void setdiag(int, double in);
00096 virtual void zero();
00097 virtual void ident();
00098 virtual void exp(Matrix* out);
00099 virtual void pow(int, Matrix* out);
00100 virtual void inverse(Matrix* out);
00101 virtual void solv(Vect* vin, Vect* vout, boolean use_lu);
00102 virtual void copy(Matrix* out);
00103 virtual void bcopy(Matrix* mout, int i0, int j0, int n0, int m0, int i1, int j1);
00104 virtual void transpose(Matrix* out);
00105 virtual void symmeigen(Matrix* mout, Vect* vout);
00106 virtual void svd1(Matrix* u, Matrix* v, Vect* d);
00107 virtual double det(int* exponent);
00108 private:
00109 MAT* m_;
00110 MAT* lu_factor_;
00111 PERM* lu_pivot_;
00112 };
00113
00114 class OcSparseMatrix : public OcMatrix {
00115 public:
00116 OcSparseMatrix(int, int);
00117 virtual ~OcSparseMatrix();
00118
00119 virtual double* mep(int, int);
00120 virtual double* pelm(int, int);
00121 virtual int nrow();
00122 virtual int ncol();
00123 virtual double getval(int, int);
00124 virtual void mulv(Vect* in, Vect* out);
00125 virtual void solv(Vect* vin, Vect* vout, boolean use_lu);
00126
00127 virtual void setrow(int, Vect* in);
00128 virtual void setcol(int, Vect* in);
00129 virtual void setdiag(int, Vect* in);
00130 virtual void setrow(int, double in);
00131 virtual void setcol(int, double in);
00132 virtual void setdiag(int, double in);
00133
00134 virtual int sprowlen(int);
00135 virtual double spgetrowval(int i, int jindx, int* j);
00136 private:
00137 SPMAT* m_;
00138 SPMAT* lu_factor_;
00139 PERM* lu_pivot_;
00140 };
00141
00142 #ifndef MATRIXH
00143 #undef MAT
00144 #undef SPMAT
00145 #endif
00146
00147 #endif