帮忙找个错,关于运算符重载矩阵乘法

Vampierty 2011-12-01 06:48:32

#include "stdafx.h"
#include<iostream.h>
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数初始化data
{
m=mm;n=nn;
int i;
data=new double*[mm];
for(i=0;i<mm;i++)
data[i]=new double[nn];
} //构造M行N列的矩阵
Matrix(const Matrix &src) //重载拷贝构造函数
{
m=src.m;n=src.n;
int i,j;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
}
Matrix& operator=(const Matrix &src) //重载"="运算符
{
int i,j;
for(i=0;i<m;i++)
delete []data[i];
delete []data;
m=src.m;n=src.n;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
return *this;
}
~Matrix()//
{
for(int i=0;i<m;i++)
delete []data[i];
delete []data;
}
Matrix operator * (Matrix &m2); //矩阵乘法
void display();
void input();
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
Matrix m3(this->m,this->n);
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(int k=0;k<n;k++)
m3.data[i][j]+=data[i][k]*m2.data[k][j];
return m3;
}
void Matrix::input()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
}
void Matrix::display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}
int main(int argc, char* argv[])
{
int x,y;
cout<<"行数:";
cin>>x;
cout<<"列数:";
cin>>y;
Matrix A(x,y);
cout<<"please input "<<x*y<<"numbers"<<endl;
A.input();
A.display();
cout<<"行数:";
cin>>x;
cout<<"列数:";
cin>>y;
Matrix B(x,y);
cout<<"please input "<<x*y<<"numbers"<<endl;
B.input();
B.display();
Matrix C(y,x);
C=A*B;
C.display();
return 0;
}
运行后得到的是这个样子:
-6.27744e+066 -6.27744e+066 -6.27744e+066
-6.27744e+066 -6.27744e+066 -6.27744e+066
-6.27744e+066 -6.27744e+066 -6.27744e+066
不知道哪里出问题了,这只是我程序的一部分,其他部分如加法、减法、矩阵转置都可以正常运行得到结果的~
...全文
89 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
nuaazdh 2011-12-01
  • 打赏
  • 举报
回复
抱歉,楼主,上面还是有错,改正后:
#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数
{
m=mm;
n=nn;
int i,j;
data=new double*[mm];
for(i=0;i<mm;i++)
data[i]=new double[nn];
for(i=0;i<m;i++)//矩阵所有元素清零
for(j=0;j<n;j++)
data[i][j]=0.0;
} //构造M行N列的矩阵

Matrix(const Matrix &src) //拷贝构造函数
{
m=src.m;
n=src.n;
int i,j;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)//动态数组赋值
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
}

~Matrix()//析构函数
{
for(int i=0;i<m;i++)
delete []data[i];
delete []data;
}
Matrix& operator=(const Matrix &src);//重载"="运算符
Matrix operator * (const Matrix &m2); //矩阵乘法
void display();
void input();
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束

Matrix& Matrix::operator=(const Matrix &src) //重载"="运算符
{
int i,j;
for(i=0;i<m;i++)
delete []data[i];
delete []data;
m=src.m;n=src.n;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
return *this;
}

//矩阵*运算符重载
Matrix Matrix::operator *(const Matrix &m2)//矩阵乘法的实现
{
Matrix m3(this->m,m2.n);
if(this->n!=m2.m)
{
cout<<"两矩阵无法进行乘法运算.\n"<<endl;
exit(0);
}
int i,j,k,l;
for(i=0;i<this->m;i++)
for(j=0;j<m2.n;j++)
{
for(k=0;k<this->n;k++)
{
m3.data[i][j]+=this->data[i][k]*m2.data[k][j];
}

}
m3.display();
return m3;
}

//输入矩阵元素
void Matrix::input()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
}

//显示矩阵元素
void Matrix::display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}

//主函数
int main(int argc, char* argv[])
{
int x,y;
cout<<"矩阵1行数:";
cin>>x;
cout<<"矩阵1列数:";
cin>>y;
Matrix A(x,y);
cout<<"请输入矩阵1元素(按行,共"<<x*y<<" 个)"<<endl;
A.input();
cout<<"矩阵1:"<<endl;
A.display();
cout<<"矩阵2行数:";
cin>>x;
cout<<"矩阵2列数:";
cin>>y;
Matrix B(x,y);
cout<<"请输入矩阵2元素(按行,共"<<x*y<<" 个)"<<endl;
B.input();
cout<<"矩阵2:"<<endl;
B.display();
Matrix C=A*B;
cout<<"矩阵1 与 矩阵2 的乘积:"<<endl;
C.display();
return 0;
}

