`

      1  #include <cassert>
      2  #include <iomanip>
      3
      4  #include "matrix1.h"
      5
      6  Matrix::Matrix()
      7  {
      8     for (int i = 0; i < ROWS; i++)
      9        for (int j = 0; j < COLUMNS; j++)
     10  	 (*this)(i, j) = 0;
     11  }
     12
     13  double& Matrix::operator()(int i, int j)
     14  {
     15     assert(0 <= i && i < ROWS && 0 <= j && j < COLUMNS);
     16     return elements[i * COLUMNS + j];
     17  }
     18
     19  double Matrix::operator()(int i, int j) const
     20  {
     21     assert(0 <= i && i < ROWS && 0 <= j && j < COLUMNS);
     22     return elements[i * COLUMNS + j];
     23  }
     24
     25  MatrixRow Matrix::operator[](int i)
     26  {
     27     return MatrixRow(this, i);
     28  }
     29
     30  ConstMatrixRow Matrix::operator[](int i) const
     31  {
     32     return ConstMatrixRow(this, i);
     33  }
     34
     35  MatrixRow::MatrixRow(Matrix* m, int s)
     36  {
     37     mat = m;
     38     i = s;
     39  }
     40
     41  double& MatrixRow::operator[](int j)
     42  {
     43     return (*mat)(i,j);
     44  }
     45
     46  ConstMatrixRow::ConstMatrixRow(const Matrix* m, int s)
     47  {
     48     mat = m;
     49     i = s;
     50  }
     51
     52  double ConstMatrixRow::operator[](int j) const
     53  {
     54     return (*mat)(i, j);
     55  }
     56
     57  Matrix& Matrix::operator+=(const Matrix& right)
     58  {
     59     for (int i = 0; i < Matrix::ROWS; i++)
     60        for (int j = 0; j < Matrix::COLUMNS; j++)
     61           (*this)(i, j) += right(i, j);
     62     return *this;
     63  }
     64
     65  Matrix operator+(const Matrix& left, const Matrix& right)
     66  {
     67     Matrix result = left;
     68     result += right;
     69     return result;
     70  }
     71
     72  Matrix operator*(const Matrix& left, const Matrix& right)
     73  {
     74     Matrix result;
     75     for (int i = 0; i < Matrix::ROWS; i++)
     76        for (int j = 0; j < Matrix::COLUMNS; j++)
     77           for (int k = 0; k < Matrix::COLUMNS; k++)
     78              result(i, j) += left(i, k) * right(k, j);
     79     return result;
     80  }
     81
     82  Matrix operator*(const Matrix& left, double right)
     83  {
     84     Matrix result;
     85     for (int i = 0; i < Matrix::ROWS; i++)
     86        for (int j = 0; j < Matrix::COLUMNS; j++)
     87           result(i, j) = left(i, j) * right;
     88     return result;
     89  }
     90
     91  Matrix operator*(double left, const Matrix& right)
     92  {
     93     return right * left;
     94  }
     95
     96  ostream& operator<<(ostream& left, const Matrix& right)
     97  {
     98     const int WIDTH = 10;
     99     for (int i = 0; i < Matrix::ROWS; i++)
    100     {
    101        for (int j = 0; j < Matrix::COLUMNS; j++)
    102           left << setw(WIDTH) << right(i, j);
    103        left << "\n";
    104     }
    105     return left;
    106  }

`