问题描述
问题描述:稀疏矩阵转置
设计思路
设计思路:稀疏矩阵中存在大量非零元素,直接转置执行时间较高。因而采用三元组表示。按照压缩的概念,只存储稀疏矩阵中的非零元素,除了存储非零元素的值之外,还必须同时记下它所在的行列位置。三元组表示法是用一个具有三个数据域的一维数组表示稀疏矩阵,每一行有三个字段,分别该元素的行下表、列下表和值。设A,B分别为某稀疏矩阵转置前后的三元组表,i为行下标,j为列下标,v味元素值。变量m为稀疏矩阵行数,n为稀疏矩阵列数,tu为非零元素个数。本算法要求把A中行下标、列下标交换后送到B中,并且使B中行下表仍按递增顺序存放。
数据结构:
i:行下标
j:列下标
v:元素值
tu:非零元素个数
A:转置前矩阵
B:转置后矩阵
Ai:转置前三元组
Bi:转置后三元组
t[0]:工作数组
算法描述:
TRANSMAT ( A , B)
- If( tu!=0) then
- { q<-1 //q为转置以后B的行号//
- for col=1 to n
- For p=1 to tu //p为转置前A的行号//
- If A[p].j=col then
- {B[q].i<-a[p].j; B[q].j<A[p].i;
- B[q].v<-A[p].v; q<-q+1}
- End(p)
- End(col)}
- return
测试用例及结果说明
测试用例:稀疏矩阵元素为
A[0][0]=3;
A[0][4]=7;
A[1][2]=-1;
A[2][0]=-1;
A[2][1]=-2;
A[4][3]=2;
测试结果:
转置前矩阵A:
3 0 0 0 7
0 0 -1 0 0
-1 -2 0 0 0
0 0 0 0 0
0 0 0 2 0
工作三元组Ai:
1 1 3
1 5 7
2 3 -1
3 1 -1
3 2 -2
5 4 2
工作三元组Bi:
1 1 3
1 3 -1
2 3 -2
3 2 -1
4 5 2
5 1 7
转置后矩阵:
3 0 -1 0 0
0 0 -2 0 0
0 -1 0 0 0
0 0 0 0 2
7 0 0 0 0
设计及测试过程
第一步:提出问题;
第二步:问题转换;
第三步:算法构思;
第四步:伪码描述;
第五步:代码编写;
第六步:代码测试;
第七步:代码修正;
参考书籍:
《计算机软件技术基础》 清华大学出版社 第三版
#include<iostream>
using namespace std;
#define N 5
struct node
{
int i;
int j;
int v;
}Ai[N*N],Bi[N*N],t[1];
int main()
{
int A[N][N],B[N][N],a,b,tu=0,i,j=0;
node *q;
for(a=0;a<N;a++)
for(b=0;b<N;b++)
{
A[a][b]=0;
B[a][b]=0;
}
A[0][0]=3;
A[0][4]=7;
A[1][2]=-1;
A[2][0]=-1;
A[2][1]=-2;
A[4][3]=2;
cout<<"转置前矩阵为"<<endl;
for(a=0;a<N;a++)
{
for(b=0;b<N;b++)
cout<<A[a][b]<<'\t';
cout<<endl;
}
for(a=0;a<N;a++)
for(b=0;b<N;b++)
if(A[a][b]!=0)
{
Ai[tu].i=a+1;
Ai[tu].j=b+1;
Ai[tu].v=A[a][b];
tu++;
}
cout<<"转置前矩阵等效三元组为"<<endl;
for(i=0;i<tu;i++)
cout<<Ai[i].i<<'\t'<<Ai[i].j<<'\t'<<Ai[i].v<<endl;
for(i=0;i<tu-1;i++)
{
int min=i;
for(j=i+1;j<tu;j++)
if(Ai[j].j<Ai[min].j)
min=j;
t[0].i=Ai[i].i;
t[0].j=Ai[i].j;
t[0].v=Ai[i].v;
Ai[i].i=Ai[min].i;
Ai[i].j=Ai[min].j;
Ai[i].v=Ai[min].v;
Ai[min].i=t[0].i;
Ai[min].j=t[0].j;
Ai[min].v=t[0].v;
}
for(i=0;i<tu;i++)
{
Bi[i].i=Ai[i].j;
Bi[i].j=Ai[i].i;
Bi[i].v=Ai[i].v;
}
cout<<"转置后矩阵等效三元组为"<<endl;
for(i=0;i<tu;i++)
cout<<Bi[i].i<<'\t'<<Bi[i].j<<'\t'<<Bi[i].v<<endl;
for(i=0;i<tu;i++)
{
a=Bi[i].i-1;
b=Bi[i].j-1;
B[a][b]=Bi[i].v;
}
cout<<"转置后矩阵为"<<endl;
for(a=0;a<N;a++)
{
for(b=0;b<N;b++)
cout<<B[a][b]<<'\t';
cout<<endl;
}
system("pause");
return 0;
}