2
我想在稀疏矩陣中獲得每行最小非零值。我發現密集矩陣的解決方案建議通過將它們設置爲NaN
或Inf
來掩蓋零值。但是,這對於稀疏矩陣顯然不起作用。在稀疏矩陣中查找行向最小值
理想情況下,我應該得到所有在行極小的列向量,因爲我會
minValues = min(A, [], 2);
除,顯然得到,使用min
給我留下了一個全零列向量由於稀疏。有沒有使用find
的解決方案?
我想在稀疏矩陣中獲得每行最小非零值。我發現密集矩陣的解決方案建議通過將它們設置爲NaN
或Inf
來掩蓋零值。但是,這對於稀疏矩陣顯然不起作用。在稀疏矩陣中查找行向最小值
理想情況下,我應該得到所有在行極小的列向量,因爲我會
minValues = min(A, [], 2);
除,顯然得到,使用min
給我留下了一個全零列向量由於稀疏。有沒有使用find
的解決方案?
這是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
不錯!感謝您的精心解答! – Lisa
去大或回家吧?但嚴重的是,'accumarray'是一個非常多功能的功能。這也是製作直方圖的一個很好的替代方法。 – chappjc