/* Matrix.cpp defines non-trivial Matrix operations.
 * ...
 */

#include "Matrix.h"
#include <cassert>
using namespace std;

// --- output using *this
void Matrix::print(ostream& out) const
{
   for (int i = 0; i < myRows; i++)
   {
      for (int j = 0; j < myColumns; j++)
         out << (*this)[i][j] << '\t';
      out << endl;
   }
}

/* Alterative version of print() using iterators
void Matrix::print(ostream& out) const
{
   TwoDimVector::iterator rowIt = begin();
   OneDimVector::iterator columnIt;

   while (rowIt != end())
   {
      columnIt = (*rowIt).begin();
      while (columnIt != (*rowIt).end())
      {
         out << *columnIt << '\t';
         columnIt++;
      }
      out << endl;
      rowIt++;
   }
}
*/

// --- input
void Matrix::read(istream& in)
{
   for (int i = 0; i < myRows; i++)
      for (int j = 0; j < myColumns; j++)
         in >> (*this)[i][j];
}

// --- multiplication
Matrix Matrix::operator*(const Matrix& mat2) const
{
  assert (myColumns == mat2.rows());          // check dimensions

  Matrix mat3(myRows, mat2.columns());        // build result Matrix

  for (int i = 0; i < myRows; i++)            // for each of my rows:
    for (int j = 0; j < mat2.columns(); j++)  //  for each col in mat2:
    {
       double sum = 0;
       for (int k = 0; k < myColumns; k++)    //   for each of my columns:
          sum += (*this)[i][k] * mat2[k][j];  //     sum the products
       mat3[i][j] = sum;                      //    put sum in result Matrix
    }
  return mat3;                                // return result matrix
}

