Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #ifndef _MATRIX_H_INCLUDED
- #define _MATRIX_H_INCLUDED
- #include <cstdio>
- #include <cstddef>
- #include <cstdlib>
- #include <algorithm>
- class Matrix {
- public:
- Matrix(std::size_t r, std::size_t c);
- ~Matrix();
- Matrix(const Matrix& m);
- std::size_t get_rows();
- std::size_t get_cols();
- void set(std::size_t i, std::size_t j, int val);
- int get(std::size_t i, std::size_t j);
- void print(FILE *f);
- Matrix& operator=(const Matrix& m);
- int* operator[](std::size_t i);
- const int* operator[](std::size_t i) const;
- Matrix& operator+=(const Matrix& m);
- Matrix& operator-=(const Matrix& m);
- Matrix& operator*=(const Matrix& m);
- bool operator==(const Matrix& m);
- bool operator!=(const Matrix& m);
- private:
- int** new_data(std::size_t r, std::size_t c);
- void del_data();
- std::size_t _rows;
- std::size_t _cols;
- int **_data;
- };
- Matrix operator+(Matrix, const Matrix& right);
- Matrix operator-(Matrix, const Matrix& right);
- Matrix operator*(Matrix, const Matrix& right);
- #endif
- //================================CPP FILE========================================
- #include "matrix.h"
- int** Matrix::new_data(std::size_t r, std::size_t c){
- int *tmp = new int [r * c];
- std::fill(tmp, tmp + r * c, 0);
- int **data = new int *[r];
- for (std::size_t i = 0; i < r; i++)
- data[i] = tmp + i * c;
- return data;
- }
- void Matrix::del_data(){
- delete[] _data[0];
- delete[] _data;
- }
- Matrix::Matrix(std::size_t r, std::size_t c) {
- _data = new_data(r, c);
- _rows = r;
- _cols = c;
- }
- Matrix::~Matrix(){
- del_data();
- }
- Matrix::Matrix(const Matrix& m){
- _rows = m._rows;
- _cols = m._cols;
- _data = new_data(_rows, _cols);
- for (std::size_t i = 0; i < _rows; i++)
- for (std::size_t j = 0; j < _cols; j++)
- _data[i][j] = m._data[i][j];
- }
- int* Matrix::operator[](std::size_t i){
- return _data[i];
- }
- const int* Matrix::operator[](std::size_t i) const{
- return _data[i];
- }
- std::size_t Matrix::get_rows() { return _rows; }
- std::size_t Matrix::get_cols() { return _cols; }
- void Matrix::set(std::size_t i, std::size_t j, int val) {
- _data[i][j] = val;
- }
- int Matrix::get(std::size_t i, std::size_t j) {
- return _data[i][j];
- }
- void Matrix::print(FILE* f) {
- for (std::size_t i = 0; i<_rows; i++){
- for (std::size_t j = 0; j<_cols; j++)
- fprintf(f, "%d ", _data[i][j]);
- fprintf(f, "\n");
- }
- }
- Matrix& Matrix::operator=(const Matrix& m){
- if (this == &m) return *this;
- Matrix c = m;
- _cols = c._cols;
- _rows = c._rows;
- std::swap(_data, c._data);
- return *this;
- }
- bool Matrix::operator==(const Matrix& m){
- if (_cols != m._cols || _rows != m._rows)
- return false;
- for (std::size_t i=0; i<_rows; i++)
- for (std::size_t j=0; j<_cols; j++)
- if (_data[i][j] != m._data[i][j])
- return false;
- return true;
- }
- bool Matrix::operator!=(const Matrix& m) {
- return !(*this == m);
- }
- Matrix& Matrix::operator+=(const Matrix& m) {
- for (std::size_t i=0; i<_rows; i++)
- for (std::size_t j=0; j<_cols; j++)
- _data[i][j] += m._data[i][j];
- return *this;
- }
- Matrix& Matrix::operator-=(const Matrix& m) {
- for (std::size_t i=0; i<_rows; i++)
- for (std::size_t j=0; j<_cols; j++)
- _data[i][j] -= m._data[i][j];
- return *this;
- }
- Matrix& Matrix::operator*=(const Matrix& m) {
- Matrix c(_rows, m._cols);
- int sum = 0;
- for (std::size_t i=0; i<_rows; i++)
- for (std::size_t j=0; j<m._cols; j++){
- for (std::size_t k=0; k<_cols; k++)
- sum += _data[i][k] * m._data[k][j];
- c.set(i, j, sum);
- sum = 0;
- }
- *this = c;
- return *this;
- }
- Matrix operator+(Matrix left, const Matrix& right){
- return left += right;
- }
- Matrix operator-(Matrix left, const Matrix& right){
- return left -= right;
- }
- Matrix operator*(Matrix left, const Matrix& right){
- return left *= right;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement