第5章数组的转置.pptVIP

  • 1
  • 0
  • 约3.27千字
  • 约 8页
  • 2017-05-29 发布于四川
  • 举报
稀疏矩阵的操作 方法1:压缩转置 方法2 快速转置 设计思路: 令:M矩阵中的列变量用col表示; num[ col ]:存放M中第col 列中非0元素个数 cpot[ col ]:存放M中第col列的第一个非0元素的位置 (即b.data中待计算的“恰当”位置所需参考点) * * 0 12 9 0 0 0 0 0 0 0 0 0 -3 0 0 0 14 0 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0 0 0 –3 0 0 15 12 0 0 0 18 0 9 0 0 24 0 0 0 0 0 0 0 -7 0 0 14 0 0 0 0 0 0 0 0 0 (6, 4, -7) (6, 1, 15) (5, 2, 18) (4, 3, 24) (3, 5, 14) (3, 1, -3) (1, 3, 9 ) (1, 2, 12) (5, 3, 14) (4, 6, -7) (3, 4, 24) (3, 1, 9) (2, 5, 18) (2, 1, 12) (1, 6, 15) (1, 3, -3) 已知 三 元 组 表 a.data 求 三 元 组 表 b.data 转置后 M T (转置运算) 目的: 除了: (1)每个元素的行下标和列下标互换(即三元组中的i和j互换); 还需要:(2) T的总行数mu和总列数nu也要互换; (3)重排三元组内各元素顺序,使转置后的三元组也按行(或列)为主序有规律的排列。 上述(1)和(2)容易实现,难点在(3)。 有两种实现转置的方法 压缩转置 快速(压缩)转置 思路:反复扫描a表(记为a.data)中的列序,从j=1~n依次进行转置。 已知 三 元 组 表 a.data 求 三 元 组 表 b.data ① (1, 3, -3) ② (1, 6, 15) ③ (2, 1, 12) ④ (2, 5, 18) ⑤ (3, 1, 9) ⑥ (3, 4, 24) ⑦ (4, 6, -7) ⑧ (5, 3, 14) (6, 4, -7) (6, 1, 15) (5, 2, 18) (4, 3, 24) (3, 5, 14) (3, 1, -3) (1, 3, 9 ) (1, 2, 12) 1 1 2 2 col q 1 2 3 4 每个元素的列分量表示为: a.data[p].j p 1 2 3 4 . . . . . . 已知 三 元 组 表 a.data 求 三 元 组 表 b.data ③ (1, 3, -3) ① (2 ,1, 12) ⑥ (2, 5, 18) ② (3, 1, 9) ⑧ (4, 6, -7) ④ (5, 3, 14) ⑦ (1, 6, 15) ⑤ (3, 4, 24) (6, 4, -7) (6, 1, 15) (5, 2, 18) (4, 3, 24) (3, 5, 14) (3, 1, -3) (1, 3, 9 ) (1, 2, 12) 思路:依次把a.data中的元素直接送入b.data的恰当位置上(即M三元组的p指针不回溯)。 关键:怎样寻找b.data的“恰当”位置? p 1 2 3 4 q 3 5 如果能预知M矩阵每一列(即T的每一行)的非零元素个数, 又能很快得知第一个非零元素在b.data中的位置, 则扫描a.data时便可以将每个元素准确定位(因已知若干参考点) 技巧:为实现转置运算,应当按列生成 M 矩阵三元组表的两个辅助向量,让它携带每列的非零元素个数 NUM(i) 以及每列的第一个非零元素在三元组表中的位置POS(i) 等信息。 2 1 1 2 0 2 NUM(i) 7 6 6 5 5 4 3 3 3 1 POS( i ) 2 1 i 计算式:POS(1)=1 POS(i)=POS(i-1)+NUM(i-1) 辅助向量的样式: 请注意a.data特征:每列首个非零元素必定先被扫描到。 讨论:求出按列优先的辅助向量后,如何实现快速转置? 0 1 1 2 2 2 num[col] 6 5 4 3 1 cpot[col] 2 1 col 计算式: cpot(1)=1 cpot[col] = cpot[

文档评论(0)

1亿VIP精品文档

相关文档