ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:134.89KB ,
资源ID:6883629      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6883629.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(稀疏矩阵基本操作实验报告.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、稀疏矩阵基本操作实验报告稀疏矩阵基本操作 实验报告 一、实验内容稀疏矩阵的压缩储存结构,以及稀疏矩阵的三元组表表示方法下的转置、相加、相乘等算法二、实验目的1.熟悉数组、矩阵的定义和基本操作2.熟悉稀疏矩阵的储存方式和基本运算3.理解稀疏矩阵的三元组表类型定义,掌握稀疏矩阵的输入、输出和转置算法三、实验原理1.使用三元组储存矩阵中的非零元素(三元组分别储存非零元素的行下标,列下标和元素值)。除了三元组表本身,储存一个稀疏矩阵还需要额外的三个变量,分别储存矩阵的非零元个数,矩阵的行数和矩阵的列数。2.稀疏矩阵的创建算法:第一步:根据矩阵创建一个二维数组,表示原始矩阵第二步:取出二维数组中的元素(

2、从第一个元素开始取),判断取出元素是否为非零元素,如果为非零元素,把该非零元素的数值以及行下标和列下表储存到三元数组表里,否则取出下一个元素,重复该步骤。第三步:重复第二步,知道二维数组中所有的元素已经取出。3.稀疏矩阵倒置算法:第一步:判断进行倒置的矩阵是否为空矩阵,如果是,则直接返回错误信息。第二步:计算要倒置的矩阵每列非零元素的数量,存入到num数组(其中numi 代表矩阵中第i列非零元素的个数)。以及倒置后矩阵每行首非零元的位置,存入cpot数组中(其中cpot表示倒置后矩阵每行非零元的位置,对应表示原矩阵每列中第一个非零元的位置)。第三步:确定倒置后矩阵的行数和列数。第四步:取出表示

3、要导致矩阵中三元组表元素 e, I, j(第一次取出第一个,依次取出下一个元素),从第二步cpot数组中确定该元素倒置后存放的位置(cpotj),把该元素的行下标和列下标倒置以后放入新表的指定位置中。cpotj 变量加一。第五步:重复第四步,直到三元组表中所有的元素都完成倒置。第六步:把完成倒置运算的三元组表输出。4.稀疏矩阵加法算法:第一步:检查相加两个矩阵的行数和列数是否相同,如果相同,则进入第二步,否则输出错误信息。第二步:定义变量i和j,用于控制三元组表的遍历。第三步:比较变量矩阵M中第i个元素和矩阵N中第j个元素,如果两个元素是同一行元素,如果不是则进入第四步,如果是,再继续比较两个

4、元素是否为同一列元素,如果是,把两个元素值相加,放到三元组表中;否则把列下表小的元素依次放到三元组表中。进入第五步第四步:如果矩阵M中第i个元素的行下标大于矩阵N中第j个元素的行下标,则把矩阵N中第j个元素所在行的所有非零元素添加到三元组表中;如果矩阵M中第i个元素的行下标小于矩阵N中第j个元素的下标,则把M中第i个元素所在行的所有非零元素依次添加到三元组表中。第五步:重复第三步,直到矩阵M和矩阵N中所有元素都非零元素添加到三元组表中。第六步:输出运算结果5.稀疏矩阵乘法算法:第一步:检查矩阵M和矩阵N能否参与乘法运算(即矩阵M的列数等于矩阵N的行数),如果两个矩阵可以参与乘法运算,进入下一步

5、,否则输出错误信息第二步:检查两个矩阵相乘以后是否为零矩阵,如果相乘结果是零矩阵,直接返回一个零矩阵。第三步:分别计算矩阵M和矩阵N中每行非零元的个数(分别存放到num_m和num_n数组中),并计算出每行首非零元的位置(分别存放到cpot_m和cpot_n中)。第四步:依次取矩阵M中的非零元(第一次取出矩阵M中的第一个非零元),求出该非零元所在行和所在列乘积的和,然后把值放到结果三元组表的特定位置。第五步:重复第四步,直到矩阵M中所有非零元都已经参与运算。第六步:输出结果四、程序流程图五、实验结果5.1程序主菜单5.2稀疏矩阵三元组的创建和倒置5.3稀疏矩阵的加法运算并以三元组输出结果5.4

6、稀疏矩阵的乘法运算并以矩阵方式输出结果六、操作说明1.在创建稀疏矩阵的时候,可以每次输入一个数据,也可以一次输入多个数据,程序会自动根据输入元素的个数对矩阵数据进行填充2.每次矩阵运算失败时(无论是输入的矩阵不符合矩阵运算的条件,参与运算其中一个矩阵为空矩阵,或者分配不到临时空间),程序都会返回到主菜单。输入的数据都会被清空。七、附录:代码#include #include #include #define MAXSIZE 1000#define OK 0#define MALLOC_FAIL -1 / 表示分配空间时发生错误#define EMPTY_MATRIX -2 / 表示正尝试对一个

7、空矩阵进行运算操作#define MATRIX_NOT_MATCH -3 / 表示尝试对不符合运算条件的矩阵进行运算操作(例如非相同行数列数矩阵相加)/* - 结构体声明部分 - */typedef struct int row; / 非零元的行下标 int col; / 非零元的列下标 int e; / 非零元的值 Triple;typedef struct Triple *data; / 非零元素的元素表 int rownum; / 矩阵的行数 int colnum; / 矩阵的列数 int num; / 矩阵非零元的个数 TSMatrix, *PTSMatrix;/* - 函数声明部分

8、- */ 初始化稀疏矩阵结构int TSMatrix_Init(TSMatrix *M);/ 以三元组的方式输出稀疏矩阵void TSMatrix_PrintTriple(TSMatrix *M);/ 以矩阵的方式输出稀疏矩阵void TSMartix_PrintMatrix(TSMatrix *M);/ 从一个二维数组(普通矩阵)创建一个稀疏矩阵TSMatrix *TSMatrix_Create(int *a, int row, int col);/ 从键盘录入数据创建一个稀疏矩阵TSMatrix *TSMatrix_CreateFromInput();/ 求稀疏矩阵 M 的转置矩阵 Tin

9、t TSMatrix_FastTranspose(TSMatrix M, TSMatrix *T);/ 如果稀疏矩阵 M 和 N 的行数的列数相同,计算 Q = M + Nint TSMatrix_Add(TSMatrix M, TSMatrix N, TSMatrix *Q);/ 如果稀疏矩阵 M 的列数等于 N 的行数,计算 Q = M x N;int TSMatrix_Multply(TSMatrix M, TSMatrix N, TSMatrix *Q);/ 把光标位置移动到该行行首void ResetCursor();/* - 程序主函数 - */int main(void) int

10、 info; char ch; / 从一个二维数组创建一个系数矩阵 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); prin

