88 std::vector< Sparse_Vector<T> > S_;
107 num_rows_(M), num_cols_(N), num_nonzeros_(0),
108 internal_state_(1) {};
112 Sparse_Matrix(Subscript M, Subscript N, Subscript nz,
const T* val,
113 const Subscript *r,
const Subscript *c):
121 insert(nz, val, r, c);
126 int is_closed() {
return internal_state_; }
128 void insert(
const T& val, Subscript i, Subscript j)
130 if (internal_state_ == 0)
return;
133 S_[i].insert(val, j);
137 void insert(Subscript nz,
const T* val,
const Subscript *i,
140 if (internal_state_ == 0)
return;
142 for (
int count=0; count<nz; count++)
144 insert(val[count], i[count], j[count]);
148 void insert_base_one(
const T& val, Subscript i, Subscript j)
150 insert_one_base(val, i-1, j-1);
153 void insert_base_one(Subscript nz,
const T* val,
const Subscript *i,
156 for (
int count=0; count<nz; count++)
158 insert(val[count], i[count]-1, j[count]-1);
174 inline int num_rows()
const {
return num_rows_;}
175 inline int num_cols()
const {
return num_cols_;}
176 inline int num_columns()
const {
return num_cols_;}
177 int num_nonzeros()
const {
return num_nonzeros_;}
182 int minMN = num_rows() < num_columns() ? num_rows() : num_columns();
185 for (
int i=0; i<minMN; i++)
187 for (
typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
188 p < S_[i].end(); p++ )
192 diag_[i] += p->value();
204 for (
int i=0; i<M; i++)
206 y[i] = dot_product(S_[i], x);
212 inline double norm()
const
215 for (
int i=0; i<num_rows_; i++)
217 for (
typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
218 p < S_[i].end(); p++ )
220 sum += p->value() * p->value();
226 std::ostream & print(std::ostream &s)
const
228 for (
int i=0; i<num_rows_; i++)
230 for (
typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
231 p < S_[i].end(); p++ )
233 s <<
"( " << p->value() <<
" , " << i <<
", " << p->index() <<
" )\n";
240 std::ostream & print_base_one(std::ostream &s)
const
242 for (
int i=0; i<num_rows_; i++)
244 for (
typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
245 p < S_[i].end(); p++ )
247 s <<
"( "<<p->value()<<
" , "<<i+1<<
", "<< p->index()+1 <<
" )\n";