初始化稀疏矩阵 matlab,访问稀疏矩阵- MATLAB Simulink- MathWorks 中国
稀疏矩陣運算中的索引
由于稀疏矩陣是以壓縮稀疏列格式存儲的,因此為稀疏矩陣進行索引的相關成本與為滿矩陣進行索引的相關成本不同。在只需更改稀疏矩陣中的若干元素時,這類成本可忽略不計,因此,在這類情況下,通常使用常規數組索引來重新分配值:
B = speye(4);
[i,j,s] = find(B);
[i,j,s]
ans =
1 1 1
2 2 1
3 3 1
4 4 1
B(3,1) = 42;
[i,j,s] = find(B);
[i,j,s]
ans =
1 1 1
3 1 42
2 2 1
3 3 1
4 4 1在存儲新矩陣時,為使 42 位于 (3,1) 位置,MATLAB 會在非零值向量和下標向量中插入額外的一行,然后移動 (3,1) 后面的所有矩陣值。
如果線性索引超過 2^48-1(即當前矩陣中允許的元素數上限),使用線性索引在大型稀疏矩陣中訪問或指定元素將失敗。
S = spalloc(2^30,2^30,2);
S(end) = 1
Maximum variable size allowed by the program is exceeded.
要訪問其線性索引大于 intmax 的元素,請使用數組索引:
S(2^30,2^30) = 1
S =
(1073741824,1073741824) 1
盡管在稀疏矩陣中進行索引以更改單個元素的成本可忽略不計,但該成本在循環環境下會增加,而且在大型矩陣中該操作可能會使執行速度變得很慢。因此,在需要更改大量稀疏矩陣元素的情況下,最好使用向量化方法而不要使用循環方法來執行該操作。例如,考慮稀疏單位矩陣:
n = 10000;
A = 4*speye(n);以循環方式更改 A 的元素慢于類似的向量化運算:
tic
A(1:n-1,n) = -1;
A(n,1:n-1) = -1;
toc
Elapsed time is 0.003344 seconds.
tic
for k = 1:n-1
C(k,n) = -1;
C(n,k) = -1;
end
toc
Elapsed time is 0.448069 seconds.由于 MATLAB 以壓縮稀疏列格式存儲稀疏矩陣,因此,在循環的每個遍歷期間,它都需要移動 A 中的多個條目。
如果為稀疏矩陣預分配內存,然后以類似的逐個元素的方式填充,會使對稀疏數組進行索引產生大量開銷:
S1 = spalloc(1000,1000,100000);
tic;
for n = 1:100000
i = ceil(1000*rand(1,1));
j = ceil(1000*rand(1,1));
S1(i,j) = rand(1,1);
end
toc
Elapsed time is 2.577527 seconds.
構建索引和值向量則無需為稀疏數組進行索引,因此這種方法的速度快得多:
i = ceil(1000*rand(100000,1));
j = ceil(1000*rand(100000,1));
v = zeros(size(i));
for n = 1:100000
v(n) = rand(1,1);
end
tic;
S2 = sparse(i,j,v,1000,1000);
toc
Elapsed time is 0.017676 seconds.
因此,最好使用構造函數(例如 sparse 或 spdiags 函數)一次構造所有稀疏矩陣。
例如,假定需要稀疏形式的坐標矩陣 C:
C=(4000?10400?10040?101010141?14)
使用 sparse 函數,以及行下標、列下標和值組成的三聯對組,直接構造該五列矩陣:
i = [1 5 2 5 3 5 4 5 1 2 3 4 5]';
j = [1 1 2 2 3 3 4 4 5 5 5 5 5]';
s = [4 1 4 1 4 1 4 1 -1 -1 -1 -1 4]';
C = sparse(i,j,s)
C =
(1,1) 4
(5,1) 1
(2,2) 4
(5,2) 1
(3,3) 4
(5,3) 1
(4,4) 4
(5,4) 1
(1,5) -1
(2,5) -1
(3,5) -1
(4,5) -1
(5,5) 4輸出中值的順序反映了底層的按列存儲。有關 MATLAB 如何存儲稀疏矩陣的詳細信息,請參閱 John R. Gilbert、Cleve Moler 和 Robert Schreiber 合著的 Sparse Matrices In Matlab:Design and Implementation, (SIAM Journal on Matrix Analysis and Applications, 13:1, 333–356 (1992))。
總結
以上是生活随笔為你收集整理的初始化稀疏矩阵 matlab,访问稀疏矩阵- MATLAB Simulink- MathWorks 中国的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab 康托尔集,测测你的数学直觉
- 下一篇: 数字图像处理matlab实验对图像复原,