11、tf(n); printf( 请输入选项:); scanf(%c, &ch); switch (ch) case 1: system(cls); M = TSMatrix_CreateFromInput(); if (M != NULL) printf(nn以三元组输出稀疏矩阵:n); TSMatrix_PrintTriple(M); printf(n倒置后稀疏矩阵的三元组输出:n); TSMatrix_FastTranspose(*M, T); TSMatrix_PrintTriple(T); system(pause); else printf(创建矩阵过程发生错误); system(pa

12、use); 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); else if (info = OK) printf(n运算结果:n); TSMatrix_Pr

13、intTriple(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); else if (info = OK) p

14、rintf(n运算结果:n); TSMartix_PrintMatrix(T); system(pause); break; case q: case Q: exit(0); return 0;/ 初始化稀疏矩阵结构int TSMatrix_Init(TSMatrix *M) M-data = (Triple *)malloc(MAXSIZE * sizeof(Triple); if (!M-data) return MALLOC_FAIL; M-num = 0; M-colnum = 0; M-rownum = 0; return OK;/ 从一个二维数组创建一个稀疏矩阵TSMatrix *

15、TSMatrix_Create(int *a, int row, int col) int i, 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 dataP-num.e = *(a + i * col + j); P-dataP-num.row = i + 1; P-dataP-num.col = j + 1; / 把稀疏矩阵中的非零

16、元个数加一 P-num+; return P;/ 以三元组的方式输出稀疏矩阵void TSMatrix_PrintTriple(TSMatrix *M) int i; if (0 = M-num) printf(稀疏矩阵为空!n); return; printf( i j v n); printf(=n); for (i = 0; i num; i+) printf(%3d %3d %3dn, M-datai.row, M-datai.col, M-datai.e); printf(=n);/ 求稀疏矩阵 M 的转置矩阵 Tint TSMatrix_FastTranspose(TSMatrix

17、 M, TSMatrix *T) int *num, *cpot, i, t; / 如果矩阵 M 为空矩阵,返回错误信息 if (M.num = 0) return EMPTY_MATRIX; / 分配临时的工作空间 num = (int *)malloc(M.colnum + 1) * sizeof(int); cpot = (int *)malloc(M.colnum + 1) * sizeof(int); / 如果临时的工作空间分配不成功 if (num = NULL | cpot = NULL) return MALLOC_FAIL; / 初始化临时工作空间(把 num 数组用 0 填

18、充) for (i = 1; i = M.rownum; i+) numi = 0; / 统计倒置后每行的元素数量(即统计倒置前矩阵每列元素的数量) for (i = 1; i = M.num; i+) numM.datai - 1.col+; / 设置 T 矩阵每行首个非零元的位置 cpot1 = 0; for (i = 2; i num = M.num; T-colnum = M.rownum; T-rownum = M.colnum; / 对 M 矩阵中每个非零元素进行转置操作 for (i = 0; i datat.col = M.datai.row; T-datat.row = M.

19、datai.col; T-datat.e = M.datai.e; +cpotM.datai.col; / 转置完成后释放临时工作空间 free(num); free(cpot); return OK;/ 如果稀疏矩阵 M 和 N 的行数的列数相同,计算 Q = M + Nint TSMatrix_Add(TSMatrix M, TSMatrix N, TSMatrix *Q) int i = 0, j = 0, k = 0; if (M.colnum != N.colnum | M.rownum != N.rownum) return MATRIX_NOT_MATCH; / 填充结果矩阵信息

20、 TSMatrix_Init(Q); Q-colnum = M.colnum; Q-rownum = M.rownum; Q-num = 0; while (i M.num & j datak.row = M.datai.row; Q-datak.col = M.datai.col; Q-datak.e = M.datai.e + N.dataj.e; Q-num+; i+; j+; k+; / 如果 i 指向元素的列下标大于 j 指向元素的列下标 / 把下标小(j 指向的元素)的放入到 Q 矩阵中 else if (M.datai.col N.dataj.col) Q-datak.row =

21、 N.dataj.row; Q-datak.col = N.dataj.col; Q-datak.e = N.dataj.e; Q-num+; j+; k+; / 如果 i 指向元素的列下标小于 j 指向元素的列下标 / 把下标小(i 指向的元素)的放入到 Q 矩阵中 else if (M.datai.col datak.row = M.datai.row; Q-datak.col = M.datai.col; Q-datak.e = M.datai.e; Q-num+; i+; k+; / 如果 i 指向的元素行下标大于 j 指向元素的行下标 else if (M.datai.row N.d

22、ataj.row) Q-datak.row = N.dataj.row; Q-datak.col = N.dataj.col; Q-datak.e = N.dataj.e; Q-num+; k+; j+; / 如果 i 指向元素行下标小于 j 指向元素的行下标 else if (M.datai.row datak.row = M.datai.row; Q-datak.col = M.datai.col; Q-datak.e = M.datai.e; Q-num+; i+; k+; / 如果还有剩余元素,按顺序把元素添加到结果矩阵中 while (i datak.row = M.datai.ro

23、w; Q-datak.col = M.datai.col; Q-datak.e = M.datai.e; Q-num+; i+; k+; while (j datak.row = N.dataj.row; Q-datak.col = N.dataj.col; Q-datak.e = N.dataj.e; Q-num+; j+; k+; return OK;/ 如果稀疏矩阵 M 的列数等于 N 的行数,计算 Q = M x N;int TSMatrix_Multply(TSMatrix M, TSMatrix N, TSMatrix *Q) int *num_m, *cpot_m, *num_n

24、, *cpot_n, i, j, k, s, col; int a, ri, rj; / 如果两个矩阵不满足矩阵相乘的条件,返回错误信息 if (M.colnum != N.rownum) return MATRIX_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 *)m

25、alloc(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) return OK; / 初始化临时空间 for (i = 1; i = M.colnum; i+) num_mi = 0; for (i = 1; i = N.colnum; i+) num_ni = 0; / 计算矩阵每行非零元元素的数量 for (i = 0; i M.num; i+) num_mM.datai.row+; for (i = 0; i N.num; i+) num_nN.datai.row+; cpot_m1 = cpot_n1 = 0; for (i = 2; i = M.rownum; i+

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1