Vampierty 2011-12-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nuaazdh 的回复:]

C/C++ code
#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数初始化data
{
m=mm;n=nn;
int i,j;
data=new double……
[/Quote]
正如你所说我确实对矩阵乘法想的太简单了,惭愧啊,以后还得多研究研究。看了你帮忙改的地方对我启发很大,程序也能正常运行得到结果,谢谢啦!
nuaazdh 2011-12-01
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数初始化data
{
m=mm;n=nn;
int i,j;
data=new double*[mm];
for(i=0;i<mm;i++)
data[i]=new double[nn];
for(i=0;i<m;i++)//矩阵所有元素清零
for(j=0;j<n;j++)
data[i][j]=0.0;
} //构造M行N列的矩阵
Matrix(const Matrix &src) //重载拷贝构造函数
{
m=src.m;n=src.n;
int i,j;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
}
Matrix& operator=(const Matrix &src) //重载"="运算符
{
int i,j;
for(i=0;i<m;i++)
delete []data[i];
delete []data;
m=src.m;n=src.n;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
return *this;
}
~Matrix()//
{
for(int i=0;i<m;i++)
delete []data[i];
delete []data;
}
Matrix operator * (Matrix &m2); //矩阵乘法
void display();
void input();
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束

//矩阵*运算符重载
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
Matrix m3(this->m,m2.n);
if(this->n!=m2.m)
{
cout<<"两矩阵无法进行乘法运算.\n"<<endl;
exit(0);
}
int i,j,k,l;
for(i=0;i<this->m;i++)
for(j=0;j<m2.n;j++)
{
for(k=0;k<this->n;k++)
for(l=0;l<m2.m;l++)
m3.data[i][j]+=this->data[i][k]*m2.data[l][j];
}

return m3;
}

//输入矩阵元素
void Matrix::input()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
}

//显示矩阵元素
void Matrix::display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}

//主函数
int main(int argc, char* argv[])
{
int x,y;
cout<<"矩阵1行数:";
cin>>x;
cout<<"矩阵1列数:";
cin>>y;
Matrix A(x,y);
cout<<"please input "<<x*y<<" numbers"<<endl;
A.input();
A.display();
cout<<"矩阵2行数:";
cin>>x;
cout<<"矩阵2列数:";
cin>>y;
Matrix B(x,y);
cout<<"please input "<<x*y<<" numbers"<<endl;
B.input();
B.display();
Matrix C(y,x);
C=A*B;
C.display();
return 0;
}

楼主矩阵乘法规则没有弄清除吧
nuaazdh 2011-12-01
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数初始化data
{
m=mm;n=nn;
int i,j;
data=new double*[mm];
for(i=0;i<mm;i++)
data[i]=new double[nn];
for(i=0;i<m;i++)//矩阵所有元素清零
for(j=0;j<n;j++)
data[i][j]=0.0;
} //构造M行N列的矩阵
Matrix(const Matrix &src) //重载拷贝构造函数
{
m=src.m;n=src.n;
int i,j;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
}
Matrix& operator=(const Matrix &src) //重载"="运算符
{
int i,j;
for(i=0;i<m;i++)
delete []data[i];
delete []data;
m=src.m;n=src.n;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
return *this;
}
~Matrix()//
{
for(int i=0;i<m;i++)
delete []data[i];
delete []data;
}
Matrix operator * (Matrix &m2); //矩阵乘法
void display();
void input();
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束

//矩阵*运算符重载
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
Matrix m3(this->m,m2.n);
if(this->n!=m2.m)
{
cout<<"两矩阵无法进行乘法运算.\n"<<endl;
exit(0);
}
int i,j,k,l;
for(i=0;i<this->m;i++)
for(j=0;j<m2.n;j++)
{
for(k=0;k<this->n;k++)
for(l=0;l<m2.m;l++)
m3.data[i][j]+=this->data[i][k]*m2.data[l][j];
}

return m3;
}

//输入矩阵元素
void Matrix::input()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
}

//显示矩阵元素
void Matrix::display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}

//主函数
int main(int argc, char* argv[])
{
int x,y;
cout<<"矩阵1行数:";
cin>>x;
cout<<"矩阵1列数:";
cin>>y;
Matrix A(x,y);
cout<<"please input "<<x*y<<" numbers"<<endl;
A.input();
A.display();
cout<<"矩阵2行数:";
cin>>x;
cout<<"矩阵2列数:";
cin>>y;
Matrix B(x,y);
cout<<"please input "<<x*y<<" numbers"<<endl;
B.input();
B.display();
Matrix C(y,x);
C=A*B;
C.display();
return 0;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