三元组表示稀疏矩阵的转置(一般算法和快速算法)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设计要求

1.1 问题描述

稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行存储和计算可以大大节省存储空间,提高计算效率。求一个稀疏矩阵A的转置矩阵B。

1.2需求分析

(1)以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现稀疏矩阵的转置运算。(2)稀疏矩阵的输入形式采用三元组表示,运算结果则以通常的阵列形式列出。

(3)首先提示用户输入矩阵的行数、列数、非零元个数,再采用三元组表示方法输入矩阵,然后进行转置运算,该系统可以采用两种方法,一种为一般算法,另一种为快速转置算法。(4)程序需要给出菜单项,用户按照菜单提示进行相应的操作。

二、概要设计

2.1存储结构设计

采用“带行逻辑链接信息”的三元组顺序表表示矩阵的存储结构。三元组定义为:typedef struct

{

int i;//非零元的行下标

int j;//非零元的列下标

ElemType e; //非零元素值

}Triple;

矩阵定义为:

Typedef struct

{

Triple data[MAXSIZE+1]; //非零元三元组表

int rpos[MAXRC+1]; //各行第一个非零元的位置表

int mu,nu,tu; //矩阵的行数、列数和非零元个数

}RLSMatrix;

例如有矩阵A,它与其三元组表的对应关系如图

2.2 系统功能设计

本系统通过菜单提示用户首先选择稀疏矩阵转置方法,然后提示用户采用三元组表示法输入数据创建一个稀疏矩阵,再进行矩阵的转置操作,并以通常的阵列形式输出结果。主要实现以下功能。

(1)创建稀疏矩阵。采用带行逻辑连接信息的三元组表表示法,提示用户输入矩阵的行数、列数、非零元个数以及各非零元所在的行、列、值。

(2)矩阵转置。<1>采用一般算法进行矩阵的转置操作,再以阵列形式输出转置矩阵B。

<2>采用快速转置的方法完成此操作,并以阵列形式输出转置矩阵B。

三、模块设计

3.1 模块设计

程序包括两个模块:主程序模块、矩阵运算模块。

3.2 系统子程序及其功能设计

系统共设置了8个子程序,各子程序的函数名及功能说明如下。

(1)CreateSMatrix(RLSMatrix &M) //创建稀疏矩阵

(2)void DestroySMatrix(RLSMatrix &M) //销毁稀疏矩阵

(3)void PrinRLSMatrix(RLSMatrix M) //遍历稀疏矩阵

(4)void print(RLSMatrix A) //打印矩阵函数,输出以阵列形式表示的矩阵

(5)TransposeSMatrix(RLSMatrix M,RLSMatrix &T) //求稀疏矩阵的转置的一般算法(6)FastTransposeSMatrix(RLSMatrix M,RLSMatrix &T) //快速转置算法

(7)void showtip() //工作区函数,显示程序菜单

(8)void main() //主函数

3.3 程序主要调用关系图

四、详细设计

4.1 数据类型定义

采用矩阵“带行逻辑连接信息”的三元组顺序表存储结构。

4.2 系统主要子程序详细设计

(1)主函数:

void main()

{

int result;

int j;

RLSMatrix A,B;

COORD Co={0,0};DWORD Write;

SetConsoleTitle("稀疏矩阵的转置");

HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGRO UND_INTENSITY);

FillConsoleOutputAttribute(hOut,FOREGROUND_RED|FOREGROUND_BLUE|FOREGR OUND_INTENSITY,100000000,Co,&Write);

///windows的API函数,用来设置控制台标题及颜色。

do

{

showtip(); //调用菜单函数

int i;

scanf("%d",&i);

switch(i)

{

case 1:

printf("创建矩阵A:");

if((result=CreateSMatrix(A))==0)

exit(ERROR);

printf("矩阵A的三元组表为:\n");

PrinRLSMatrix(A);

printf("求A的转置矩阵B(一般算法):\n");

TransposeSMatrix(A,B);

printf("矩阵B的三元组表为:\n");

PrinRLSMatrix(B);

printf("以通常的阵列形式输出转置前的矩阵A:\n");

print(A);

printf("\n\n");

printf("以通常的阵列形式输出转置后的矩阵B:\n");

print(B);

DestroySMatrix(B);

printf("\n\n");break;

case 2:

printf("创建矩阵A:");

if((result=CreateSMatrix(A))==0)

exit(ERROR);

printf("矩阵A的三元组表为:\n");

PrinRLSMatrix(A);

printf("求A的转置矩阵B(快速转置):\n");

FastTransposeSMatrix(A,B);

printf("矩阵B的三元组表为:\n");

PrinRLSMatrix(B);

printf("以通常的阵列形式输出转置前的矩阵A:\n");

print(A);

printf("\n\n");

printf("以通常的阵列形式输出转置后的矩阵B:\n");

print(B);

DestroySMatrix(A);

DestroySMatrix(B);

printf("\n\n");break;

case 3:

printf("创建矩阵A:");

if((result=CreateSMatrix(A))==0)

exit(ERROR);

printf("矩阵A的三元组表为:\n");

PrinRLSMatrix(A);

printf("求A的转置矩阵B------(一般算法):\n");

TransposeSMatrix(A,B);

printf("矩阵B的三元组表为:\n");

PrinRLSMatrix(B);

printf("以通常的阵列形式输出转置前的矩阵A:\n");

print(A);

相关文档
最新文档