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

2019-08-29 00:44

一、设计要求

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() //主函数

2

3.3 程序主要调用关系图

8 main 1 2 3 4 5 6 7

四、详细设计

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|FOREGROUND_INTENSITY,100000000,Co,&Write); ///windows的API函数,用来设置控制台标题及颜色。

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

int i;

scanf(\

switch(i) {

case 1: printf(\创建矩阵A:\

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

3

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(\

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

DestroySMatrix(B); printf(\

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(\

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

DestroySMatrix(A); DestroySMatrix(B); printf(\

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

4

printf(\

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

print(B);

DestroySMatrix(B); printf(\

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

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

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

print(A);

printf(\

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

DestroySMatrix(A); DestroySMatrix(B);

printf(\ }

printf(\ **********请选择是否继续输入其他稀疏矩阵?

**********\\n\\n\ printf(\ 1 是,输入其他矩阵\\n\

printf(\ 0 否,不输入\\n\\n\

printf(\

****************************************************\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\ fflush(stdin);//清除输入缓存区

scanf(\}while(j==1);

}

(2)创建矩阵

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

int i,m,n; ElemType e;

int k,j;

printf(\输入矩阵的行数、列数、非零元的个数:\scanf(\M.data[0].i=0;

for(i=1;i<=M.tu;i++) {

j=0; do { j++;

5


三元组表示稀疏矩阵的转置(一般算法和快速算法).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:企业并购目标企业价值评估方法研究 —以吉利并购沃尔沃公司为例

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: