参考这篇,你不需要实现的可以删除。:https://wenwen.sogou.com/z/q796148306.htm?spver=1
如有帮助,望采纳。
Matrix.h
#include "iostream"
using namespace std;
class Matrix
{
private:
int row, list;
double **HL;
public:
Matrix(int r_ = 0, int l_ = 0);
Matrix(int r_, int l_, double **newone);
Matrix(const Matrix & rhs);
~Matrix();
Matrix operator + (const Matrix & rhs);
Matrix operator - (const Matrix & rhs);
Matrix operator = (const Matrix & rhs);
Matrix operator * (const Matrix & rhs);
friend ostream & operator << (ostream & os, const Matrix & rhs);
};
Matrix.cpp
#include "Matrix.h"
int i, j;
Matrix::Matrix(int r_, int l_):row(r_),list(l_)
{
HL = new double *[row];
for(i = 0; i < row; i++)
{
HL[i] = new double [list];
}
cout<<"please enter Matrix :"<<endl;
for(i = 0; i < row; i++)
{
for(j=0; j<list; j++)
{
cin>>HL[i][j];
}
}
}
Matrix::Matrix(int r_, int l_, double **newone):row(r_),list(l_) //构造函数重载,
//主要用于加法减法的return使用
{
HL = new double *[row];
for(i = 0; i< row; i++)
{
HL[i] = new double [list];
}
for(i = 0; i <row; i++)
{
for(j = 0; j<list; j++)
{
HL[i][j] = newone[i][j];
}
}
}
Matrix::Matrix(const Matrix & rhs)
{
if(this != & rhs)
{
this->row = rhs.row;
this->list = rhs.list;
HL = new double *[row];
for(i = 0; i<row; i++)
{
HL[i] = new double [list];
}
for(i = 0; i<row; i++)
{
for(j = 0; j<list; j++)
{
this->HL[i][j] = rhs.HL[i][j];
}
}
}
}
Matrix::~Matrix() //析构函数,删除开辟的空间
{
cout<<"~ Matrix : row = "<<row<<", list = "<<list<<endl<<endl;
for(i = 0; i<row; i++)
{
delete [] HL[i];
}
delete [] HL;
}
Matrix Matrix::operator + (const Matrix & rhs)
{
if( (this->row == rhs.row) && (this->list == rhs.list))
{
double **newone;
int r_, l_;
r_ = row; l_ = list;
newone = new double *[row];
for(i = 0; i < row; i++)
{
newone[i] = new double [list];
}
for(i = 0; i < row; i++)
{
for(j = 0; j<list; j++)
{
newone[i][j] = HL[i][j]+rhs.HL[i][j];
}
}
return Matrix(r_, l_, newone);
}
}
Matrix Matrix::operator - (const Matrix & rhs)
{
if((this->row == rhs.row) && (this->list == rhs.list))
{
double **newone;
int r_, l_;
r_ = row; l_ = list;
newone = new double *[row];
for(i = 0; i<row;i++)
{
newone[i] = new double [list];
}
for(i=0;i<row;i++)
{
for(j = 0; j<list; j++)
{
newone[i][j] = HL[i][j]+rhs.HL[i][j];
}
}
return Matrix(r_, l_, newone);
}
}
Matrix Matrix::operator * (const Matrix& rhs)
{
if((this->row = rhs.row) && (this->list = rhs.list))
{
double **newone;
int r_, l_;
r_ = row; l_ = list;
newone = new double *[row];
for(i = 0; i<row; i++)
{
newone[i]=new double [list];
}
for(i = 0;i<row;i++)
{
for(j = 0; j<list; j++)
{
newone[i][j]=0;
if(i == j)
{
for(int k = 0; k<list; k++)
{
newone[i][j] = newone[i][j] + HL[i][k]*rhs.HL[k][j];
}
}
else
{
for(int k = 0; k<list; k++)
{
newone[i][j] = newone[i][j] + HL[i][k]*rhs.HL[k][j];
}
}
}
}
return Matrix(r_,l_,newone);
}
}
Matrix Matrix::operator = (const Matrix & rhs)
{
if((this->row = rhs.row) && (this->list == rhs.list))
{
for(i = 0; i<row; i++)
{
for(j = 0; j<list; j++)
{
this->HL[i][j] = rhs.HL[i][j];
}
}
return (*this);
}
}
ostream & operator << (ostream & os, const Matrix & rhs)
{
os<<"Matrix: row="<<rhs.row<<" , list = "<<rhs.list<<endl;
for(i = 0; i<rhs.row; i++)
{
for(j = 0; j<rhs.list; j++)
{
os<<rhs.HL[i][j]<<" ";
}
os<<endl;
}
return os;
}
int main()
{
int m,n,x,y;
cin>>n>>m>>x>>y;
Matrix aa(n,m), bb(n,m), cc(n,m), dd(x,y);
cout<<endl<<aa<<endl<<bb<<endl<<cc<<endl<<dd<<endl;
cout<<(aa+bb+cc)<<endl<<(cc*bb)<<endl;
return 0;
}
这是C语言版本
/*
m1和m2为两个相加的数组首元素地址,r和c为两个数组的行数和列数
m用于存放结果。
调用该函数时,要求m为有足够存储单元、能容纳运算结果的数组首元素地址
*/
void add(int *m,int *m1,int *m2,int r,int c);
void sub(int *m,int *m1,int *m2,int r,int c);
void mult(int *m,int *m1,int *m2,int r,int p,int c);
void disp(int *m,int r,int c);
void main()
{
int a[3][4]={{2,4,6,8},{1,3,5,7},{11,33,44,22}};
int b[3][4]={{2,-4,6,-8},{-1,3,-5,7},{11,-33,-44,22}};
int c[4][3]={{2,4,6},{1,3,5},{1,0,3},{0,2,4}};
int d[3][4]={0};
int e[3][3]={0};
printf("\nA(3x4):\n");
disp(a[0],3,4);
printf("\nB(3x4):\n");
disp(b[0],3,4);
add(d[0],a[0],b[0],3,4);
printf("\nD(3x4)=A+B:\n");
disp(d[0],3,4);
sub(d[0],a[0],b[0],3,4);
printf("\nD(3x4)=A-B:\n");
disp(d[0],3,4);
printf("\nA(3x4):\n");
disp(a[0],3,4);
printf("\nC(4x3):\n");
disp(c[0],4,3);
mult(e[0],a[0],c[0],3,4,3);
printf("\nE(3x3)=A*C:\n");
disp(e[0],3,3);
}
void add(int *m,int *m1,int *m2,int r,int c){
int i,j;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
*(m+i*c+j) = *(m1+i*c+j) + *(m2+i*c+j);
}
void sub(int *m,int *m1,int *m2,int r,int c){
int i,j;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
*(m+i*c+j) = *(m1+i*c+j) - *(m2+i*c+j);
}
void mult(int *m,int *m1,int *m2,int r,int p,int c){
int i,j,k,t;
for(i=0; i<r; i++)
for(j=0; j<c; j++)
{
t=0;
for(k=0; k<p; k++)
t += *(m1+i*p+k) * *(m2+k*c+j);
*(m+i*c+j)=t;
}
}
void disp(int *m,int r,int c)
{
int i,j;
for(i=0; i<r; i++)
{
for(j=0; j<c; j++)
printf("%6d",*(m+i*c+j));
printf("\n");
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps: 问答会员年卡【8折】购 ,限时加赠IT实体书,即可 享受50次 有问必答服务,了解详情>>>https://t.csdnimg.cn/RW5m