比方說,我有一個很大的零矩陣X,所以當然爲了節省內存和CPU,我使它變得稀疏。之後,我做了一些東西,並在某些時候我想要有非零元素。我的代碼看起來是這樣的:稀疏矩陣的非零元素
ind = M ~= 0; % Whereby M is the sparse Matrix
這看起來不過是愚蠢到我,因爲稀疏矩陣的結構應該允許的信息直接提取。
澄清:我不尋找可行的解決方案,但寧可避免兩次做同樣的事情。稀疏矩陣應該定義已知它是非零值,所以不需要搜索它。
你magu_
比方說,我有一個很大的零矩陣X,所以當然爲了節省內存和CPU,我使它變得稀疏。之後,我做了一些東西,並在某些時候我想要有非零元素。我的代碼看起來是這樣的:稀疏矩陣的非零元素
ind = M ~= 0; % Whereby M is the sparse Matrix
這看起來不過是愚蠢到我,因爲稀疏矩陣的結構應該允許的信息直接提取。
澄清:我不尋找可行的解決方案,但寧可避免兩次做同樣的事情。稀疏矩陣應該定義已知它是非零值,所以不需要搜索它。
你magu_
從稀疏矩陣檢索非零元素的直接方法是調用nonzeros()
。
的直接的方式顯然是最快方法,但是我進行對抗的邏輯索引一些測試,對稀疏及其full()
對手,並且對前者更快的索引(結果取決於稀疏模式和尺寸的矩陣)。
的時間的總和超過100次迭代是:
nonzeros: 0.02657 seconds
sparse idx: 0.52946 seconds
full idx: 2.27051 seconds
測試套件:
N = 100;
t = zeros(N,3);
for ii = 1:N
s = sprand(10000,1000,0.01);
r = full(s);
% Direct call nonzeros
tic
nonzeros(s);
t(ii,1) = toc;
% Indexing sparse
tic
full(s(s ~= 0));
t(ii,2) = toc;
% Indexing full
tic
r(r~=0);
t(ii,3) = toc;
end
sum(t)
我不知道你後什麼100%,但也許[r c] = find(M)
適合你更好?
您可以通過M(r,c)
得到M
的值,但最好的方法肯定會取決於您打算如何處理數據。
雖然find已經提出之前,我認爲這是一個重要的補充:
[r,c,v] = find(M);
,讓你不僅指數R,C,同時也是非零值v如果使用。 nonzeros命令似乎有點快,但由於[r,c,v]向量描述了完整的矩陣(矩陣維度除外),因此在處理稀疏矩陣時通常非常有用找到。
完整和稀疏的代碼或註釋似乎被切換。 –
@DennisJaheruddin他們不是。 'r'已滿,我需要將'(...)'轉換爲完整的才能得到最終結果,並且該步驟落入計時。 – Oleg
是的,這實際上就是我正在尋找的東西(我的意思是nonzeros)事情是。我做同樣的操作似乎很愚蠢(索引兩次)。 Thx爲答案。 –