C++ 程序没错 ,可是逻辑错了。算法是实现2个矩阵相乘; 求助大神
#include<iostream>#include<time.h>#include<cstdlib>#include<iomanip>usingnamespacestd...
#include<iostream>
#include<time.h>
#include<cstdlib>
#include<iomanip>
using namespace std;
class Matrix{
private:
int row;
int col;
int **p;
int num;
public:
Matrix(){p=NULL;row=0;col=0;}
Matrix(int x,int y);//矩阵的元素随即
Matrix(int x,int y,int n); //矩阵的元素都为num
~Matrix();
friend Matrix operator*(Matrix & m1,Matrix &m2);
void print();
};
void Matrix::print()
{
for(int i=0;i<row;i++)
for(int j=0;i<col;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
Matrix::Matrix(int x,int y){
int i,j;
srand((unsigned)time(0));
row=x;
col=y;
p=new int *[x];
for( i=0;i<y;i++)
{ p[i]=new int [y];
}
for(i=0;i<x;i++)
for(j=0;j<y;j++)
{p[i][j]=rand()%10;}
}
Matrix::Matrix(int x,int y,int n){
int i,j;
row=x;
col=y;
p=new int *[x];
for( i=0;i<y;i++)
{ p[i]=new int [y];
}
for(i=0;i<x;i++)
for(j=0;j<y;j++)
{p[i][j]=n;}
}
Matrix operator*(Matrix & m1,Matrix &m2)//2个矩阵相乘
{
Matrix m;
int i,j,k;
m.row=m1.row;
m.row=m2.col;
m.p=new int *[m1.row];
for( i=0;i<m2.col;i++)
{m.p[i]=new int [m2.col];
}
for(i=0;i<m.row;i++)
for(j=0;j<m.col;j++)
{m.p[i][j]=0;}
for(i=0;i<m1.row;i++)
for(j=0;j<m1.col;j++)
for(k=0;k<m2.col;k++)
{m.p[i][k]+=m1.p[i][j]*m2.p[j][k];
}
return m;
}
Matrix::~Matrix()
{ int i;
if(p!=NULL)
{
for(i=0;i<row;i++)
delete p[i];
delete p;
p=NULL;
}
}
int main()
{
Matrix m1(4,4,1),m2(4,4,3),m;
m=m1*m1;
m.print();
return 0;
} 展开
#include<time.h>
#include<cstdlib>
#include<iomanip>
using namespace std;
class Matrix{
private:
int row;
int col;
int **p;
int num;
public:
Matrix(){p=NULL;row=0;col=0;}
Matrix(int x,int y);//矩阵的元素随即
Matrix(int x,int y,int n); //矩阵的元素都为num
~Matrix();
friend Matrix operator*(Matrix & m1,Matrix &m2);
void print();
};
void Matrix::print()
{
for(int i=0;i<row;i++)
for(int j=0;i<col;j++)
cout<<p[i][j]<<"\t";
cout<<endl;
}
Matrix::Matrix(int x,int y){
int i,j;
srand((unsigned)time(0));
row=x;
col=y;
p=new int *[x];
for( i=0;i<y;i++)
{ p[i]=new int [y];
}
for(i=0;i<x;i++)
for(j=0;j<y;j++)
{p[i][j]=rand()%10;}
}
Matrix::Matrix(int x,int y,int n){
int i,j;
row=x;
col=y;
p=new int *[x];
for( i=0;i<y;i++)
{ p[i]=new int [y];
}
for(i=0;i<x;i++)
for(j=0;j<y;j++)
{p[i][j]=n;}
}
Matrix operator*(Matrix & m1,Matrix &m2)//2个矩阵相乘
{
Matrix m;
int i,j,k;
m.row=m1.row;
m.row=m2.col;
m.p=new int *[m1.row];
for( i=0;i<m2.col;i++)
{m.p[i]=new int [m2.col];
}
for(i=0;i<m.row;i++)
for(j=0;j<m.col;j++)
{m.p[i][j]=0;}
for(i=0;i<m1.row;i++)
for(j=0;j<m1.col;j++)
for(k=0;k<m2.col;k++)
{m.p[i][k]+=m1.p[i][j]*m2.p[j][k];
}
return m;
}
Matrix::~Matrix()
{ int i;
if(p!=NULL)
{
for(i=0;i<row;i++)
delete p[i];
delete p;
p=NULL;
}
}
int main()
{
Matrix m1(4,4,1),m2(4,4,3),m;
m=m1*m1;
m.print();
return 0;
} 展开
1个回答
展开全部
print 函数内层循环的 j<col 错写成了 i<col
其它问题进一步发现中……
在相乘函数中
对m.col 的定义错写成了 m.row
貌似改变行数或列数就出错了,不得其解
你还应该写一个 复制构造函数
Matrix(Matrix & a)
{
row=a.row;
col=a.col;
num=a.num;
p=new int *[row];
for(int i=0;i<row;i++)
{
p[i]=new int [col];
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
p[i][j]=a.p[i][j];
}
因为按着默认的复制构造函数,在相乘函数返回值时,传递的是p**的地址;而不是具体数值;在函数消亡后,再用这个地址将找不到求得的矩阵;
那个相乘函数的*pp的重新定义也有问题,是不是行列循环变量错了?
建议改为:
m.p=new int *[m1.row];
for( i=0;i<m1.row;i++)
{
m.p[i]=new int [m2.col];
}
经测试,貌似执行析构函数时会出错。总之系统会自己析构,不妨先不写。(囧囧囧,没怎么写过析构函数)
最后,矩阵的运算应该是这样
m.p[i][j]+=(m1.p[i][k]*m2.p[k][j]);
大哥,你那个main()函数里倒是写对了啊,你写一个m1*m1,我调试了20多分钟,我觉着
m.p[i][j]+=(m1.p[i][k]*m2.p[k][j]); 这个逻辑没问题了,可总得
4 4 4 4
4 4 4 4
4 4 4 4
4 4 4 4
差点急出病了,回过头一看,您写的是m1*m1啊!!!
至此,这个程序已经基本能正确运行了。
小弟只能帮你到这了
其它问题进一步发现中……
在相乘函数中
对m.col 的定义错写成了 m.row
貌似改变行数或列数就出错了,不得其解
你还应该写一个 复制构造函数
Matrix(Matrix & a)
{
row=a.row;
col=a.col;
num=a.num;
p=new int *[row];
for(int i=0;i<row;i++)
{
p[i]=new int [col];
}
for(int i=0;i<row;i++)
for(int j=0;j<col;j++)
p[i][j]=a.p[i][j];
}
因为按着默认的复制构造函数,在相乘函数返回值时,传递的是p**的地址;而不是具体数值;在函数消亡后,再用这个地址将找不到求得的矩阵;
那个相乘函数的*pp的重新定义也有问题,是不是行列循环变量错了?
建议改为:
m.p=new int *[m1.row];
for( i=0;i<m1.row;i++)
{
m.p[i]=new int [m2.col];
}
经测试,貌似执行析构函数时会出错。总之系统会自己析构,不妨先不写。(囧囧囧,没怎么写过析构函数)
最后,矩阵的运算应该是这样
m.p[i][j]+=(m1.p[i][k]*m2.p[k][j]);
大哥,你那个main()函数里倒是写对了啊,你写一个m1*m1,我调试了20多分钟,我觉着
m.p[i][j]+=(m1.p[i][k]*m2.p[k][j]); 这个逻辑没问题了,可总得
4 4 4 4
4 4 4 4
4 4 4 4
4 4 4 4
差点急出病了,回过头一看,您写的是m1*m1啊!!!
至此,这个程序已经基本能正确运行了。
小弟只能帮你到这了
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询