多语言展示
当前在线:261今日阅读:113今日分享:31

matlab怎么使用稀疏矩阵?

此示例演示如何重新排列稀疏矩阵的行和列,从而影响矩阵操作的速度和存储要求。
工具/原料
1

matlab软件

2

电脑

方法/步骤
1

稀疏矩阵的可视化。间谍图显示矩阵中的非零元素。 这个间谍图显示了一个稀疏对称正定矩阵,来自哈韦尔波恩测试矩阵“West0749”的一部分,该矩阵描述了在化工厂中的衍射柱模型中的连接。 命令行键入:load west0479.matA = west0479;S = A * A' + speye(size(A));pct = 100 / numel(A); figurespy(S)title('A Sparse Symmetric Matrix')nz = nnz(S);xlabel(sprintf('nonzeros = %d (%.3f%%)',nz,nz*pct));

2

按”Enter“键。如图1所示。

3

计算乔尔斯基因子。现在我们计算乔尔斯基因子L,其中S=L*L‘。注意,L包含的非零元素比未分解的S要多得多,因为Cholesky因式分解的计算创建了“填充”非零。这减慢了算法的速度,增加了存储成本。ticL = chol(S,'lower');t(1) = toc;spy(L), title('Cholesky decomposition of S')nc(1) = nnz(L);xlabel(sprintf('nonzeros = %d (%.2f%%)   time = %.2f sec',nc(1),nc(1)*pct,t(1)));

4

按”Enter“键。如图2所示。

5

重新排序以加快计算速度通过重新排序矩阵的行和列,可以减少因因因式分解而产生的填充量,从而减少时间和存储成本。我们现在尝试三种不同的排序,由MATLAB支持.反向切希尔-麦基列计数最低程度使用反向切希尔-麦基SYMRCM命令使用反向的Cuthill-McKee重新排序算法将所有非零元素移到对角线附近,从而减少了原始矩阵的“带宽”。命令行键入:p = symrcm(S);spy(S(p,p))title('S(p,p) after Cuthill-McKee ordering')nz = nnz(S);xlabel(sprintf('nonzeros = %d (%.3f%%)',nz,nz*pct));

6

按”Enter“键。如图3所示。

7

由于Cholesky因式分解产生的填充被限制在带内,使得重新排序后的矩阵因式分解所需的时间更短,存储更少。命令行键入:ticL = chol(S(p,p),'lower');t(2) = toc;spy(L)title('chol(S(p,p)) after Cuthill-McKee ordering')nc(2) = nnz(L);xlabel(sprintf('nonzeros = %d (%.2f%%)   time = %.2f sec', nc(2),nc(2)*pct,t(2)));

8

按”Enter“键。如图4所示。

9

使用列计数COLPERM命令使用列计数重新排序算法将非零计数更高的行和列移到矩阵的末尾。命令行键入:q = colperm(S);spy(S(q,q)), title('S(q,q) after column count ordering')nz = nnz(S);xlabel(sprintf('nonzeros = %d (%.3f%%)',nz,nz*pct));

10

按”Enter“键。如图5所示。

11

对于这个示例,列计数顺序正好减少了Cholesky分解的时间和存储量,但是这种行为通常是无法预料的。ticL = chol(S(q,q),'lower');t(3) = toc; spy(L)title('chol(S(q,q)) after column count ordering')nc(3) = nnz(L);xlabel(sprintf('nonzeros = %d (%.2f%%)   time = %.2f sec',nc(3),nc(3)*pct,t(3)));

12

按”Enter“键。如图6所示。

13

使用最小度数。SYMAMD命令使用近似最小度算法(一种强大的图论技术)在矩阵中产生大的零块。命令行窗口键入:r = symamd(S);spy(S(r,r)), title('S(r,r) after minimum degree ordering')nz = nnz(S);xlabel(sprintf('nonzeros = %d (%.3f%%)',nz,nz*pct));

14

按”Enter“键。如图7所示。

15

最小度算法产生的零块保留在Cholesky分解过程中。这可以显着减少时间和存储成本。 ticL = chol(S(r,r),'lower');t(4) = toc; spy(L)title('chol(S(r,r)) after minimum degree ordering')nc(4) = nnz(L);xlabel(sprintf('nonzeros = %d (%.2f%%)   time = %.2f sec',nc(4),nc(4)*pct,t(4)));

16

按”Enter“键。如图8所示。

17

总结结果。命令行键入:labels = {'original','Cuthill-McKee','column count','min degree'}; ax = subplot(2,1,1);bar(nc*pct)title('Nonzeros after Cholesky factorization')ylabel('Percent');ax.XTickLabel = labels; ax = subplot(2,1,2);bar(t)title('Time to complete Cholesky factorization')ylabel('Seconds');ax.XTickLabel = labels;

18

按”Enter“键。如图9所示。

推荐信息