如何用三元组表表示下列稀疏矩阵_稀疏矩阵—稀疏矩阵的三元组表存储

设m*n 矩阵中有t 个非零元素且t<

将三元组按行优先的顺序,同一行中列号从小到大的规律排列成一个线性表,称为三元组表,采用顺序存储方法存储该表。如图5.11 稀疏矩阵对应的三元组表为图5.12。

显然,要唯一的表示一个稀疏矩阵,还需要存储三元组表的同时存储该矩阵的行、列,为了运算方便,矩阵的非零元素的个数也同时存储。这种存储的思想实现如下:

define SMAX 1024 /*一个足够大的数*/

typedef struct

{ int i,j; /*非零元素的行、列*/

datatype v; /*非零元素值*/

}SPNode; /*三元组类型*/

typedef struct

{ int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/

SPNode data[SMAX]; /*三元组表*/

} SPMatrix; /*三元组表的存储类型*/

这样的存储方法确实节约了存储空间,但矩阵的运算从算法上可能变的复杂些。下面我们讨论这种存储方式下的稀疏矩阵的两种运算:转置和相乘。

1.稀疏矩阵的转置

设SPMatrix A; 表示一m*n 的稀疏矩阵,其转置B 则是一个n*m 的稀疏矩阵,因此也有SPMatrix B; 由A 求B 需要:

A 的行、列转化成B 的列、行;

将A.data 中每一三元组的行列交换后转化到B.data 中;

看上去以上两点完成之后,似乎完成了B,没有。因为我们前面规定三元组的是按一行一行且每行中的元素是按列号从小到大的规律顺序存放的,因此B

也必须按此规律实现,A 的转置B 如图5.13 所示,图5.14 是它对应的三元组存储,就是说,在A 的三元组存储基础上得到B

的三元组表存储(为了运算方便,矩阵的行列都从1 算起,三元组表data 也从1 单元用起)。

算法思路:

①A 的行、列转化成B 的列、行;

②在A.data 中依次找第一列的、第二列的、直到最后一列,并将找到的每个三元组的行、列交换后顺序存储到B.data 中即可。

算法如下:

void TransM1 (SPMatrix *A)

{ SPMatrix *B;

int p,q,col;

B=malloc(sizeof(SPMatrix)); /*申请存储空间*/

B->mu=A->nu; B->nu=A->mu; B->tu=A->tu;

/*稀疏矩阵的行、列、元素个数*/

if (B->tu>0) /*有非零元素则转换*/

{ q=0;

for (col=1; col&l

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值