第五章矩阵加法.pptVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第五章矩阵加法

* 已知两个稀疏矩阵A和B,分别采用十字链表存储,计算C=A+B,C也采用十字链表方式存储,并且在A的基础上形成C。由矩阵的加法规则知,只有A和B行列对应相等,二者才能相加。C中的非零元素cij只可能有3种情况:或者是aij+bij,或者是aij (bij=0),或者是bij (aij=0),因此当B加到A上时,对A十字链表的当前结点来说,对应下列四种情况:或者改变结点的值(aij+bij≠0),或者不变(bij=0),或者插入一个新结点(aij=0),还可能是删除一个结点(aij+bij=0)。整个运算从矩阵的第一行起逐行进行。对每一行都从行表的头结点出发,分别找到A和B在该行中的第一个非零元素结点后开始比较,然后按4种不同情况分别处理。设pa和pb分别指向A和B的十字链表中行号相同的两个结点,4种情况如下: 2.两个十字链表表示的稀疏矩阵的加法 若pa==NULL或pa-j 〉pb-j,则需要在A矩阵的链表 中插入一个值为bi,j的结点。此时,需改变同一行中前一结点的right域值,以及同一列中前一结点的down域值。 (2) 若pa-j〈 pb-j,则只要将pa指针往右推进一步。 (3) 若pa-j == pb-j且pa-e+pb-e !=0,则只要将 ai,j+bi,j 的值送到pa所指结点的e域即可,其它所 有域的值都不变。 (4) 若pa-j == pb-j且pa-e+pb-e == 0,则需要在A 矩阵的链表中删除pa所指的结点。此时,需改变同一 行中前一结点的right域值,以及同一列中前一结点的 down域值。 为了便于插入和删除结点,还需要设立一些辅助指针。其一是,在A的行链表上设pre指针,指示pa所指结点的前驱结点;其二是,在A的每一列的链表上设一个指针hl[j],它的初值和列链表的头指针相同,即hl[j]=chead[j]。 算法: (1) 初始,令pa和pb分别指向A和B的第一行的第一个非零元素的结点,即 pa=A.rhead[1]; pb=B.rhead[1]; pre = NULL; 且令hl初始化 for (j=1; j=A.nu; ++j) hl[j]=A.chead[j]; (2) 重复本步骤,依次处理本行结点,直到B的本行中无非零元素的结点,即pb==NULL为止: ① 若pa==NULL或pa-j〉pb-j(即A的这一行中非零元素已处理完),则需在A中插入一个pb所指结点的复制结点。假设新结点的地址为p,则A的行表中的指针作如下变化: if (pre == NULL) A.rhead[p-i]=p;else { pre-right=p; } p-right=pa; pre = p; A的列链表中的指针也要作相应的改变。首先需从hl[p-j]开始找到新结点在同一列中的前驱结点,并让hl[p-j]指向它,然后在列链表中插入新结点: if chead[p-j] == NULL { A.chead[p-j] = p; p-down = NULL; } else { p-down=hl[p-j]-down; hl[p-j]-down=p; } hl[p-j] = p; ② 若pa-j〈pb-j且pa!=Null,则令pa指向本行下一个非零元结点,即 pre=pa; pa=pa-right; ③ 若pa-j == pb-j,则将B中当前结点的值加到A中当前结点上,即 pa-e+=pb-e; 此时若pa-e!=0,则指针不变,否则删除A中该结点,即行表中指针变为 if pre == NULL rhead[pa-i] = pa-right; else { pre-right=pa-right; } p=pa; pa=pa-right; 同时,为了改变列表中的指针,需要先找到同一列中的前驱结点,且让hl[pa-j]指 向该结点,然后如下修改相应指针: if chead[p-j] == p chead[p-j] = hl[p-j] = p-down; else { hl[p-j]-down=p-down; } free (p); (3) 若本行不是最后一行,则令pa和pb指向下一行的第一个非零元结点,转(2);否则结束。 广义表 void OLMatrix_Add(OLMatrix A,OLMatrix B) { //把十字链表表示的矩阵B加到A上 ??for(j=1;j=A.nu;j++) cp[j]=A.chead[j]; //向量cp存储每一列当前最后

您可能关注的文档

文档评论(0)

jyf123 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6153235235000003

1亿VIP精品文档

相关文档