2013-10-14 46 views
2

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

理想情况下,我应该得到所有在行极小的列向量,因为我会

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

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

回答

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和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 
+1

不错!感谢您的精心解答! – Lisa

+0

去大或回家吧?但严重的是,'accumarray'是一个非常多功能的功能。这也是制作直方图的一个很好的替代方法。 – chappjc