Link to home
Start Free TrialLog in
Avatar of edelossantos
edelossantos

asked on

2x2 matrix math class

#ifndef MAT_H
#define MAT_H

// 2x2 Matrix Math

class Matrix {

public:

      Matrix(int=1, int=0, int=0, int=1);
      Matrix(const Matrix &m);
      Matrix &operator = (const Matrix &m);
      Matrix matriAdd(const Matrix &m) const;
      Matrix matriSub(const Matrix &m) const;
      Matrix matriMul(const Matrix &m) const;
                Matrix matriDiv(const Matrix &m) const;
      int getElement(void);
      void setElement(void);
      double &operator () int i, int j);
      void matriPrint() const;
        void matriClear() const;

private:

      int width;
      int height;
      
      double *data;

};

#endif#include <iostream>

using namespace std;

#include "mat.h"

Matrix::Matrix() {width=0; height=0; data=0;}

Matrix::Matrix(intw, int h) {

      width = w;
      height = h;

      date = new double[width*height];

}

Matrix::Matrix(const Matrix &m) {

      width = m.width;
      height = m.height;

      date = new double[width*height];

      for(int k=0; k < width*height; k++)
         data[k] = m.data[k];

}

Matrix::~Matrix() {

      delete[] data;

}

bool Matrix::operator == (const Matrix &m) const {

      if(width != m.width || height != m.height)

      return false;

      for(int k=0; k < width*height; k++)
         if(data[k] != m.data[k])
            return false;

      return true;

}

Matrix &Matrix::operator = (const Matrix &m) {

      if(&m != this) {
        delete[] data;

        width = m.width; height = m.height;
        data = new double[width*height];

        for(int k=0; k < width*height; k++)
           data[k] = m.data[k];

      }

      return *this;

}

Matrix Matrix::operator+(const Matrix &m) const {

      if(width != m.width; || height != m.height) {
        cerr << "Size error!\n";
      
      abort();

}

Matrix result(width, height);

      for(int k=0; k < width*height; k++)
         result.data[k] = data[k] + m.data[k];

      return result;

}

Matrix Matrix::operator*(const Matrix &m) const {

      if(width != m.height) {
        cerr << "Size error!\n";

      abort();

      }

      Matrix result(m.width, height);

            for(int i=0; i < m.width; i++0
               for(int j=0; j < height; j++) {
                  double s = 0;

                  for(int k=0; k < width; k++)
                        s += data[k+j*width]*m.data
                        [i + m.width*k];
                        result.data[i + m.width*j] = s;

               }

      return result;

}

double &Matrix::operator() (int i, int j) {

      if(i < 0 || i >= width || j < 0 || j >= height) {
        cerr << "Out of bounds!\n";

      abort();

      }

      return data[i + width*j];

}

void Matrix::print() const {

      for(int j=0; j < height; j++) {
         for(int i=0; i < width; i++)
            cout << " " << data[i + width * j];

      cout << "\n";

      }

}
               




#include <iostream>

using namespace std;

#include "mat.h"

int main(int argc, char **argv) {

      Matrix m(3,2), n(5,3);

      m(0,0) = 2.0; m(1,0) = 0.0; m(2,0) = 0.0;
      m(0,1) = 2.0; m(1,1) = 0.0; m(2,1) = 0.0;

      n(0,0) = 1.0; n(1,0) = 2.0; n(2,0) = 3.0; n(3,0)
      = 4.0; n(4,0) = 5.0;

      n(0,1) = 2.0; n(1,1) = 3.0; n(2,1) = 4.0; n(3,1)
      = 5.0; n(4,1) = 6.0;

      n(0,2) = 3.0; n(1,2) = 4.0; n(2,2) = 5.0; n(3,2)
      = 6.0; n(4,2) = 7.0;

      Matrix x = m*n;

      x.print();

}

I need to write a program that consists of a 2x2 array that uses member functions add, sub, mul, and div.  Need help, need program to follow the functions in the header.  As you can see, I am having trouble putting 2 and 2 together.  Please advise.  Thank you.  Del      
      



Avatar of Axter
Axter
Flag of United States of America image

Is this homework?

If this is not homework, why re-invent the wheel.

Check out the following links:
Matrix class implemented using valarrays:
http://www.hep.ucl.ac.uk/atlas/atlfast/Doxygen/5.1.0/AtlfastUtils-00-00-10/Matrix_8h-source.html

blitz++:
http://www.oonumerics.org/blitz/ 

newmat:
http://www.robertnz.net/nm_intro.htm

Matrix Template Library (MTL):
http://www.osl.iu.edu/research/mtl/

boost libray multi-array class:
http://www.boost.org/libs/multi_array/doc/user.html
Also

("C++ library for "tiny" vectors and matrices with expression templates")
http://tvmet.sourceforge.net/

("Numerical Matrix/Vector Classes in C++ ")
http://math.nist.gov/mv++

ASKER CERTIFIED SOLUTION
Avatar of Axter
Axter
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of edelossantos
edelossantos

ASKER

Yes, this is homework and this is what I have put together.  Need help in fine tunning the program so it will run.  Any ideas, please advise.  Del