稀疏矩阵(算法与数据结构课程设计)
《稀疏矩阵》课件

稀疏矩阵研究现状与挑战
研究现状
随着大数据和计算技术的发展,稀疏矩阵在许多领域如机器学习、图像处理、数值计算 等得到了广泛应用。目前,稀疏矩阵的研究主要集中在算法优化、存储压缩和并行计算
等方面。
挑战
尽管取得了一些进展,但稀疏矩阵的研究仍面临诸多挑战。例如,如何更有效地压缩存 储稀疏矩阵以提高计算效率,如何设计更高效的算法处理大规模稀疏矩阵等问题仍需进
在机器学习中,稀疏矩阵用于表示数据的特征和权 01 重,能够有效地降低数据的维度和复杂度。
通过稀疏矩阵优化,可以快速实现分类、回归等机 02 器学习任务,提高模型的准确率和训练速度。
稀疏矩阵的优化算法能够有效地处理大规模数据集, 03 为机器学习的发展和应用提供了重要的技术支持。
总 结 与 展 望
感 谢 观 看
THANKS
3
COO格式也是一种常见的压缩存储方式,它同时 存储非零元素的行索引、列索引和非零元素值。
稀
疏
方 法
矩 阵 的
压
缩
基于行的方法
总结词
基于行的方法主要关注矩阵的行,通过行内非零元素的聚集来压缩矩阵。
详细描述
这种方法通过识别矩阵中的行,其中非零元素在位置上彼此接近,然后只存储 这些非零元素的位置和值,同时记录非零元素的位置信息,以便于后续计算。
Eigen库的API设计简洁明了,易 于使用,同时具有高效的性能和 可扩展性。
01
Armadillo库
01 Armadillo是一个C线性代数库,提 供了丰富的矩阵和向量操作、线性 方程组求解、特征值计算等功能。
02 Armadillo支持稀疏矩阵的存储和操 作,提供了多种稀疏矩阵格式的支 持,如COO、CSR等。
数据结构+课程设计+稀疏矩阵的操作(计算机学院)

计算机科学技术学院学生课程设计(论文)题目:学生姓名:学号:所在院(系):专业:班级:指导教师:职称:年月日计算机科学技术学院本科学生课程设计任务书注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。
利用三元组实现稀疏矩阵的有关算法。
2.问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。
2.2求出A的转置矩阵D,输出D。
3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。
4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。
4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。
4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20。
4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。
注意研究教材的算法,以便提高计算效率。
5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放5.算法思想5.1.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。
5.2.设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。
5.3.在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSMatrix(RLSMatrix M,RLSMatrix *Q) 矩阵快速转置6.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和6.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差6.6 JiRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) 矩阵求积7.算法实现7.1首先定义非零元个数的最大值和存放各行第一个非零元在存储数组中的位置#include<stdio.h>#define MAXSIZE 100 /* 非零元个数的最大值*/typedef struct triple{int i,j; /* 行下标,列下标*/int e; /* 非零元素值*/}triple;typedef struct tsmatrix{triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*//* 各列第一个非零元的位置表rpos[0]未用*/}rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d 个非零元素所在的行(1~%d),列(1~%d),元素值。
数据结构实验报告稀疏矩阵运算

