ocmatrix.h

Go to the documentation of this file.
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;} //matrix element pointer
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 { // type 1
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 {  // type 2
00115 public:
00116    OcSparseMatrix(int, int);
00117    virtual ~OcSparseMatrix();
00118 
00119    virtual double* mep(int, int);
00120    virtual double* pelm(int, int); // nil if element does not exist
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); // how many elements in row
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
Generated on Mon Jun 13 08:10:24 2011 for NEURON by  doxygen 1.6.3