2

我想在稀疏矩阵中获得每行的最小非零值。NaN我为稠密矩阵找到的解决方案建议通过将零值设置为或来掩盖零值Inf。但是,这显然不适用于稀疏矩阵。

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

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

除了,显然,min由于稀疏性,使用给我留下了一个全零的列向量。有没有使用的解决方案find

4

1 回答 1

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)

请注意,第 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
于 2013-10-14T16:55:24.430 回答