00001 #ifndef MATRICES_H 00002 #define MATRICES_H 00003 00004 #include <vector> 00005 00006 class lower_triangular_matrix { 00007 00008 unsigned n; 00009 std::vector<double> data; 00010 00011 public: 00012 00013 lower_triangular_matrix(unsigned n_ = 0) : n(n_), data(n * (n+1) / 2) {}; 00014 00015 void resize(unsigned n_) { 00016 n = n_; 00017 data.resize(n*(n+1)/2); 00018 } 00019 00020 std::vector<double>::iterator operator[](unsigned i) { return data.begin() + i * (i+1) / 2; } 00021 std::vector<double>::const_iterator operator[](unsigned i) const { return data.begin() + i*(i+1)/2; } 00022 }; 00023 00024 class square_matrix { 00025 unsigned n; 00026 std::vector<double> data; 00027 00028 public: 00029 00030 square_matrix(unsigned n_ = 0) : n(n_), data(n * n) {}; 00031 00032 void resize(unsigned n_) { 00033 n = n_; 00034 data.resize(n*n); 00035 } 00036 00037 std::vector<double>::iterator operator[](unsigned i) { return data.begin() + i * n; } 00038 std::vector<double>::const_iterator operator[](unsigned i) const { return data.begin() + i*n; } 00039 }; 00040 00041 #endif 00042