稀疏矩阵的转置相加相乘的c++代码求帮忙
稀疏矩阵的转置相加相乘的C++实现求帮忙指出错误
#include <iostream>
#include <iomanip>
using namespace std;
template<typename T> //三元组
struct sanyuanzu
{
int row;
int col;
T val;
};
template<typename T>
class juzhen
{
private:
sanyuanzu<T>* pt;
int rows;
int cols;
int terms;
int maxsize;
public:
//juzhen()
void write(int ro,int co,int maxnum)
{
terms=0;
rows=ro;
cols=co;
pt=new sanyuanzu<T>[maxnum];
maxsize=maxnum;
}
void input()//矩阵数据的输入。
{
cout<<"矩阵数据"<<endl;
for (int i=0;i<rows;i++)
{
for (int j=0;j<cols;j++)
{ T number;
cin>>number;
if (number!=0)
{
pt[terms].row=i+1;
pt[terms].col=j+1;
pt[terms].val=number;
terms++;
}
}
}
}
void output()//矩阵数据的输出。
{
int i,j;
T** qt=new T*[rows];
for(i=0;i<rows;i++)
{
qt[i]=new T[cols];
}
for( i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
qt[i][j]=0;
}
for( i=0;i<terms;i++)
{
qt[pt[i].row-1][pt[i].col-1]=pt[i].val;
}
for(i=0;i<rows;i++)
{
for( j=0;j<cols;j++)
{
cout<<setw(4)<<qt[i][j];
}
cout<<endl;
}
for (i=0;i<rows;i++)
{
delete[] qt[i];
}
delete qt;
cout<<endl;
}
bool Transposeto(juzhen& B)//矩阵的转置
{
if(terms>0)
{
B.write(cols,rows,terms);
for(int i=0;i<terms;i++)
{
B.pt[i].row=pt[i].col;
B.pt[i].col=pt[i].row;
B.pt[i].val=pt[i].val;
B.terms++;
}
return true;
}
else
return false;
}
juzhen operator +(juzhen&t)//两个矩阵相加
{
if(rows==t.rows&&cols==t.cols)
{
juzhen t1;
t1.write(rows,cols,terms+t.terms);
int i,j;
for(i=0;i<terms;i++)
{
int flg=0;
for(j=0;j<t.terms;j++)
{
if(pt[i].row==t.pt[j].row&&pt[i].col==t.pt[j].col)
{
t1.pt[terms].val=pt[i].val+t.pt[j].val;
t1.pt[terms].row=pt[i].row;
t1.pt[terms].col=pt[i].col;
t1.terms++;
flg=1;
}
}
if(flg==0)
{
t1.pt[terms].val=pt[i].val+0;
t1.pt[terms].row=pt[i].row;
t1.pt[terms].col=pt[i].col;
t1.terms++;
}
}
for(i=0;i<t.terms;i++)
{
int flg=0;
for(j=0;j<terms;j++)
{
if(t.pt[i].row==pt[j].row&&t.pt[i].col==pt[j].col)
{
flg=1;
}
}
if(flg==0)
{
t1.pt[terms].val=t.pt[i].val+0;
t1.pt[terms].row=t.pt[i].row;
t1.pt[terms].col=t.pt[i].col;
t1.terms++;
}
}
return t1;
}
else
cout<<"这两个矩阵不能相加."<<endl;
}
juzhen operator *(juzhen&jt)
{
if(cols==jt.rows)
{
int i,j,k;
T**qt=new T*[rows];
for(i=0;i<rows;j++)
qt[i]=new T[jt.cols];
T**t1=new T*[rows];//t1是用来动态构建二维数组的指针
for(i=0;i<rows;i++)
t1[i]=new T[cols];
T**t2=new T*[jt.rows];//t2(j)
for(i=0;i<jt.rows;i++)
t2[i]=new T[jt.cols];
for(i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
t1[i][j]=0;
}
}
for(i=0;i<terms;i++)
t1[pt[i].row-1][pt[i].col-1]=pt[i].val;
for(i=0;i<jt.rows;i++)
{
for(j=0;j<jt.cols;j++)
t2[i][j]=0;
}
for(i=0;i<jt.terms;i++)
t2[jt.pt[i].row-1][jt.pt[i].col-1]=jt.pt[i].val;
for(i=0;i<rows;i++)//两个矩阵相乘算法
{
for(j=0;j<jt.cols;j++)
{
T num=t1[i][0]*t2[0][j];
for(k=1;k<cols;k++)
{
num=num+t1[i][k]*t2[k][j];
}
qt[i][j]=num;
}
}
int number=0;
for(i=0;i<rows;i++)
{
for(j=0;j<jt.cols;j++)
{
if(qt[i][j]!=0)
number++;
}
}
juzhen tem;
tem.write(rows,jt.cols,number);
for (i=0;i<rows;i++)
{
for (j=0;j<jt.cols;j++)
{
if (qt[i][j]!=0)
{
tem.pt[terms].row=i+1;
tem.pt[terms].col=j+1;
tem.pt[terms].val=qt[i][j];
tem.terms++;
}
}
}
return tem;
}
else
cout<<"这个两个矩阵不能相乘."<<endl;
}
};
int main()
{
cout<<"选择功能."<<endl;
cout<<"1.矩阵转置."<<" "<<"2.两个矩阵相加."<<" "<<"3.两个矩阵相乘."<<endl;
int n;
while(cin>>n&&n!=0)//输入0程序结束
{
if(n==1)
{
cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
int ro,co,nu;
cin>>ro>>co>>nu;
juzhen<int> te1;
te1.write(ro,co,nu);
te1.input();
juzhen<int> te2;
te1.Transposeto(te2);
te2.output();
}
if(n==2)
{
cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
int ro1,co1,nu1;
cin>>ro1>>co1>>nu1;
juzhen<int> te1;
te1.write(ro1,co1,nu1);
te1.input();
cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
int ro2,co2,nu2;
cin>>ro2>>co2>>nu2;
juzhen<int> te2;
te2.write(ro2,co2,nu2);
te2.input();
juzhen<int> &te3=te1+te2;
te3.output();
}
if(n==3)
{
cout<<"输入矩阵的行和列,以及除零以外矩阵的元素个数"<<endl;
int ro1,co1,nu1;
cin>>ro1>>co1>>nu1;
juzhen<int> te1;
te1.write(ro1,co1,nu1);
te1.input();
cout<<"输入矩阵的行和列,以及除零以外矩阵的元素个数"<<endl;
int ro2,co2,nu2;
cin>>ro2>>co2>>nu2;
juzhen<int> te2;
te2.write(ro2,co2,nu2);
te2.input ();
juzhen<int>& te3= te1*te2;
te3.output();
}
}
return 0;
}
[解决办法]
若用于工作,建议使用比较成熟的库,比如:eigen
http://eigen.tuxfamily.org/dox/group__TutorialSparse.html
[解决办法]
在加法中,所有t1.pt[terms]改为t1.pt[t1.terms]:
juzhen operator +(juzhen&t)//两个矩阵相加
{
if(rows==t.rows&&cols==t.cols)
{
juzhen t1;
t1.write(rows,cols,terms+t.terms);
int i,j;
for(i=0;i<terms;i++)
{
int flg=0;
for(j=0;j<t.terms;j++)
{
if(pt[i].row==t.pt[j].row&&pt[i].col==t.pt[j].col)
{
t1.pt[t1.terms].val=pt[i].val+t.pt[j].val;//t1.pt[terms].val=pt[i].val+t.pt[j].val;
t1.pt[t1.terms].row=pt[i].row;//t1.pt[terms].row=pt[i].row;
t1.pt[t1.terms].col=pt[i].col;//t1.pt[terms].col=pt[i].col;
t1.terms++;
flg=1;
}
}
if(flg==0)
{
t1.pt[t1.terms].val=pt[i].val+0;//t1.pt[terms].val=pt[i].val+0;
t1.pt[t1.terms].row=pt[i].row;//t1.pt[terms].row=pt[i].row;
t1.pt[t1.terms].col=pt[i].col;//t1.pt[terms].col=pt[i].col;
t1.terms++;
}
}
for(i=0;i<t.terms;i++)
{
int flg=0;
for(j=0;j<terms;j++)
{
if(t.pt[i].row==pt[j].row&&t.pt[i].col==pt[j].col)
{
flg=1;
}
}
if(flg==0)
{
t1.pt[t1.terms].val=t.pt[i].val+0;//t1.pt[terms].val=t.pt[i].val+0;
t1.pt[t1.terms].row=t.pt[i].row;//t1.pt[terms].row=t.pt[i].row;
t1.pt[t1.terms].col=t.pt[i].col;//t1.pt[terms].col=t.pt[i].col;
t1.terms++;
}
}
return t1;
}
else
cout<<"这两个矩阵不能相加."<<endl;
}