稀疏矩阵基本操作 实验报告.docx

上传人:b****1 文档编号:14391349 上传时间:2023-06-23 格式:DOCX 页数:25 大小:173.51KB
下载 相关 举报
稀疏矩阵基本操作 实验报告.docx_第1页
第1页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第2页
第2页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第3页
第3页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第4页
第4页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第5页
第5页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第6页
第6页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第7页
第7页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第8页
第8页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第9页
第9页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第10页
第10页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第11页
第11页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第12页
第12页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第13页
第13页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第14页
第14页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第15页
第15页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第16页
第16页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第17页
第17页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第18页
第18页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第19页
第19页 / 共25页
稀疏矩阵基本操作 实验报告.docx_第20页
第20页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

稀疏矩阵基本操作 实验报告.docx

《稀疏矩阵基本操作 实验报告.docx》由会员分享,可在线阅读,更多相关《稀疏矩阵基本操作 实验报告.docx(25页珍藏版)》请在冰点文库上搜索。

稀疏矩阵基本操作 实验报告.docx

稀疏矩阵基本操作实验报告

稀疏矩阵基本操作实验报告

一、实验内容

稀疏矩阵得压缩储存结构,以及稀疏矩阵得三元组表表示方法下得转置、相加、相乘等算法

二、实验目得

1.熟悉数组、矩阵得定义与基本操作

2.熟悉稀疏矩阵得储存方式与基本运算

3.理解稀疏矩阵得三元组表类型定义,掌握稀疏矩阵得输入、输出与转置算法

三、实验原理

1.使用三元组储存矩阵中得非零元素(三元组分别储存非零元素得行下标,列下标与元素值)。

除了三元组表本身,储存一个稀疏矩阵还需要额外得三个变量,分别储存矩阵得非零元个数,矩阵得行数与矩阵得列数。

2.稀疏矩阵得创建算法:

第一步:

根据矩阵创建一个二维数组,表示原始矩阵

第二步:

取出二维数组中得元素(从第一个元素开始取),判断取出元素就是否为非零元素,如果为非零元素,把该非零元素得数值以及行下标与列下表储存到三元数组表里,否则取出下一个元素,重复该步骤。

第三步:

重复第二步,知道二维数组中所有得元素已经取出。

3.稀疏矩阵倒置算法:

第一步:

判断进行倒置得矩阵就是否为空矩阵,如果就是,则直接返回错误信息、

第二步:

计算要倒置得矩阵每列非零元素得数量,存入到num数组(其中num[i] 代表矩阵中第i列非零元素得个数)、以及倒置后矩阵每行首非零元得位置,存入cpot数组中(其中cpot表示倒置后矩阵每行非零元得位置,对应表示原矩阵每列中第一个非零元得位置)。

第三步:

确定倒置后矩阵得行数与列数。

第四步:

取出表示要导致矩阵中三元组表元素{e,I,j}(第一次取出第一个,依次取出下一个元素),从第二步cpot数组中确定该元素倒置后存放得位置(cpot[j]),把该元素得行下标与列下标倒置以后放入新表得指定位置中。

cpot[j]变量加一。

第五步:

重复第四步,直到三元组表中所有得元素都完成倒置。

第六步:

把完成倒置运算得三元组表输出、

4.稀疏矩阵加法算法:

第一步:

检查相加两个矩阵得行数与列数就是否相同,如果相同,则进入第二步,否则输出错误信息。

第二步:

定义变量i与j,用于控制三元组表得遍历。

第三步:

比较变量矩阵M中第i个元素与矩阵N中第j个元素,如果两个元素就是同一行元素,如果不就是则进入第四步,如果就是,再继续比较两个元素就是否为同一列元素,如果就是,把两个元素值相加,放到三元组表中;否则把列下表小得元素依次放到三元组表中。

进入第五步

第四步:

如果矩阵M中第i个元素得行下标大于矩阵N中第j个元素得行下标,则把矩阵N中第j个元素所在行得所有非零元素添加到三元组表中;如果矩阵M中第i个元素得行下标小于矩阵N中第j个元素得下标,则把M中第i个元素所在行得所有非零元素依次添加到三元组表中。

第五步:

重复第三步,直到矩阵M与矩阵N中所有元素都非零元素添加到三元组表中、

第六步:

输出运算结果

5.稀疏矩阵乘法算法:

第一步:

