C语言——一些特殊矩阵的处理(稀疏矩阵)

前言

本篇给大家介绍一些特殊矩阵的存储。
ps:比较短小。

一、特殊矩阵的压缩存储

1.n阶对称矩阵:aij=aji

矩阵标号:a11,a12,…,ann
首先明确:
(1)保存矩阵的下三角或上三角部分即可(包括对角线)
(2)这里选择保存下三角,下三角元素满足i>=j
(3)需保存个数=n(n+1)/2 ,根据个数分配空间
(4)假定以行序为主,顺序存储到SA[1…n(n+1)/2],aij保存到了SA[k]里,即可分析出ij的关系
①当aij在下三角,i>=j
前i-1行共有元素i(i-1)/2个,第i行中,aij是第j个数据元素,故aij的序号为k=i(i-1)/2 + j
②当aij在上三角,i<j,要访问它时,访问下三角对称的元素即可
上三角的aij=下三角的aji,根据下三角aji的序号找上三角的aij的序号即可

		最终得公式;i>= j    K=A[i,j] = SA[i(i-1)/2 + j]
					i<j		K=A[i,j] = SA[j(j-1)/2 + i]
		此公式称为在SA中的映像函数,或下标转换公式

2.三对角矩阵:除去三条对角线外,其余元素都是0

明确:
(1)元素aij在三对角的条件:|i-j|<=1
(2)三对角的元素个数:3n-2
(3)假定以行序为主,顺序存储到SA[1…3n-2]中,aij保存到了SA[k]里,即可分析出ij的关系
任意元素aij在SA中的序号:K=(3(i-1)+(j-i+2)=2i+j-2

由于以上两个矩阵能通过映像函数计算aij的位置,尽管是压缩存储,但也能进行随机访问

二、稀疏矩阵的压缩

1.三元组表

1.稀疏矩阵:
		零元素很多,非零元素很少,且非零元素在矩阵的位置没有特定的规律
	注:稀疏矩阵没有一个明确的定义,只是从形式上来看,非零元素的个数栈元素总数的比例低于某特定的阈值
由于非零元素很少,只需保存这些非零元素,没有保存的都是零元素。为了标明每个非零元素在矩阵中的位置,我们以(行、列、值)形式
的三元组形式来保存非零元素。
所有非零元素的三元组序列加上矩阵的行数和列数,称为三元组表

2.三元组顺序表

1.定义:分配连续的存储空间,保存稀疏矩阵中的三元组表
注:首先需要一个足够大的三元组数组空间,将非零元素的三元组按行序优先的次序保存在数组中,再就是矩阵的行数、列数和非零元素的个数
这样就能唯一的确定稀疏矩阵,逻辑上和物理上就对应起来了
在这里插入图片描述
2.数据类型
(1)假定非零元素的个数最大值为10000,定义常量MAXSIZE=10000
(2)定义三元组的结构类型triple,包括非零元素的行位置、列位置、元素值三个属性
(3)定义三元组顺序表的结构类型TSMatrix,包括大型为MAXISZE的三元组数组、行数、列数和非零元素个数几个属性

#define MAXSIZE 10000//假定非零元素的个数最大值为10000,定义常量MAXSIZE=10000
typedef 
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬茶@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值