数据结构实验报告稀疏矩阵运算实验目的:1.学习并理解稀疏矩阵的概念、特点以及存储方式。
2.掌握稀疏矩阵加法、乘法运算的基本思想和算法。
3.实现稀疏矩阵加法、乘法的算法,并进行性能测试和分析。
实验原理:稀疏矩阵是指矩阵中绝大多数元素为0的矩阵。
在实际问题中,有许多矩阵具有稀疏性,例如文本矩阵、图像矩阵等。
由于存储稀疏矩阵时,对于大量的零元素进行存储是一种浪费空间的行为,因此需要采用一种特殊的存储方式。
常见的稀疏矩阵的存储方式有三元组顺序表、十字链表、行逻辑链接表等。
其中,三元组顺序表是最简单直观的一种方式,它是将非零元素按行优先的顺序存储起来,每个元素由三个参数组成:行号、列号和元素值。
此外,还需要记录稀疏矩阵的行数、列数和非零元素个数。
稀疏矩阵加法的原理是将两个稀疏矩阵按照相同的行、列顺序进行遍历,对于相同位置的元素进行相加,得到结果矩阵。
稀疏矩阵乘法的原理是将两个稀疏矩阵按照乘法的定义进行计算,即行乘以列的和。
实验步骤:1.实现稀疏矩阵的三元组顺序表存储方式,并完成稀疏矩阵的初始化、转置、打印等基本操作。
2.实现稀疏矩阵的加法运算,并进行性能测试和分析。
3.实现稀疏矩阵的乘法运算,并进行性能测试和分析。
4.编写实验报告。
实验结果:经过实验测试,稀疏矩阵的加法和乘法算法都能正确运行,并且在处理稀疏矩阵时能够有效节省存储空间。
性能测试结果表明,稀疏矩阵加法、乘法的运行时间与非零元素个数有关,当非零元素个数较少时,运算速度较快;当非零元素个数较多时,运算速度较慢。
实验分析:稀疏矩阵的运算相对于普通矩阵的运算有明显的优势,可以节省存储空间和运算时间。
在实际应用中,稀疏矩阵的存储方式和运算算法都可以进行优化。
例如,可以采用行逻辑链接表的方式存储稀疏矩阵,进一步减少存储空间的占用;可以采用并行计算的策略加快稀疏矩阵的运算速度。
总结:通过本次实验,我深入学习了稀疏矩阵的概念、特点和存储方式,掌握了稀疏矩阵加法、乘法的基本思想和算法,并通过实验实现了稀疏矩阵的加法、乘法运算。
稀疏矩阵存储和操作稀疏矩阵的数据结构与算法

稀疏矩阵存储和操作稀疏矩阵的数据结构与算法稀疏矩阵是指具有大量零元素和少量非零元素的矩阵。
在实际场景中,由于矩阵中大部分元素为零,传统的矩阵存储方式会造成大量的存储空间的浪费以及数据操作的低效性。
因此,为了节省存储空间和提高数据操作的效率,稀疏矩阵的存储和操作需要借助于特定的数据结构和算法。
一、稀疏矩阵存储的数据结构1.1. 压缩存储方法压缩存储方法是一种常用的稀疏矩阵存储方法。
常见的压缩存储方法有三种:行压缩法(CSR)、列压缩法(CSC)和十字链表法。
1.1.1. 行压缩法(CSR)行压缩法是通过两个数组来存储稀疏矩阵的非零元素。
第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。
1.1.2. 列压缩法(CSC)列压缩法与行压缩法相似,只是存储方式不同。
列压缩法是通过两个数组来存储稀疏矩阵的非零元素。
第一个数组存储非零元素的值,第二个数组存储非零元素在矩阵中的位置信息。
1.1.3. 十字链表法十字链表法是一种更加灵活的稀疏矩阵存储方法。
通过使用链表的方式,将非零元素存储在链表中,并且每个非零元素还具有行和列的指针,方便进行数据操作。
1.2. 坐标存储法坐标存储法是一种简单直观的稀疏矩阵存储方法。
每个非零元素包括行列坐标和元素值,通过三元组的方式进行存储。
二、稀疏矩阵的操作算法2.1. 矩阵转置矩阵转置是指将原矩阵的行变为列,列变为行的操作。
对于稀疏矩阵,常用的转置算法为快速转置算法。
该算法通过统计每列非零元素的个数,并根据列的非零元素个数确定每个非零元素转置后的位置。
2.2. 矩阵相加矩阵相加是指将两个矩阵对应位置上的元素相加得到一个新的矩阵。
对于稀疏矩阵的相加,可以遍历两个矩阵的非零元素,对相同位置上的元素进行相加。
2.3. 矩阵相乘矩阵相乘是指将两个矩阵相乘得到一个新的矩阵。
对于稀疏矩阵的相乘,常用的算法为稀疏矩阵乘法算法。
该算法通过遍历两个矩阵的非零元素,按照矩阵乘法的规则计算得到新矩阵的非零元素。
数据结构课程设计稀疏矩阵

