Ciao a tutti. Sto cercando di creare una classe che rappresenti delle matrici (nel senso matematico del termine). Ho utilizzato i template e la classe std::array come contenitore.
Di seguito il codice che ho scritto. Sapreste dirmi com'é? Funzionale? Buono? Oppure fa schifo ed é meglio lasciar perdere. Mi piacerebbe creare una classe più o meno completa (operazioni di base) che io possa sempre riutilizzare nei miei programmi di fisica computazionale. L'operazione é però più facile a dirsi che a farsi...
Grazie a tutti per l'aiuto.codice:#ifndef MATRIX_H #define MATRIX_H #include <array> #include <initializer_list> #include <cassert> template <size_t row, size_t col> class Matrix { public: Matrix(); Matrix(const std::initializer_list<double>&); Matrix(const Matrix&); virtual ~Matrix(); Matrix& operator=(const Matrix&); bool operator==(const Matrix&) const; bool operator!=(const Matrix&) const; Matrix& operator+=(const Matrix&); Matrix& operator-=(const Matrix&); Matrix operator+(const Matrix&) const; Matrix operator-(const Matrix&) const; double& operator()(int, int); const double& operator()(int, int) const; int get_row() const; int get_col() const; void set(double); private: std::array< std::array<double,col>, row> matrix; size_t r; size_t c; void copy(const Matrix&); }; #endif template <size_t row, size_t col> Matrix<row,col>::Matrix() : r(row), c(col) { set(0.); } template <size_t row, size_t col> Matrix<row,col>::Matrix(const std::initializer_list<double>& l) : matrix(l), r(row), c(col) {} template <size_t row, size_t col> Matrix<row,col>::Matrix(const Matrix& m) { copy(m); } template <size_t row, size_t col> Matrix<row,col>::~Matrix() {} Matrix& Matrix<row,col>::operator=(const Matrix& m) { if(this != &m) { copy(m); } return *this; } bool Matrix<row,col>::operator==(const Matrix& m) const { for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { if(matrix[i][j] != m.matrix[i][j]) { return false; } } } return true; } bool Matrix<row,col>::operator!=(const Matrix& m) const { return !( (*this) == m); } Matrix& Matrix<row,col>::operator+=(const Matrix& m) { for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { matrix[i][j] += m.matrix[i][j]; } } return *this; } Matrix& Matrix<row,col>::operator-=(const Matrix&) { for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { matrix[i][j] -= m.matrix[i][j]; } } return *this; } Matrix operator+(const Matrix& m) const { Matrix tmp<r,c>(*this); for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { tmp.matrix[i][j] += m.matrix[i][j]; } } return std::move(tmp); } Matrix operator-(const Matrix& m) const { Matrix tmp<row,col>(*this); for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { tmp.matrix[i][j] -= m.matrix[i][j]; } } return std::move(tmp); } template <size_t row, size_t col> double& Matrix<row,col>::operator()(int i, int j) { assert(i > 0 && i <= r); assert(j > 0 && j <= c); return matrix[i-1][j-1]; } template <size_t row, size_t col> const double& Matrix<row,col>::operator()(int i, int j) const { assert(i > 0 && i <= r); assert(j > 0 && j <= c); return matrix[i-1][j-1]; } template <size_t row, size_t col> int Matrix<row,col>::get_row() const { return r; } template <size_t row, size_t col> int Matrix<row,col>::get_col() const { return c; } template <size_t row, size_t col> void Matrix<row,col>::set(double val) { for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { matrix[i][j] = val; } } } template <size_t row, size_t col> void Matrix<row,col>::copy(const Matrix& m) { // r = m.r; c = m.c ??? for(int i(0); i < row; i++) { for(int j(0); j < col; j++) { matrix[i][j] = m.matrix[i][j]; } } }

Rispondi quotando