2013-07-19 190 views
3

比方說,我有一個很大的零矩陣X,所以當然爲了節省內存和CPU,我使它變得稀疏。之後,我做了一些東西,並在某些時候我想要有非零元素。我的代碼看起來是這樣的:稀疏矩陣的非零元素

ind = M ~= 0; % Whereby M is the sparse Matrix 

這看起來不過是愚蠢到我,因爲稀疏矩陣的結構應該允許的信息直接提取。

澄清:我不尋找可行的解決方案,但寧可避免兩次做同樣的事情。稀疏矩陣應該定義已知它是非零值,所以不需要搜索它。

你magu_

回答

2

從稀疏矩陣檢索非零元素的直接方法是調用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) 
+0

完整和稀疏的代碼或註釋似乎被切換。 –

+0

@DennisJaheruddin他們不是。 'r'已滿,我需要將'(...)'轉換爲完整的才能得到最終結果,並且該步驟落入計時。 – Oleg

+0

是的,這實際上就是我正在尋找的東西(我的意思是nonzeros)事情是。我做同樣的操作似乎很愚蠢(索引兩次)。 Thx爲答案。 –

1

我不知道你後什麼100%,但也許[r c] = find(M)適合你更好?

您可以通過M(r,c)得到M的值,但最好的方法肯定會取決於您打算如何處理數據。

1

find功能由MATLAB建議:

[行,列] = find(X,...)返回矩陣X中非零項的行和列索引。This synt ax在使用稀疏矩陣時特別有用。

+0

查找檢索已由稀疏對象存儲的子向量。 'nonzeros()'直接檢索沒有任何額外索引的值。 – Oleg

1

雖然find已經提出之前,我認爲這是一個重要的補充:

[r,c,v] = find(M); 

,讓你不僅指數R,C,同時也是非零值v如果使用。 nonzeros命令似乎有點快,但由於[r,c,v]向量描述了完整的矩陣(矩陣維度除外),因此在處理稀疏矩陣時通常非常有用找到

相關問題