matrixindexset.hh
Go to the documentation of this file.00001 #ifndef DUNE_MATRIX_INDEX_SET_HH
00002 #define DUNE_MATRIX_INDEX_SET_HH
00003
00004 #include <vector>
00005 #include <set>
00006
00007 namespace Dune {
00008
00009
00011 class MatrixIndexSet
00012 {
00013
00014 public:
00015
00017 MatrixIndexSet() : rows_(0), cols_(0)
00018 {}
00019
00021 MatrixIndexSet(int rows, int cols) : rows_(rows), cols_(cols) {
00022 indices_.resize(rows_);
00023 }
00024
00026 void resize(int rows, int cols) {
00027 rows_ = rows;
00028 cols_ = cols;
00029 indices_.resize(rows_);
00030 }
00031
00033 void add(int i, int j) {
00034 indices_[i].insert(j);
00035 }
00036
00038 int size() const {
00039 int entries = 0;
00040 for (int i=0; i<rows_; i++)
00041 entries += indices_[i].size();
00042
00043 return entries;
00044 }
00045
00047 int rows() const {return rows_;}
00048
00049
00051 int rowsize(int row) const {return indices_[row].size();}
00052
00059 template <class MatrixType>
00060 void import(const MatrixType& m, int rowOffset=0, int colOffset=0) {
00061
00062 typedef typename MatrixType::row_type RowType;
00063 typedef typename RowType::ConstIterator ColumnIterator;
00064
00065 for (int rowIdx=0; rowIdx<m.N(); rowIdx++) {
00066
00067 const RowType& row = m[rowIdx];
00068
00069 ColumnIterator cIt = row.begin();
00070 ColumnIterator cEndIt = row.end();
00071
00072 for(; cIt!=cEndIt; ++cIt)
00073 add(rowIdx+rowOffset, cIt.index()+colOffset);
00074
00075 }
00076
00077 }
00078
00084 template <class MatrixType>
00085 void exportIdx(MatrixType& matrix) const {
00086
00087 matrix.setSize(rows_, cols_);
00088 matrix.setBuildMode(MatrixType::random);
00089
00090 for (int i=0; i<rows_; i++)
00091 matrix.setrowsize(i, indices_[i].size());
00092
00093 matrix.endrowsizes();
00094
00095 for (int i=0; i<rows_; i++) {
00096
00097 typename std::set<unsigned int>::iterator it = indices_[i].begin();
00098 for (; it!=indices_[i].end(); ++it)
00099 matrix.addindex(i, *it);
00100
00101 }
00102
00103 matrix.endindices();
00104
00105 }
00106
00107 private:
00108
00109 std::vector<std::set<unsigned int> > indices_;
00110
00111 int rows_, cols_;
00112
00113 };
00114
00115
00116 }
00117
00118 #endif