#include "Matrix.h" Matrix::Matrix() : n(0), m(0), entries(null) { } Matrix::Matrix(size_t rows, size_t cols) : n(cols ? rows : 0) , m(rows ? cols : 0) , entries( rows && cols ? new double[rows * cols] : (double*)null ) { for ( size_t i = 0, size = rows * cols; i < size; ++i ) entries[i] = 0.0; } Matrix::Matrix(const Matrix& other) : n(other.n) , m(other.m) , entries(null) { if ( other.entries ) { size_t size = n * m; entries = new double[size]; for ( size_t i = 0; i < size; ++i) entries[i] = other.entries[i]; } } const Matrix& Matrix::operator=(const Matrix& other) { if ( this != &other ) { n = other.n; m = other.m; size_t size = n * m; delete [] entries; entries = size ? new double[size] : (double*)null; for ( size_t i = 0; i < size; ++i ) entries[i] = other.entries[i]; } return *this; } Matrix::~Matrix() { delete [] entries; } Matrix Matrix::operator+(const Matrix& other) const { if ( n != other.n || m != other.m ) return Matrix(); Matrix result(n, m); for ( size_t i = 0, size = n * m; i < size; ++i ) result.entries[i] = entries[i] + other.entries[i]; return result; } Matrix Matrix::operator-(const Matrix& other) const { if ( n != other.n || m != other.m ) return Matrix(); Matrix result(n, m); for ( size_t i = 0, size = n * m; i < size; ++i ) result.entries[i] = entries[i] - other.entries[i]; return result; } Matrix Matrix::operator*(double r) const { Matrix result(n, m); for ( size_t i = 0, size = n * m; i < size; ++i ) result.entries[i] = entries[i] * r; return result; } Matrix Matrix::operator*(const Matrix& other) const { if ( m != other.n ) return Matrix(); Matrix result(n, other.m); for ( size_t i = 0; i < n; ++i ) for ( size_t j = 0; j < other.m; ++j ) for ( size_t k = 0; k < m; ++k ) result(i,j) += (*this)(i,k) * other(k, j); return result; } std::istream& operator>>(std::istream& input, Matrix& matrix) { for ( size_t i = 0, size = matrix.n * matrix.m; i < size; ++i ) input >> matrix.entries[i]; return input; } std::ostream& operator<<(std::ostream& output, const Matrix& matrix) { if ( ! matrix ) return output << "(null)\n"; for ( size_t i = 0; i < matrix.rows(); ++i ) { for ( size_t j = 0; j < matrix.cols(); ++j ) output << matrix(i,j) << '\t'; output << '\n'; } return output; }