稀疏矩阵应用摘要本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。
在程序设计中,考虑到方法的难易程度,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法,再在十字链表下实现。
程序通过调试运行,结果与预期一样,初步实现了设计目标。
关键词程序设计;稀疏矩阵;三元组;十字链表1 引言1.1课程设计任务本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。
稀疏矩阵采用三元组和十字链表表示,并在两种不同的存储结构下,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C;求出A的转置矩阵D,输出D;求两个稀疏矩阵A和B的相乘矩阵E,并输出E。
1.2课程设计性质数据结构课程设计是重要地实践性教学环节。
在进行了程序设计语言课和《数据结构》课程教学的基础上,设计实现相关的数据结构经典问题,有助于加深对数据结构课程的认识。
本课程设计是数据结构中的一个关于稀疏矩阵的算法的实现,包括在三元组和十字链表下存储稀疏矩阵,并对输入的稀疏矩阵进行转置,相加,相乘等操作,最后把运算结果输出。
此课程设计要求对数组存储结构和链表存储结构非常熟悉,并能熟练使用它们。
1.3课程设计目的其目的是让我们在学习完C、数据结构等课程基础上,掌握多维数组的逻辑结构和存储结构、掌握稀疏矩阵的压缩存储及转置,相加,相乘等基本操作,并用不同的方法输出结果,进一步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
2需求分析2.1设计函数建立稀疏矩阵及初始化值和输出稀疏矩阵的值本模块要求设计函数建立稀疏矩阵并初始化,包括在三元组结构下和十字链表结构下。
首先要定义两种不同的结构体类型,在创建稀疏矩阵时,需要设计两个不同的函数分别在三元组和十字链表下创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值,特别注意在十字链表下,对变量进行动态的地址分配。
稀疏矩阵的操作课程设计

摘要随着科学技术的飞速发展,人类的生活工作方式发生了很大的改变,工作效率随着高科技的加入有了质的提高,特别是信息技术和网络技术的迅速发展和广泛应用,对社会的政治,经济,军事,文化等领域产生越来越深刻的影响。
现代生活各个方面都离不开计算机技术,而C是国际上广泛流行的通用程设语言,在计算机的研究和应用中以展现强大的生命力。
C功能强大,使用灵活,既具有高级语言的特点,又具有低级语言的些特点;它既可用于编写系统软件又可用于编写应用软件。
本课程设计主要实现在三元组存储结构与十字链表存储结构下输入稀疏矩阵,并对稀疏矩阵进行转置,相加,相乘操作,最后输出运算后的结果。
在程序设计中,采用了先用三元组实现稀疏矩阵的输入,输出,及其转置,相加,相乘操作的方法。
程序通过调试运行,结果与预期一样,初步实现了设计目标。
关键词:稀疏矩阵,三元组,链表I目录摘要 (I)1 课程设计的目的和意义 (1)2 需求分析 (1)2.1需求概述 (1)2.2 需求环境 (2)3 系统功能设计及数据结构设计 (2)3.1模块设计 (2)3.2系统子程序及功能设计 (2)4 算法设计、数据流图及程序结构框图 (2)4.1 程序功能模块 (2)4.2 程序流程图 (4)5 程序原代码及其说明 (5)6 程序测试及运行结果说明 (10)7 总结 (14)主要参考资料 (14)1 课程设计的目的和意义通过本课程设计教学所要达到的目的是:培养学生用学到的书本知识解决实际问题的能力;培养实际工作所需要的动手能力;培养学生以科学理论和工程上能力的技术,规范地开发大型、复杂、高质量的应用软件和系统软件具有关键性作用;通过课程设计的实践,学生可以在程序设计方法、上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
2 需求分析2.1需求概述1. 问题描述设计程序用十字链表实现稀疏矩阵的加、乘、转置。
基本功能要求:(1) 稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A 和B的相加矩阵C ,并输出C 。
《数据结构 课程设计》稀疏矩阵实验报告

