• <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>

    matlab怎么使用稀疏矩陣

    此示例演示如何重新排列稀疏矩陣的行和列,從而影響矩陣操作的速度和存儲要求。

    東西/原料

    • matlab軟件
    • 電腦

    方式/步調

    1. 1

      稀少矩陣的可視化。

      間諜圖顯示矩陣中的非零元素。

      這個間諜圖顯示了一個稀少對稱正定矩陣,來自哈韋爾波恩測試矩陣“West0749”的一部門,該矩陣描述了在化工場中的衍射柱模子中的毗連。

      號令行鍵入:

      load west0479.mat

      A = west0479;

      S = A * A' + speye(size(A));

      pct = 100 / numel(A);


      figure

      spy(S)

      title('A Sparse Symmetric Matrix')

      nz = nnz(S);

      xlabel(sprintf('nonzeros = %d (%.3f%%)',nz,nz*pct));

    2. 2

      按”Enter“鍵。

      如圖1所示。

    3. 3

      計較喬爾斯基因子。

      此刻我們計較喬爾斯基因子L,此中S=L*L‘。

      注重,L包含的非零元素比未分化的S要多得多,因為Cholesky因式分化的計較建立了“填充”非零。

      這減慢了算法的速度,增添了存儲當作本。

      tic

      L = 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. 4

      按”Enter“鍵。

      如圖2所示。

    5. 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. 6

      按”Enter“鍵。

      如圖3所示。

    7. 7

      因為Cholesky因式分化發生的填充被限制在帶內,使得從頭排序后的矩陣因式分化所需的時候更短,存儲更少。

      號令行鍵入:

      tic

      L = 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. 8

      按”Enter“鍵。

      如圖4所示。

    9. 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. 10

      按”Enter“鍵。

      如圖5所示。

    11. 11

      對于這個示例,列計數挨次正好削減了Cholesky分化的時候和存儲量,可是這種行為凡是是無法預料的。

      tic

      L = 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. 12

      按”Enter“鍵。

      如圖6所示。

    13. 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. 14

      按”Enter“鍵。

      如圖7所示。

    15. 15

      最小度算法發生的零塊保留在Cholesky分化過程中。

      這可以光鮮明顯削減時候和存儲當作本。

      tic

      L = 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. 16

      按”Enter“鍵。

      如圖8所示。

    17. 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. 18

      按”Enter“鍵。

      如圖9所示。

      END
    原作者:matlab教程舉報
    • 發表于 2020-02-13 20:00
    • 閱讀 ( 1543 )
    • 分類:其他類型

    你可能感興趣的文章

    相關問題

    0 條評論

    請先 登錄 后評論
    聯系我們:uytrv@hotmail.com 問答工具
  • <noscript id="ecgc0"><kbd id="ecgc0"></kbd></noscript>
    <menu id="ecgc0"></menu>
  • <tt id="ecgc0"></tt>
    久久久久精品国产麻豆