野狼最新地址:c++开发3×3矩阵类Matrix3,以及实现相关操作

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/09 04:39:49
开发3×3矩阵类Matrix3,矩阵的数据用二维浮点数组表示,
包括构造函数、析构函数以及“get”函数(读取某行某列的数据值)和“set”函数(设置某行某列的数据值)。该类还要提供以下重载的运算符:
(1)重载加法运算符+,将两个矩阵相加。
(2)重载加法运算符-,将两个矩阵相减。
(3)重载赋值运算符=,将一个矩阵赋给另外一个矩阵。
(4)重载加法运算符*,将两个矩阵相乘。
(5)添加函数Det以得到矩阵对应行列式的值。
(6)矩阵转置
对所有功能进行测试。

#include <iostream>
#include <string.h>

using namespace std;

class Matrix3
{
public:
Matrix3();
Matrix3(const double arr[][3]);
Matrix3(const Matrix3& mat);
Matrix3& operator= (const Matrix3& mat);
~Matrix3();

Matrix3 operator+ (const Matrix3& mat) const;
Matrix3 operator- (const Matrix3& mat) const;
Matrix3 operator* (const Matrix3& mat) const;

double Det() const;
Matrix3 T () const;

double Get(const int i,const int j) const { return mArray[i][j]; }
void Set(const int i,const int j,const double value) { mArray[i][j] = value; }
double operator() (const int i,const int j) const { return mArray[i][j]; }
double& operator() (const int i,const int j) { return mArray[i][j]; }

friend ostream& operator<< (ostream& o,const Matrix3& mat);
private:
double mArray[3][3];
};

Matrix3::Matrix3()
{
double arr[3][3] = {0};
memcpy(mArray,arr,sizeof(mArray));
}

Matrix3::~Matrix3()
{
}

Matrix3::Matrix3(const double arr[][3])
{
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
mArray[i][j] = arr[i][j];
//memcpy(mArray,arr,sizeof(mArray));
}

Matrix3::Matrix3(const Matrix3& mat)
{
memcpy(mArray,mat.mArray,sizeof(mArray));
}

Matrix3 Matrix3::operator+ (const Matrix3& mat) const
{
Matrix3 tmp;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
tmp.mArray[i][j] = mArray[i][j] + mat.mArray[i][j];
return tmp;
}

Matrix3 Matrix3::operator- (const Matrix3& mat) const
{
Matrix3 tmp;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
tmp.mArray[i][j] = mArray[i][j] - mat.mArray[i][j];
return tmp;
}

Matrix3 Matrix3::operator* (const Matrix3& mat) const
{
Matrix3 tmp;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
tmp.mArray[i][j] += mArray[i][k] * mat.mArray[k][j];
return tmp;
}

double Matrix3::Det() const
{
return mArray[0][0] * mArray[1][1] * mArray[2][2]
+ mArray[0][1] * mArray[1][2] * mArray[2][0]
+ mArray[1][0] * mArray[2][1] * mArray[0][2]
- mArray[0][2] * mArray[1][1] * mArray[2][0]
- mArray[0][1] * mArray[1][0] * mArray[2][2]
- mArray[1][2] * mArray[2][1] * mArray[0][0];
}

Matrix3 Matrix3::T () const
{
Matrix3 tmp;
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
tmp.mArray[i][j] = mArray[j][i];
return tmp;
}

Matrix3& Matrix3::operator= (const Matrix3& mat)
{
memcpy(mArray,mat.mArray,sizeof(mArray));
return (*this);
}

ostream& operator<< (ostream& o,const Matrix3& mat)
{
o << "[\n";
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
o << mat.mArray[i][j] << "\t";
o << endl;
}
o << "]";

return o;
}

void main()
{
double arr[3][3] = {1,2,3,4,5,6,7,8,9};
double arr2[3][3] = {9,8,7,6,5,4,3,2,1};
Matrix3 m1(arr),m2(arr2);
cout << "m1 = \n" << m1 << endl << endl;
cout << "m2 = \n" << m2 << endl << endl;
cout << "m1(1,1) = " << m1(1,1) << endl << endl;
m1(1,1) = 8;
cout << "set m1(1,1) = 8, then m1(1,1) = " << m1(1,1) << endl << endl;
cout << "m1 = \n" << m1 << endl << endl;
cout << "m1 + m2 = \n" << m1 + m2 << endl << endl;
cout << "m1 - m2 = \n" << m1 - m2 << endl << endl;
cout << "m1 * m2 = \n" << m1 * m2 << endl << endl;
cout << "Det(m1) = " << m1.Det() << endl << endl;
cout << "m1' = \n" << m1.T() << endl << endl;
m2 = m1;
cout << "set m2 = m1, then m2 = \n" << m2 << endl << endl;
}