检查矩阵M与矩阵N能否参与乘法运算(即矩阵M得列数等于矩阵N得行数),如果两个矩阵可以参与乘法运算,进入下一步,否则输出错误信息

第二步:

检查两个矩阵相乘以后就是否为零矩阵,如果相乘结果就是零矩阵,直接返回一个零矩阵、

第三步:

分别计算矩阵M与矩阵N中每行非零元得个数(分别存放到num_m与num_n数组中),并计算出每行首非零元得位置(分别存放到cpot_m与cpot_n中)。

第四步:

依次取矩阵M中得非零元(第一次取出矩阵M中得第一个非零元),求出该非零元所在行与所在列乘积得与,然后把值放到结果三元组表得特定位置。

第五步:

重复第四步,直到矩阵M中所有非零元都已经参与运算、

第六步:

输出结果

四、

程序流程图

五、实验结果

5.1

程序主菜单

5.2

稀疏矩阵三元组得创建与倒置

5.3稀疏矩阵得加法运算并以三元组输出结果

5.4

稀疏矩阵得乘法运算并以矩阵方式输出结果

六、操作说明

1.在创建稀疏矩阵得时候,可以每次输入一个数据,也可以一次输入多个数据,程序会自动根据输入元素得个数对矩阵数据进行填充

2.每次矩阵运算失败时(无论就是输入得矩阵不符合矩阵运算得条件,参与运算其中一个矩阵为空矩阵,或者分配不到临时空间),程序都会返回到主菜单。

输入得数据都会被清空。

七、附录:

代码

#include〈stdio、h〉

#include〈stdlib。

h〉

#include 

#defineMAXSIZE1000

#defineOK0

#define MALLOC_FAIL -1ﻩﻩ//表示分配空间时发生错误

#defineEMPTY_MATRIX-2// 表示正尝试对一个空矩阵进行运算操作

#defineMATRIX_NOT_MATCH-3ﻩ// 表示尝试对不符合运算条件得矩阵进行运算操作(例如非相同行数列数矩阵相加)

/*-----------结构体声明部分----—-—---—--——-*/

typedefstruct

{

ﻩint row;//非零元得行下标

intcol;//非零元得列下标

inte;ﻩ// 非零元得值

}Triple;

typedefstruct

ﻩTriple*data;ﻩﻩ//非零元素得元素表

ﻩintrownum;ﻩﻩﻩ// 矩阵得行数

ﻩintcolnum;ﻩﻩﻩﻩ//矩阵得列数

intnum;ﻩﻩﻩ//矩阵非零元得个数

}TSMatrix,*PTSMatrix;

/*—--——-———--函数声明部分—-----—--—---—--—-*/

// 初始化稀疏矩阵结构

intTSMatrix_Init(TSMatrix*M);

// 以三元组得方式输出稀疏矩阵

voidTSMatrix_PrintTriple(TSMatrix*M);

// 以矩阵得方式输出稀疏矩阵

voidTSMartix_PrintMatrix(TSMatrix *M);

// 从一个二维数组(普通矩阵)创建一个稀疏矩阵

TSMatrix*TSMatrix_Create(int *a,int row,intcol);

//从键盘录入数据创建一个稀疏矩阵

TSMatrix*TSMatrix_CreateFromInput();

//求稀疏矩阵M 得转置矩阵T

intTSMatrix_FastTranspose(TSMatrix M, TSMatrix*T);

// 如果稀疏矩阵M 与N得行数得列数相同,计算 Q =M+N

intTSMatrix_Add(TSMatrixM,TSMatrix N,TSMatrix*Q);

//如果稀疏矩阵M得列数等于N得行数,计算Q= Mx N;

intTSMatrix_Multply(TSMatrixM,TSMatrixN,TSMatrix*Q);

//把光标位置移动到该行行首

void ResetCursor();

/*—---—--—-—- 程序主函数 —--—--—----———-————-*/

intmain(void)

