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