稀疏矩阵重新排序

此示例示出了如何重新排列的稀疏矩阵的行和列可以影响的矩阵操作的速度和存储要求。

可视化稀疏矩阵

一个间谍曲线示出在一个矩阵中的非零元素。

这个间谍曲线图示出了从杠铃矩阵的一部分导出的稀疏对称正定矩阵。该矩阵描述了一种类似杠铃的图形连接。

加载barbellgraph.matS = A + speye(尺寸(A));PCT = 100 / numel(A);间谍(S)标题(“A稀疏对称矩阵”)NZ = NNZ(S);xlabel(sprintf的('非零=%d(%.3f %%)',NZ,NZ * PCT));

这里是杠铃图形的曲线图。

G =图表(S,'omitselfloops');P =情节(G,“扩展数据”,XY(:,1),'YDATA',XY(:,2),“标记”'');轴等于

计算乔列斯基因子

计算乔莱斯基因素大号,其中S = L * L”。注意大号包含许多更非零元素比无分裂小号,因为Cholesky分解的计算产生填写非零元。这些填充价值观减慢算法和增加存储成本。

L = CHOL(S,'降低');间谍(L)标题(“S的Cholesky分解”)NC(1)= NNZ(L);xlabel(sprintf的('非零=%d(%.2f %%)',NC(1),NC(1)* PCT));

重新排序,以加快计算

通过重新排序的矩阵的行和列,所以能够减少填充在该因式分解创建,从而减少时间和随后的计算的存储成本的量。

通过MATLAB®支持几种不同的重新排序是:万博1manbetx

  • colperm:列数

  • symrcm:反Cuthill - 麦基

  • AMD:最低程度

  • 解剖:嵌套解剖

测试的杠铃矩阵这些稀疏矩阵重新排序的效果。

列数重新排序

colperm命令使用列计数重排序算法,以移动的行和列具有较高非零朝向基体的端计数。

Q = colperm(S);间谍(S(Q,Q))标题('S(Q,Q)列计数订货' 之后)NZ = NNZ(S);xlabel(sprintf的('非零=%d(%.3f %%)',NZ,NZ * PCT));

对于这个矩阵的列数排序勉强可以减少Cholesky分解的时间和存储空间。

L = CHOL(S(Q,Q),'降低');间谍(L)标题('CHOL(S(Q,Q))列计数订货' 之后)NC(2)= NNZ(L);xlabel(sprintf的('非零=%d(%.2f %%)',NC(2),NC(2)* PCT));

反向Cuthill - 麦基重新排序

symrcm命令使用反向Cuthill-麦基重排序算法靠拢所有非零元素的对角,降低了原始矩阵的带宽。

d = symrcm(S);间谍(S(d,d))标题('S(d,d)Cuthill-麦基订货' 之后)NZ = NNZ(S);xlabel(sprintf的('非零=%d(%.3f %%)',NZ,NZ * PCT));

其注入由Cholesky分解产生被限制在频带,所以因式分解经重新排序的矩阵花费较少的时间和较少的存储。

L = CHOL(S(d,d),'降低');间谍(L)标题('CHOL(S(d,d))Cuthill-麦基订货' 之后)NC(3)= NNZ(L);xlabel(sprintf的('非零=%d(%.2f %%)',NC(3),NC(3)* PCT));

最小度重新排序

AMD命令使用的近似最小度算法(一种强大的图论技术),以产生在基质中的零的大块。

R = AMD(S);间谍(S(R,R))标题('S(R,R)最小度排序之后')NZ = NNZ(S);xlabel(sprintf的('非零=%d(%.3f %%)',NZ,NZ * PCT));

Cholesky分解保留由最小程度算法产生的零的块。这种结构可以显著减少时间和存储成本。

L = CHOL(S(R,R),'降低');间谍(L)标题('CHOL(S(R,R))最小的有序度' 之后)NC(4)= NNZ(L);xlabel(sprintf的('非零=%d(%.2f %%)',NC(4),NC(4)* PCT));

嵌套解剖置换

解剖函数使用图论技术来产生填充减少排序。该算法对待矩阵作为图的邻接矩阵,通过折叠顶点和边,重新排序的较小的图粗大化的图形,然后使用细化步骤uncoarsen小图形和产生原始图形的重新排序。其结果是一个功能强大的算法,该算法常常产生相对于其他重排序算法,在填充物的量最少。

P =解剖(S);间谍(S(P,P))标题('S(P,P)嵌套夹层订货' 之后)NZ = NNZ(S);xlabel(sprintf的('非零=%d(%.3f %%)',NZ,NZ * PCT));

类似于最小程度排序,嵌套解剖排序的Cholesky分解大多保留的非零结构S(d,d)下面的主对角线。

L = CHOL(S(P,P),'降低');间谍(L)标题('CHOL(S(P,P))后嵌套夹层订货')NC(5)= NNZ(L);xlabel(sprintf的('非零=%d(%.2f %%)',NC(5),NC(5)* PCT));

结果汇总

此条形图总结进行Cholesky分解之前重新排序矩阵的效果。虽然原始矩阵的Cholesky因式分解有它的元件的非零元素约8%,使用解剖要么symamd降低了密度为小于1%。

标签= {'原版的'“列数”“Cuthill  - 麦基...“最低程度”“嵌套解剖”};酒吧(NC * PCT)称号(“非零Cholesky分解后”)ylabel('百分');AX = GCA;ax.XTickLabel =标签;ax.XTickLabelRotation = -45;

也可以看看

|||||