00001 #ifndef TNT_SPARSE_MATRIX_H
00002
00003 #define TNT_SPARSE_MATRIX_H
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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <vector>
00050
00051 #include "tnt_vector.h"
00052
00053 #include "tnt_sparse_vector.h"
00054
00055
00056
00057 namespace TNT
00058
00059 {
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 #if 0
00072
00073 template <class T, class Integer>
00074
00075 class Sparse_Matrix_Coordinate_Element
00076
00077 {
00078
00079 private:
00080
00081
00082
00083 T val_;
00084
00085 Integer row_index_;
00086
00087 Integer col_index_;
00088
00089
00090
00091 public:
00092
00093
00094
00095 Sparse_Matrix_Coordinate_Element(
00096
00097 const T& a, const Integer &i, const Integer &j) :
00098
00099 val_(a), row_index_(i), col_index(i) {}
00100
00101
00102
00103
00104
00105 const T& value() const { return val_; }
00106
00107 Integer row_index() const { return row_index_; }
00108
00109 Integer col_index() const { return col_index_; }
00110
00111
00112
00113 T& value() { return val_; }
00114
00115 Integer& row_index() { return row_index_; }
00116
00117 Integer& col_index() { return col_index_; }
00118
00119
00120
00121 };
00122
00123 #endif
00124
00125
00126
00161 template <class T>
00162
00163 class Sparse_Matrix
00164
00165 {
00166
00167 private:
00168
00169
00170
00171
00172
00173
00174
00175 std::vector< Sparse_Vector<T> > S_;
00176
00177
00178
00179 int num_rows_;
00180
00181 int num_cols_;
00182
00183 int num_nonzeros_;
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195 int internal_state_;
00196
00197
00198
00199
00200
00201
00202
00203 public:
00204
00205
00206
00207
00208
00209 Sparse_Matrix(Subscript M, Subscript N):
00210
00211 S_(M),
00212
00213 num_rows_(M), num_cols_(N), num_nonzeros_(0),
00214
00215 internal_state_(1) {};
00216
00217
00218
00219
00220
00221
00222
00223 Sparse_Matrix(Subscript M, Subscript N, Subscript nz, const T* val,
00224
00225 const Subscript *r, const Subscript *c):
00226
00227 S_(M),
00228
00229 num_rows_(M),
00230
00231 num_cols_(N),
00232
00233 num_nonzeros_(0),
00234
00235 internal_state_(1)
00236
00237 {
00238
00239
00240
00241 insert(nz, val, r, c);
00242
00243 close();
00244
00245 };
00246
00247
00248
00249
00250
00251 int is_closed() { return internal_state_; }
00252
00253
00254
00255 void insert(const T& val, Subscript i, Subscript j)
00256
00257 {
00258
00259 if (internal_state_ == 0) return;
00260
00261
00262
00263
00264
00265 S_[i].insert(val, j);
00266
00267 num_nonzeros_++;
00268
00269 }
00270
00271
00272
00273 void insert(Subscript nz, const T* val, const Subscript *i,
00274
00275 const Subscript *j)
00276
00277 {
00278
00279 if (internal_state_ == 0) return;
00280
00281
00282
00283 for (int count=0; count<nz; count++)
00284
00285 {
00286
00287 insert(val[count], i[count], j[count]);
00288
00289 }
00290
00291 }
00292
00293
00294
00295 void insert_base_one(const T& val, Subscript i, Subscript j)
00296
00297 {
00298
00299 insert_one_base(val, i-1, j-1);
00300
00301 }
00302
00303
00304
00305 void insert_base_one(Subscript nz, const T* val, const Subscript *i,
00306
00307 const Subscript *j)
00308
00309 {
00310
00311 for (int count=0; count<nz; count++)
00312
00313 {
00314
00315 insert(val[count], i[count]-1, j[count]-1);
00316
00317 }
00318
00319 }
00320
00321
00322
00323
00324
00325 void close()
00326
00327 {
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341 internal_state_ = 0;
00342
00343 }
00344
00345
00346
00347 inline int num_rows() const {return num_rows_;}
00348
00349 inline int num_cols() const {return num_cols_;}
00350
00351 inline int num_columns() const {return num_cols_;}
00352
00353 int num_nonzeros() const {return num_nonzeros_;}
00354
00355
00356
00357
00358
00359 Vector<T> diag() const
00360
00361 {
00362
00363 int minMN = num_rows() < num_columns() ? num_rows() : num_columns();
00364
00365 Vector<T> diag_(minMN, T(0));
00366
00367
00368
00369 for (int i=0; i<minMN; i++)
00370
00371 {
00372
00373 for (typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
00374
00375 p < S_[i].end(); p++ )
00376
00377 {
00378
00379 if (p->index() == i)
00380
00381 {
00382
00383 diag_[i] += p->value();
00384
00385 break;
00386
00387 }
00388
00389 }
00390
00391 }
00392
00393 return diag_;
00394
00395 }
00396
00397
00398
00399 Vector<T> mult(const Vector<T> &x) const
00400
00401 {
00402
00403 int M = num_rows();
00404
00405 Vector<T> y(M);
00406
00407 for (int i=0; i<M; i++)
00408
00409 {
00410
00411 y[i] = dot_product(S_[i], x);
00412
00413 }
00414
00415 return y;
00416
00417 }
00418
00419
00420
00421
00422
00423 inline double norm() const
00424
00425 {
00426
00427 T sum(0.0);
00428
00429 for (int i=0; i<num_rows_; i++)
00430
00431 {
00432
00433 for (typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
00434
00435 p < S_[i].end(); p++ )
00436
00437 {
00438
00439 sum += p->value() * p->value();
00440
00441 }
00442
00443 }
00444
00445 return sqrt(sum);
00446
00447 }
00448
00449
00450
00451 std::ostream & print(std::ostream &s) const
00452
00453 {
00454
00455 for (int i=0; i<num_rows_; i++)
00456
00457 {
00458
00459 for (typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
00460
00461 p < S_[i].end(); p++ )
00462
00463 {
00464
00465 s << "( " << p->value() << " , " << i << ", " << p->index() << " )\n";
00466
00467 }
00468
00469 }
00470
00471
00472
00473 return s;
00474
00475 }
00476
00477
00478
00479 std::ostream & print_base_one(std::ostream &s) const
00480
00481 {
00482
00483 for (int i=0; i<num_rows_; i++)
00484
00485 {
00486
00487 for (typename Sparse_Vector<T>::const_iterator p = S_[i].begin();
00488
00489 p < S_[i].end(); p++ )
00490
00491 {
00492
00493 s <<"( "<<p->value()<<" , "<<i+1<<", "<< p->index()+1 << " )\n";
00494
00495 }
00496
00497 }
00498
00499
00500
00501 return s;
00502
00503 }
00504
00505
00506
00507
00508
00509 };
00510
00511
00512
00513
00514
00515 template <class T>
00516
00517 inline Vector<T> operator*(const Sparse_Matrix<T> &S, const Vector<T> &x)
00518
00519 {
00520
00521 return S.mult(x);
00522
00523 }
00524
00525
00526
00527 template <class T>
00528
00529 inline double norm(const Sparse_Matrix<T> &S)
00530
00531 {
00532
00533 return S.norm();
00534
00535 }
00536
00537
00538
00539 template <class T>
00540
00541 inline std::ostream& operator<<(std::ostream &s, const Sparse_Matrix<T> &A)
00542
00543 {
00544
00545 return A.print(s);
00546
00547 }
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557 }
00558
00559
00560
00561 #endif
00562