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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章