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
#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
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++
("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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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
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