我想在稀疏矩阵中获得每行的最小非零值。我发现密集矩阵的解决方案建议通过将它们设置为NaN
或Inf
来掩盖零值。但是,这显然不适用于稀疏矩阵。
理想情况下,我应该得到所有行最小值的列向量,就像我得到的那样
minValues = min( A, [], 2);
显然,由于稀疏性,使用min
会给我留下全零列向量。是否有使用find
的解决方案?
答案 0 :(得分: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)
请注意rowMinVals
的第4行和第5行(它们是具有多个非零值的S的唯一两行)等于行的最小值:
rowMinVals =
3
0
1
1 % min([1 9]
4 % min([7 4]
0
10
0
1
如果稀疏矩阵的最后一行不包含任何非零,但您希望最小行值输出反映出您具有numRows
,例如,请更改{{1}命令如下,
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