稀疏矩阵转置和乘法操作
一.稀疏矩阵转置
第一行输入一个矩阵的行数m列数n非零元个数t.
接下来t行输入每个非零元的三元组。
样例输入
5 5 4
1 3 5
1 4 8
2 1 8
2 3 7
样例输出
1 2 8
3 1 5
3 2 7
4 1 8
代码:
#include<iostream>
using namespace std;
typedef struct
{
int row,col,ele;
}node1;
int k=0,p=0,flag=0,e=0;
typedef struct
{
int tm,tn,tu;
node1 data[100];
}node2;
int main()
{
int k=0;
node2 a,b;
cout<<"请输入矩阵的行列非零元个数:";
cin>>a.tm>>a.tn>>a.tu;
b.tm=a.tn;
b.tn=a.tm;
b.tu=a.tu;
cout<<"请输入矩阵的非零元组:"<<endl;
for(int i=0;i<a.tu;i++)
cin>>a.data[i].row>>a.data[i].col>>a.data[i].ele;
for(int i=1;i<=a.tn;i++)
for(int j=0;j<a.tu;j++)
{
if(a.data[j].col==i) //排序操作
{
b.data[k].row=a.data[j].col;
b.data[k].col=a.data[j].row;
b.data[k].ele=a.data[j].ele;
k++;
}
}
cout<<"转置后矩阵的三元组表为:"<<endl;
for(int i=0;i<b.tu;i++)
cout<<b.data[i].row<<" "<<b.data[i].col<<" "<<b.data[i].ele<<endl;
return 0;
}
二.稀疏矩阵乘法
输入一个矩阵的行数m1列数n1非零元个数t1.
接下来t行输入每个非零元的三元组。
输入一个矩阵的行数m2列数n2非零元个数t2.
接下来t2行输入每个非零元的三元组。
样例输入
4 3 4
1 3 1
2 1 2
2 3 3
3 2 2
3 4 4
1 1 1
1 3 1
3 1 3
4 2 1
样例输出
1 1 3
2 1 11
2 3 2
关系式:
k从1到矩阵的列数。
找到第一个矩阵列与第二个矩阵行相同,进行该位置数值相乘,最后注意合并相同位置的数。
代码:
#include<iostream>
using namespace std;
typedef struct
{
int row,col,ele;
}node1;
int k=0,p=0,flag=0,e=0;
typedef struct
{
int tm,tn,tu;
node1 data[100];
}node2;
int main()
{
node2 a,b,c;
cout<<"输入矩阵a的行数列数非零元数:";
cin>>a.tm>>a.tn>>a.tu;
cout<<"输入矩阵a三元表:"<<endl;
for(int i=0;i<a.tu;i++)
{
cin>>a.data[i].row>>a.data[i].col>>a.data[i].ele;
} cout<<"输入矩阵b的行数列数非零元数:";
cin>>b.tm>>b.tn>>b.tu;
cout<<"输入矩阵b三元表:"<<endl;
for(int i=0;i<b.tu;i++)
{
cin>>b.data[i].row>>b.data[i].col>>b.data[i].ele;
}
c.tm=a.tm;
c.tn=b.tn;
if(a.tn!=b.tm)
cout<<a.tn<<"!="<<b.tm<<"无法相乘";
else
{
for(int i=0;i<a.tu;i++)
for(int j=0;j<b.tu;j++)
{
if(a.data[i].col==b.data[j].row)
{
if(k==0){
c.data[k].row=a.data[i].row;
c.data[k].col=b.data[j].col;
c.data[k].ele=a.data[i].ele*b.data[j].ele;
k++;
}
else{
for( p=0;p<k;p++)
{
if(a.data[i].row==c.data[p].row&&b.data[j].col==c.data[p].col)
{c.data[p].ele+=a.data[i].ele*b.data[j].ele;flag=1;}
}
if(flag==0){
c.data[k].row=a.data[i].row;
c.data[k].col=b.data[j].col;
c.data[k].ele=a.data[i].ele*b.data[j].ele;
k++;
}
}
}
}
node2 d;
for(int i=1;i<=c.tm;i++) //三元组表排序
for(int j=0;j<k;j++)
{
if(c.data[j].row==i)
{
d.data[e].row=c.data[j].row;
d.data[e].col=c.data[j].col;
d.data[e].ele=c.data[j].ele;
e++;
}
}
cout<<"相乘后的矩阵c三元表为"<<endl;
for(int o=0;o<e;o++)
cout<<d.data[o].row<<" "<<d.data[o].col<<" "<<d.data[o].ele<<endl;
}
return 0;
}