文档

稀疏矩阵重新排序

这个例子显示了如何重新排列稀疏矩阵的行和列可以影响矩阵运算的速度和存储需求。

想象一个稀疏矩阵

一个间谍图显示了一个矩阵中的非零元素。

间谍图显示了一个稀疏对称正定矩阵来自杠铃矩阵的一部分。这个矩阵描述连接图,类似于杠铃。

负载barbellgraph.matS = A + speye(大小(A));pct = 100 /元素个数(一个);间谍(S)标题(“一个稀疏对称矩阵”)新西兰= nnz(年代);包含(sprintf (“非零= % d (% .3f % %) '新西兰,新西兰* pct));

这是一个阴谋的杠铃图。

图G =(年代,“omitselfloops”);p =情节(G,“XData”xy (: 1),“YData”xy (: 2),“标记”,“。”);轴平等的

计算的柯列斯基因素

计算的柯列斯基因素l,在那里S = L * L '。请注意,l包含许多比unfactored更多的非零元素年代,因为柯列斯基分解的计算产生填写非零。这些补充物值降低算法,增加仓储成本。

L =胆固醇(年代,“低”);间谍(L)标题(柯列斯基分解的年代)数控(1)= nnz (L);包含(sprintf (“非零= % d (% .2f % %) '、数控(1)、数控(1)* pct));

重新排序加快计算速度

通过重构矩阵的行和列,可以减少分解产生的代替者,从而减少后续计算的时间和存储成本。

几种不同的重新排序由MATLAB®是:金宝app

  • colperm:列数

  • symrcm:反向Cuthill-McKee

  • amd:最小程度

  • 解剖:嵌套的解剖

测试这些稀疏矩阵的影响在杠铃矩阵重新排序。

列数重新排序

colperm命令使用的列数重新排序算法将非零计入较高的行和列的矩阵。

q = colperm(年代);间谍(S (q, q))标题((q, q)的列数排序后的)新西兰= nnz(年代);包含(sprintf (“非零= % d (% .3f % %) '新西兰,新西兰* pct));

这个矩阵的列数排序几乎不能减少对柯列斯基分解的时间和存储。

L =胆固醇(S (q, q),“低”);间谍(L)标题(胆固醇(S (q q)列数排序后的)数控(2)= nnz (L);包含(sprintf (“非零= % d (% .2f % %) '、数控(2)、数控(2)* pct));

反向Cuthill-McKee重新排序

symrcm命令使用反向Cuthill-McKee重新排序算法将所有非零元素接近对角线,减少原始矩阵的带宽。

d = symrcm(年代);间谍(S (d, d))标题(' S (d, d)经过Cuthill-McKee订购的)新西兰= nnz(年代);包含(sprintf (“非零= % d (% .3f % %) '新西兰,新西兰* pct));

柯列斯基分解产生的填写是局限于乐队,所以重新排序矩阵都可以花费更少的时间和更少的存储。

L =胆固醇(S (d, d),“低”);间谍(L)标题(“胆固醇(S (d, d))经过Cuthill-McKee订购的)数控(3)= nnz (L);包含(sprintf (“非零= % d (% .2f % %) '、数控(3)、数控(3)* pct));

最低程度上重新排序

amd命令使用一种近似最小度算法(一种强大的用图技术)产生大量的零矩阵。

r = amd(年代);间谍(S (r, r))标题((r, r)最低程度排序后的)新西兰= nnz(年代);包含(sprintf (“非零= % d (% .3f % %) '新西兰,新西兰* pct));

柯列斯基分解保护产生的零块的最小度算法。这种结构可以显著降低时间和存储成本。

L =胆固醇(S (r, r),“低”);间谍(L)标题(的胆固醇(S (r, r))最低程度排序后的)数控(4)= nnz (L);包含(sprintf (“非零= % d (% .2f % %) '、数控(4)、数控(4)* pct));

嵌套的解剖排列

解剖函数使用用技术来生产fill-reducing排序。算法将矩阵视为一个图的邻接矩阵,变粗崩溃的顶点和边的图,重新排列了较小的图,然后使用改进措施uncoarsen小图形和产生一个重新排序的原始图。经常的结果是一个强大的算法产生最少的代替者相比其他重新排序算法。

p =解剖(年代);间谍(S (p, p))标题((p, p)嵌套后解剖订购的)新西兰= nnz(年代);包含(sprintf (“非零= % d (% .3f % %) '新西兰,新西兰* pct));

类似于最小程度排序,嵌套的柯列斯基分解解剖点主要是保存的非零结构S (d, d)主对角线以下。

L =胆固醇(S (p, p),“低”);间谍(L)标题(的胆固醇(S (p, p))嵌套后解剖订购的)数控(5)= nnz (L);包含(sprintf (“非零= % d (% .2f % %) '、数控(5)、数控(5)* pct));

总结的结果

这个条形图总结了重新排序的影响矩阵之前执行柯列斯基分解。虽然柯列斯基分解原始矩阵的约8%的非零元素,使用解剖symamd减少,密度小于1%。

标签= {“原始”,“列数”,“Cuthill-McKee”,最小程度的,嵌套的解剖的};酒吧(数控* pct)标题(柯列斯基分解后非零的)ylabel (“百分比”);甘氨胆酸ax =;斧子。XTickLabel =标签;斧子。XTickLabelRotation = -45;

另请参阅

|||||