我想在稀疏矩阵中获得每行的最小非零值。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 行和第 5rowMinVals
行是 S 中仅有的具有多个非零值的两行,它们等于该行的最小值:
rowMinVals =
3
0
1
1 % min([1 9]
4 % min([7 4]
0
10
0
1
如果您的稀疏矩阵的最后一行不包含任何非零,但您希望您的最小行值输出反映您有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