(2)稀疏矩阵的相加:
void MatrixAdd(int A[max],int B[max],int C[max]),这个函数用 于实现数组A和数组B的相加,并将其相加的结果存入数组C。这个函数 讨论了数组在相加的过程中的几种情况: a、 A数组和B数组的行相等且列相等,两者直接相加后存入数组C中。 if(A[i]==B[j]) { if(A[i+1]==B[j+1]) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]+B[j+2]; k=k+3; i=i+3; j=j+3; } } b、A的列小于B的列,将A的三个元素直接存入C中
2、 系统分析
稀疏矩阵的保存:以一位数组顺序存放非零元素的行号、列号和数 值,行号为-1作为结束符。以三个一维数组存放一个系数矩阵中的一个 非零元素,为零额元素则不保存。用一个二重循环来实现判断每个系数
矩阵的非零元素是否为零,不为零,就将其行列下标和其值存入一维数 组中 稀疏矩阵的相加:用循环来判断存储A何B稀疏矩阵的两个一维数组 中的行列下标是否相等和其大小关系。若相等,则将两个一维数组的第 三个元素的值相加存入新的数组C里,行列下标不变的存入进去;若A的 列小于B的列,则将A的三个元素直接存入C中;若B的列小于A的列,则 将B的三个元素村日C中;若A的行小于B的行,则将A的三个元素存入C 中;若A的行大于B的行,则将B存入C中。
3、 概要设计
(1)主界面的设计:
定义两个矩阵a= 0 0 0 0 0 0 0 0 0 0 0 9 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0 0 0 0 b= 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 1 0 0 4 0 0 0 0 0 0 0 8 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
稀疏矩阵数据结构与算法

