2013-10-14 49 views
2

我想在稀疏矩陣中獲得每行最小非零值。我發現密集矩陣的解決方案建議通過將它們設置爲NaNInf來掩蓋零值。但是,這對於稀疏矩陣顯然不起作用。在稀疏矩陣中查找行向最小值

理想情況下,我應該得到所有在行極小的列向量,因爲我會

minValues = min(A, [], 2); 

除,顯然得到,使用min給我留下了一個全零列向量由於稀疏。有沒有使用find的解決方案?

回答

3

這是accumarray的完美選擇。考慮下面的稀疏矩陣,

vals = [3 1 1 9 7 4 10 1]; % got this from randi(10,1,8) 
S = sparse([1 3 4 4 5 5 7 9],[2 2 3 6 7 8 8 11],vals); 

找每一行的最小值,對於空元素假設0:

[ii,jj] = find(S); 
rowMinVals = accumarray(ii,nonzeros(S),[],@min) 

注意,行4和rowMinVals 5,它們是僅有的兩個行與多個非零值S分別等於行的分鐘:

rowMinVals = 
    3 
    0 
    1 
    1 % min([1 9] 
    4 % min([7 4] 
    0 
    10 
    0 
    1 

如果您稀疏矩陣的最後一行(S)不包含任何非零,但你希望你的分排值輸出,以反映你有numRows,例如,按如下方式更改accumarray命令,

rowMinVals = accumarray(ii,nonzeros(S),[numRows 1],@min). 

另外,也許你還希望避免包括出默認0。一種處理這個問題的方法是將fillval輸入參數設置爲NaN

rowMinVals = accumarray(ii,nonzeros(S),[numRows 1],@min,NaN) 

rowMinVals = 

    3 
    NaN 
    1 
    1 
    4 
    NaN 
    10 
    NaN 
    1 
    NaN 
    NaN 
    NaN 

或者您也可以繼續使用稀疏矩陣與第五輸入參數,issparse

>> rowMinVals = accumarray(ii,nonzeros(S),[],@min,[],true) 
    rowMinVals = 
    (1,1)  3 
    (3,1)  1 
    (4,1)  1 
    (5,1)  4 
    (7,1)  10 
    (9,1)  1 
+1

不錯!感謝您的精心解答! – Lisa

+0

去大或回家吧?但嚴重的是,'accumarray'是一個非常多功能的功能。這也是製作直方圖的一個很好的替代方法。 – chappjc