C++_稀疏矩阵转置

问题描述

问题描述:稀疏矩阵转置

设计思路

设计思路:稀疏矩阵中存在大量非零元素,直接转置执行时间较高。因而采用三元组表示。按照压缩的概念,只存储稀疏矩阵中的非零元素,除了存储非零元素的值之外,还必须同时记下它所在的行列位置。三元组表示法是用一个具有三个数据域的一维数组表示稀疏矩阵,每一行有三个字段,分别该元素的行下表、列下表和值。设A,B分别为某稀疏矩阵转置前后的三元组表,i为行下标,j为列下标,v味元素值。变量m为稀疏矩阵行数,n为稀疏矩阵列数,tu为非零元素个数。本算法要求把A中行下标、列下标交换后送到B中,并且使B中行下表仍按递增顺序存放。

数据结构:

i:行下标

j:列下标

v:元素值

tu:非零元素个数

A:转置前矩阵

B:转置后矩阵

Ai:转置前三元组

Bi:转置后三元组

t[0]:工作数组

算法描述:

TRANSMAT ( A , B)

  1. If( tu!=0) then
  2. { q<-1 //q为转置以后B的行号//
  3.   for col=1 to n
  4.     For p=1 to tu //p为转置前A的行号//
  5.       If A[p].j=col then
  6.         {B[q].i<-a[p].j; B[q].j<A[p].i;
  7.           B[q].v<-A[p].v; q<-q+1}
  8.       End(p)
  9.    End(col)}
  10. 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;
}

 

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值