稀疏矩阵数据结构与算法§1转置算法稀疏矩阵在数据结构中不是重点,但是稀疏矩阵既是数据处理的大范围内,又具有一般程序设计与算法结构的基本特征。
大学阶段遇到的科学计算类程序不多,稀疏矩阵运算(转置、乘法)的算法是应掌握的起步阶段算法对运算数据关联范围的设置不同,导致稀疏矩阵的转置算法的效率不同。
一.稀疏矩阵转置程序1的分析1.什么是转置M mn-->T nm,其中a ij=b ji(1≤i≤m, 1≤j≤n。
i,j可看作与M,T无关的表示,也可以看作矩阵M为主动的下标表示方法),而且a ij∈M, b ji∈T。
矩阵M已知,矩阵T未知。
因此在编程时,应考虑以哪个矩阵为算法主序,这是一个出发点。
(1)M,T的行列互换à两个矩阵的行数mu列数nu互换,T.mu=M.nu=n ,T.nu=M.mu=m,以T为主动。
(2)矩阵元素T(i,j)=M(j,i),矩阵T的第i行第j列元素与矩阵M的第j 行第i列元素相等。
以T的元素为驱动,因为能从M的元素得到T的元素,所以建立表达式就能得到T元素的值。
(在程序中,是否用矩阵T的顺序为算法线索?)转置矩阵的非0元个数相同,T.tu=M.tu(3)对0元素多的稀疏矩阵的转置而言,与一般矩阵的转置不同。
稀疏矩阵的非0元素a ij,在程序中用三元组(i,j,a ij)表示,i,j表示行数列数。
因为不再按照矩阵的结构m行n列转置,不使用二维数组作为存储,所以必须记录每一个非0元素所在行列的位置。
在规则的二维数组中,矩阵的行列通过元素的下标识别,元素在矩阵中的位置通过下标得到。
因此一般矩阵用二维数组为存储结构。
二维数组是物理存储结构的逻辑形式,可称为逻辑存储结构。
2.稀疏矩阵的一维数组存储结构从操作系统可知,数据的存储方式有三种:连续(顺序)方式,链接方式,索引方式。
矩阵不能直接用在计算机中,应选择顺序存储结构二维数组,存放元素。
稀疏矩阵的非0元以矩阵行序为序存储在一维数组中,每一行元素的数目不同,可称为非规则数组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
稀疏矩阵一、问题描述假若在n m ⨯阶中,有t 个元素不为零,令nm t ⨯=δ称为矩阵的稀疏因子。
通常认为≤δ0.05时称为稀疏矩阵。
稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。
通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。
二、基本要求1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出;2、编写算法,完成稀疏矩阵的转置操作;3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作;4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。
三、测试数据1、转置操作的测试数据:⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 2、相加操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200010000210030300 3、相乘操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛0000000300400021 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛001002000021 四、算法思想1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。
稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。
2、稀疏矩阵转置的算法思想将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。
为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。
3、稀疏矩阵相加的算法思想比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。
最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。
4、稀疏矩阵相乘的算法思想两个相乘的矩阵为M与N,对M中每个元素M.data[p](p=1,2,…,M.tu),找到N中所有满足条件M.data[p].j=N.data[q].i的元素N.data[q],求得M.data[p].v和N.data[q].v 的乘积,又T(i,j)=∑M(i,k)×N(k,j),乘积矩阵T中每个元素的值是个累计和,这个乘积M.data[p].v×N.data[q].v只是T[i][j]中的一部分。
为便于操作,应对每个元素设一累计和的变量,其初值是零,然后扫描数组M,求得相应元素的乘积并累加到适当的求累计和的变量上。
由于T中元素的行号和M中元素的行号一致,又M中元素排列是以M的行序为主序的,由此可对T进行逐行处理,先求得累计求和的中间结果(T的一行),然后再压缩存储到Q.data中去。
五、模块划分1、Status CreateM(TSMatrix *M, int a[],int row, int col),创立三元组;2、void PrintM(TSMatrix M),按数组方式输出;3、void PrintM3(TSMatrix M),按三元组方式输出;4、Status TransposeSMatrix(TSMatrix M, TSMatrix *T),稀疏矩阵的转置;5、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵加法;6、Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q),稀疏矩阵相乘;7、main(),主函数。
六、数据结构//(ADT)1、三元组结构类型typedef struct{ int i,j;ElemType e;} Triple;2、稀疏矩阵typedef struct{ Triple data[MAXSIZE+1];int mu,nu,tu;} TSMatrix;七、源程序#include "stdio.h"#define OK 1#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;/* 三元组顺序表的类型定义 */#define MAXSIZE 1000#define MAXRC 1000typedef struct{ int i,j;ElemType e;} Triple;typedef struct{ Triple data[MAXSIZE+1];int mu,nu,tu;} TSMatrix;/* 建立三元组表 */Status CreateM(TSMatrix *M, int a[],int row, int col){ int i,k=0;for(i=0;i<row*col;i++)if (a[i]!=0){++k;(*M).data[k].i=i/col+1;(*M).data[k].j=i%col+1;(*M).data[k].e=a[i];}if (k){ (*M).tu=k; (*M).mu=row; (*M).nu=col; return TRUE; } elsereturn FALSE;}/* 按数组方式输出三元组表 */void PrintM(TSMatrix M){int k=1,p=1,n;printf("\nM:\n");if (M.tu){n=(M.data[p].i-1)*M.nu+M.data[p].j;for(k=1;k<=M.mu*M.nu;k++){if (k<n||k>n)printf(" 0");else{printf("%3d",M.data[p].e);p++;if (p<=M.tu) n=(M.data[p].i-1)*M.nu+M.data[p].j;}if (k%M.nu==0) printf("\n");}}}/* 按三元组方式输出三元组表 */void PrintM3(TSMatrix M){int k;printf("\nM3:");printf("\n i j e");for(k=1;k<=M.tu;k++)printf("\n%3d%3d%3d",M.data[k].i,M.data[k].j,M.data[k].e); }/*稀疏矩阵的转置*/Status TransposeSMatrix(TSMatrix M, TSMatrix *T){int q,col,p;(*T).mu=M.nu; (*T).nu=M.mu; (*T).tu=M.tu;if ((*T).tu){ q=1;for(col=1; col<=M.nu; ++col)for(p=1; p<=M.tu; ++p)if (M.data[p].j==col){ (*T).data[q].i=M.data[p].j;(*T).data[q].j=M.data[p].i;(*T).data[q].e=M.data[p].e;++q; }}return OK;}/*矩阵加法*/Status ContactM(TSMatrix M, TSMatrix N, TSMatrix *Q){ int k1,k2,k3=1,m,n;(*Q).mu=M.mu;(*Q).nu=M.nu;(*Q).tu=0;if(M.mu==N.mu && M.nu==N.nu){ for(k1=1;k1<=M.tu;k1++)for(k2=1;k2<=N.tu;k2++){if(M.data[k1].i==N.data[k2].i && M.data[k1].j==N.data[k2].j){ (*Q).data[k3].e=M.data[k1].e+N.data[k2].e;(*Q).data[k3].i=M.data[k1].i ;(*Q).data[k3].j=M.data[k1].j ; M.data[k1].e=0; N.data[k2].e=0;++k3;}m=k3; n=M.tu+N.tu;}k2=1;k1=1;for(k3=m;k3<n-5;k3++){ if(M.data[k1].e==0 || N.data[k2].e==0){k1++;k2++;k3--;}else{(*Q).data[k3].e=M.data[k1].e;(*Q).data[k3].i=M.data[k1].i ;(*Q).data[k3].j=M.data[k1].j;k1++;k3++;(*Q).data[k3].e=N.data[k2].e;(*Q).data[k3].i=N.data[k2].i ;(*Q).data[k3].j=N.data[k2].j ;k2++;}}}(*Q).tu=k3-1;}/*矩阵乘法*/Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q){ int k1,k2,k3,m;(*Q).mu=M.mu;(*Q).nu=N.nu;(*Q).tu=0;if(M.nu==N.mu){ for(k1=1;k1<=M.tu;k1++)for(k2=1;k2<=N.tu;k2++){ if(M.data[k1].j==N.data[k2].i){ m=M.data[k1].e*N.data[k2].e;if((*Q).tu==0){(*Q).data[1].e=m;(*Q).data[1].i=M.data[k1].i;(*Q).data[1].j=N.data[k2].j;(*Q).tu++; }else{ for(k3=1;k3<=(*Q).tu;k3++){ if((*Q).data[k3].i==M.data[k1].i&&(*Q).data[k3].j==N.data[k2].j){ (*Q).data[k3].e+=m;break; }}if(k3==(*Q).tu+1){(*Q).data[k3].e=m;(*Q).data[k3].i=M.data[k1].i;(*Q).data[k3].j=N.data[k2].j;(*Q).tu++; }}}}}}/* 主函数 */main(){ int a[4][5]={0,0,1,0,2,0,0,1,0,0,0,0,3,1,0,0,0,2,0,0, },b[4][5]={ 0,0,3,0,3,0,0,1,2,0,0,0,0,1,0,0,0,2,0,0,},c[3][4]={1,2,0,0,0,4,0,0,3,0,0,0 },d[4][3]={1,2,0,0,0,0,2,0,0,1,0,0};TSMatrix M,N,Q,T,H,A,B;CreateM(&M,*c,3,4); CreateM(&N,*d,4,3);CreateM(&A,*a,4,5); CreateM(&B,*b,4,5);printf("\n矩阵相乘的第一个矩阵:");PrintM(M);printf("\n矩阵相乘的第二个矩阵:");PrintM(N);printf("\n矩阵相乘得到的矩阵:");MultSMatrix(M,N,&Q);printf("\n按矩阵方式输出:");PrintM(Q);printf("\n按三元组方式输出:");PrintM3(Q);printf("\n矩阵相加的第一个矩阵:");PrintM(A);printf("\n矩阵相加的第二个矩阵:");PrintM(B);ContactM(A,B,&H);printf("\n两个矩阵的和矩阵为:");PrintM3(H);printf("\n被转置的矩阵:");PrintM(A);TransposeSMatrix(A,&T);printf("\n矩阵的转置矩阵为:");PrintM(T);}八、测试情况程序的测试结果如下1、矩阵转置2、矩阵相加3、矩阵相乘九、参考文献1、严蔚敏,《数据结构 C语言》,清华大学出版社。