在稀疏矩阵中查找行方向最小值

时间:2013-10-14 16:34:35

标签: matlab sparse-matrix accumarray

我想在稀疏矩阵中获得每行的最小非零值。我发现密集矩阵的解决方案建议通过将它们设置为NaNInf来掩盖零值。但是,这显然不适用于稀疏矩阵。

理想情况下,我应该得到所有行最小值的列向量,就像我得到的那样

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

显然,由于稀疏性,使用min会给我留下全零列向量。是否有使用find的解决方案?

1 个答案:

答案 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