稀少矩陣的可視化。
間諜圖顯示矩陣中的非零元素。
這個間諜圖顯示了一個稀少對稱正定矩陣,來自哈韋爾波恩測試矩陣“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));
按”Enter“鍵。
如圖1所示。
計較喬爾斯基因子。
此刻我們計較喬爾斯基因子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)));
按”Enter“鍵。
如圖2所示。
從頭排序以加速計較速度
經由過程從頭排序矩陣的行和列,可以削減因因因式分化而發生的填充量,從而削減時候和存儲當作本。
我們此刻測驗考試三種分歧的排序,由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));
按”Enter“鍵。
如圖3所示。
因為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)));
按”Enter“鍵。
如圖4所示。
利用列計數
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));
按”Enter“鍵。
如圖5所示。
對于這個示例,列計數挨次正好削減了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)));
按”Enter“鍵。
如圖6所示。
利用最小度數。
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));
按”Enter“鍵。
如圖7所示。
最小度算法發生的零塊保留在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)));
按”Enter“鍵。
如圖8所示。
總結成果。
號令行鍵入:
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;
按”Enter“鍵。
如圖9所示。
END0 篇文章
如果覺得我的文章對您有用,請隨意打賞。你的支持將鼓勵我繼續創作!