{

ﻩintinfo;

charch;

ﻩ//从一个二维数组创建一个系数矩阵

ﻩTSMatrix*M;

ﻩTSMatrix *N;

ﻩ// 用来接收运算结果得空间

TSMatrix*T =(TSMatrix*)malloc(sizeof(TSMatrix));

while

(1)

ﻩ{

fflush(stdin);

system(”cls");

ﻩprintf("稀疏矩阵基本操作演示\n");

ﻩﻩprintf(”1、矩阵得创建与转置\n");

printf("2. 矩阵得加法运算并以三元组输出结果\n”);

ﻩprintf("3.矩阵得乘法运算并以矩阵输出结果\n”);

ﻩﻩprintf(”\n");

ﻩprintf(”Q、退出程序\n");

ﻩprintf("\n”);

printf(”请输入选项:

");

ﻩscanf("%c”,&ch);

ﻩswitch (ch)

{

ﻩﻩcase'1':

system("cls”);

ﻩﻩM=TSMatrix_CreateFromInput();

ﻩﻩﻩif(M!

= NULL)

{

ﻩﻩprintf("\n\n以三元组输出稀疏矩阵:

\n");

ﻩﻩTSMatrix_PrintTriple(M);

ﻩprintf("\n倒置后稀疏矩阵得三元组输出:

\n");

ﻩﻩTSMatrix_FastTranspose(*M,T);

ﻩﻩﻩTSMatrix_PrintTriple(T);

ﻩﻩﻩsystem("pause”);

ﻩﻩ}

ﻩelse

{

ﻩﻩﻩprintf(”创建矩阵过程发生错误");

ﻩsystem("pause");

}

ﻩbreak;

ﻩcase'2’:

ﻩsystem(”cls”);

ﻩﻩM =TSMatrix_CreateFromInput();

ﻩN=TSMatrix_CreateFromInput();

if (M == NULL||N ==NULL)

ﻩﻩ{

ﻩprintf("创建矩阵过程中发生错误!

\n”);

ﻩﻩsystem(”pause");

ﻩﻩbreak;

ﻩ}

ﻩinfo =TSMatrix_Add(*M,*N,T);

ﻩﻩif(info ==MATRIX_NOT_MATCH)

ﻩ{

ﻩﻩprintf("这两个矩阵不能运算呢!

  ⊙﹏⊙\n”);

ﻩ}

ﻩelseif (info ==OK)

ﻩ{

ﻩprintf("\n运算结果:

\n");

ﻩﻩﻩTSMatrix_PrintTriple(T);

ﻩﻩ}

ﻩﻩsystem("pause");

ﻩbreak;

ﻩcase’3’:

ﻩﻩsystem(”cls");

ﻩﻩﻩM= TSMatrix_CreateFromInput();

ﻩﻩﻩN= TSMatrix_CreateFromInput();

ﻩﻩif (M ==NULL|| N==NULL)

ﻩ{

printf("创建矩阵过程中发生错误!

\n");

ﻩﻩﻩﻩsystem("pause");

ﻩﻩﻩbreak;

ﻩﻩﻩ}

ﻩinfo =TSMatrix_Multply(*M,*N,T);

ﻩﻩif(info==MATRIX_NOT_MATCH)

ﻩﻩﻩ{

printf("这两个矩阵不能运算呢!

!

⊙﹏⊙\n");

ﻩ}

ﻩﻩelseif(info== OK)

ﻩﻩ{

ﻩﻩﻩprintf("\n运算结果:

\n");

ﻩﻩTSMartix_PrintMatrix(T);

ﻩﻩ}

ﻩﻩsystem("pause”);

ﻩﻩbreak;

ﻩcase'q':

ﻩﻩcase'Q':

ﻩﻩexit(0);

ﻩ}

ﻩreturn0;

}

//初始化稀疏矩阵结构

int TSMatrix_Init(TSMatrix *M)

{

ﻩM->data=(Triple*)malloc(MAXSIZE * sizeof(Triple));

ﻩif(!

M—>data)

ﻩﻩreturnMALLOC_FAIL;

ﻩM->num=0;

M->colnum =0;

M—>rownum=0;

ﻩreturn OK;

}

//从一个二维数组创建一个稀疏矩阵

TSMatrix *TSMatrix_Create(int*a,int row,int col)

{

ﻩinti, j;

ﻩTSMatrix*P = (TSMatrix*)malloc(sizeof(TSMatrix));

ﻩTSMatrix_Init(P);

ﻩ// 设置稀疏矩阵得行数与列数

P->rownum= row;

P-〉colnum= col;

for(i =0; i〈row;i++)

ﻩ{

for(j= 0;j〈col;j++)

ﻩﻩ{

// 如果第i+1行第i+1列元素就是非零元素

ﻩﻩif(0!

=*(a+ i *col + j))

ﻩ{

ﻩﻩﻩ//把非零元得元素与位置信息保存到稀疏矩阵中

ﻩﻩﻩﻩP->data[P->num]。

e=*(a+ i*col +j);

ﻩP->data[P-〉num]、row =i+1;

ﻩﻩP—>data[P->num]。

col=j + 1;

ﻩﻩ//把稀疏矩阵中得非零元个数加一

ﻩﻩP—〉num++;

ﻩ}

ﻩ}

ﻩ}

ﻩreturn P;

}

// 以三元组得方式输出稀疏矩阵

void TSMatrix_PrintTriple(TSMatrix*M)

{

inti;

ﻩif(0==M->num)

ﻩ{

ﻩprintf("稀疏矩阵为空!

\n");

ﻩﻩreturn;

ﻩ}

printf(”i jv \n");

printf("===============\n");

ﻩfor(i= 0;i<M->num; i++)

ﻩ{

ﻩprintf(”%3d %3d %3d\n",M->data[i].row,M—>data[i]。

col,M->data[i]。

e);

ﻩ}

printf(”===============\n");

// 求稀疏矩阵M 得转置矩阵 T

intTSMatrix_FastTranspose(TSMatrix M, TSMatrix*T)

{

ﻩint *num, *cpot, i,t;

//如果矩阵 M 为空矩阵,返回错误信息

ﻩif(M。

num ==0)

ﻩﻩreturnEMPTY_MATRIX;

ﻩ//分配临时得工作空间

num=(int*)malloc((M。

colnum+1)*sizeof(int));

ﻩcpot=(int *)malloc((M。

colnum +1)*sizeof(int));

ﻩ//如果临时得工作空间分配不成功

if(num==NULL||cpot==NULL)

ﻩreturnMALLOC_FAIL;

ﻩ//初始化临时工作空间(把num 数组用 0 填充)

ﻩfor (i= 1;i<=M.rownum;i++)

ﻩﻩnum[i]=0;

//统计倒置后每行得元素数量(即统计倒置前矩阵每列元素得数量)

for(i=1;i<= M、num;i++)

ﻩnum[M。

data[i—1]。

col]++;

ﻩ//设置 T矩阵每行首个非零元得位置

ﻩcpot[1]=0;

for(i=2;i 〈=M。

colnum;i++)

cpot[i]=cpot[i-1] +num[i -1];

// 把T 矩阵得信息清空

TSMatrix_Init(T);

//把矩阵 M得信息填充到 T中。

//矩阵倒置以后,T得行数等于M 得列数,T得列数等于M得行数

ﻩT—>num=M。

num;

ﻩT—>colnum=M。

rownum;

T-〉rownum= M。

colnum;

ﻩ//对M 矩阵中每个非零元素进行转置操作

for(i =0; i〈 M、num;i++)

ﻩt= cpot[M.data[i]。

col];

T—>data[t].col =M。

data[i]。

row;

ﻩT—〉data[t]。

row=M.data[i].col;

ﻩT—〉data[t]、e =M。

data[i]。

e;

ﻩ++cpot[M.data[i]、col];

ﻩ}

ﻩ//转置完成后释放临时工作空间

free(num);

ﻩfree(cpot);

return OK;

}

//如果稀疏矩阵 M与 N得行数得列数相同,计算Q=M+ N

intTSMatrix_Add(TSMatrixM,TSMatrixN,TSMatrix *Q)

ﻩint i=0, j= 0,k= 0;

if(M、colnum !

=N、colnum ||M、rownum!

=N。

rownum)

ﻩreturnMATRIX_NOT_MATCH;

ﻩ//填充结果矩阵信息

ﻩTSMatrix_Init(Q);

ﻩQ—>colnum =M。

colnum;

Q->rownum= M。

rownum;

ﻩQ—〉num=0;

ﻩwhile(i<M、num&& j 〈 N、num)

ﻩ{

ﻩﻩ//如果 ij 指向元素就是同一行得元素

ﻩif(M.data[i]、row==N。

data[j]。

row)

ﻩﻩ{

ﻩﻩ//如果i与 j指向得元素指向得就是同一个元素

ﻩif(M。

data[i].col==N。

data[j].col)

ﻩﻩ{

ﻩQ->data[k].row=M。

data[i].row;

ﻩﻩQ->data[k]。

col =M、data[i].col;

ﻩﻩﻩQ-〉data[k]。

e= M、data[i].e+N.data[j]、e;

ﻩQ->num++;

ﻩﻩi++;

ﻩﻩj++;

ﻩﻩk++;

ﻩﻩﻩ}

ﻩ//如果 i指向元素得列下标大于j指向元素得列下标

ﻩﻩ//把下标小(j指向得元素)得放入到Q矩阵中

ﻩelseif(M、data[i]。

col>N。

data[j]、col)

ﻩﻩ{

ﻩﻩQ—>data[k]。

row=N、data[j]。

row;

ﻩﻩﻩQ-〉data[k].col =N.data[j]、col;

ﻩﻩQ—>data[k].e= N.data[j]、e;

ﻩﻩQ—>num++;

ﻩj++;

ﻩk++;

ﻩﻩ}

ﻩﻩ//如果 i指向元素得列下标小于j指向元素得列下标

// 把下标小(i指向得元素)得放入到Q 矩阵中

ﻩﻩelseif(M.data[i].col〈N、data[j]、col)

ﻩﻩ{

ﻩﻩQ->data[k]、row= M、data[i]、row;

ﻩﻩﻩQ-〉data[k]。

col =M.data[i]。

col;

ﻩﻩﻩQ—>data[k]。

e =M。

data[i]、e;

ﻩﻩﻩﻩQ->num++;

ﻩﻩi++;

ﻩﻩk++;

ﻩﻩ}

ﻩﻩ// 如果 i指向得元素行下标大于j指向元素得行下标

else if(M.data[i]、row>N.data[j].row)

ﻩ{

ﻩQ—〉data[k]。

row= N、data[j].row;

ﻩQ-〉data[k]。

col=N。

data[j].col;

ﻩQ—〉data[k].e= N、data[j].e;

Q—〉num++;

ﻩk++;

ﻩj++;

ﻩ}

// 如果i指向元素行下标小于 j指向元素得行下标

elseif (M.data[i].row

data[j]、row)

ﻩ{

ﻩﻩQ—〉data[k]。

row=M、data[i].row;

ﻩQ->data[k]、col=M。

data[i].col;

ﻩQ—〉data[k]、e=M.data[i]、e;

ﻩﻩQ->num++;

i++;

ﻩk++;

ﻩ}

ﻩ}

ﻩ//如果还有剩余元素,按顺序把元素添加到结果矩阵中

ﻩwhile(i 

ﻩ{

Q->data[k]、row=M。

data[i]。

row;

ﻩQ->data[k]。

col=M、data[i].col;

ﻩﻩQ->data[k].e= M。

data[i]、e;

ﻩQ-〉num++;

i++;

ﻩk++;

ﻩ}

while (j

ﻩ{

ﻩﻩQ—〉data[k].row=N.data[j]。

row;

ﻩQ->data[k]。

col=N。

data[j]。

col;

ﻩQ-〉data[k].e=N。

data[j].e;

Q->num++;

ﻩj++;

ﻩﻩk++;

ﻩreturn OK;

}

// 如果稀疏矩阵M得列数等于N得行数,计算Q=MxN;

intTSMatrix_Multply(TSMatrix M,TSMatrix N,TSMatrix *Q)

{

int*num_m,*cpot_m,*num_n, *cpot_n,i,j,k, s,col;

ﻩint a, ri,rj;

ﻩ//如果两个矩阵不满足矩阵相乘得条件,返回错误信息

ﻩif (M.colnum!

=N、rownum)

returnMATRIX_NOT_MATCH;

ﻩ//分配临时空间

ﻩnum_m =(int*)malloc((M。

rownum+1)* sizeof(int));

cpot_m= (int*)malloc((M、rownum+1)* sizeof(int));

ﻩnum_n=(int*)malloc((N.rownum+1)*sizeof(int));

cpot_n=(int*)malloc((N、rownum +1)*sizeof(int));

ﻩ//填充结果矩阵得信息

TSMatrix_Init(Q);

Q-〉rownum=M。

rownum;

Q—〉colnum=N、colnum;

ﻩQ->num = 0;

//如果相乘为零矩阵,直接返回

if(0==M。

num*N、num)

ﻩﻩreturnOK;

//初始化临时空间

for(i= 1;i <=M、colnum;i++)

ﻩﻩnum_m[i]=0;

ﻩfor (i= 1; i<=N.colnum;i++)

num_n[i]=0;

//计算矩阵每行非零元元素得数量

for(i =0;i<M。

num;i++)

ﻩnum_m[M。

data[i].row]++;

ﻩfor(i=0;i 〈 N.num;i++)

num_n[N、data[i]。

row]++;

cpot_m[1]= cpot_n[1] =0;

ﻩfor(i =2;i〈=

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2