00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _MATSPARSE_H
00032 #define _MATSPARSE_H
00033
00034
00035 #include <BitMatrix.h>
00036
00037 #include <vector>
00038 #include <fstream>
00039
00040
00041
00042 class MatSparse {
00043 private:
00044 int noR_, noC_;
00045 int p_;
00046 std::vector<int> irow_;
00047
00048
00049 std::vector<int> jcol_;
00050 std::vector<double> a_;
00051 public:
00052 MatSparse() : noR_(0), noC_(0), p_(0) {}
00053
00054 MatSparse(int n1, int n2, int num_nonzero)
00055 : noR_(n1), noC_(n2), p_(num_nonzero), irow_(n1+1), jcol_(num_nonzero), a_(num_nonzero) {
00056 irow_[noR_] = num_nonzero;
00057 }
00058
00059 ~MatSparse(){}
00060
00061 void init(const BitMatrix& pattern);
00062
00063
00064 void init(std::vector<std::pair<int,int> >& entries, int m, int n, bool sorted = false);
00065
00066 void init(const MatSparse& mat, bool copyElements=false);
00067
00068 void operator += (const MatSparse& mat);
00069 void operator *= (double fac);
00070
00071 int noRows() const {return noR_;}
00072 int noColumns() const {return noC_;};
00073
00074 double& operator () (int i, int j);
00075 const double& operator () (int i, int j) const;
00076
00077 double getVal(int i, int j) const;
00078
00079 int getOffset(int i, int j) const;
00080
00081 void resize(int n1, int n2, int num_nonzero);
00082
00083 int& irow(int k) {return irow_[k];}
00084 const int& irow(int k) const {return irow_[k];}
00085 int& jcol(int k) {return jcol_[k];}
00086 const int& jcol(int k) const {return jcol_[k];}
00087 double& operator () (int k) {return a_[k];}
00088 const double& operator () (int k) const {return a_[k];}
00089
00090 double norml2() const;
00091 bool isSymmetric() const;
00092 bool isDiagonallyDominant() const;
00093 void printPattern(std::ostream& os) const;
00094 int noNonZeros() const {return p_;}
00095
00096 void print(std::ostream& os) const;
00097 void printMatlab(std::ostream& os) const;
00098 void printPatternGnuplot(std::ostream& os) const;
00099 };
00100 #endif