2013-10-14 6 views
2

Я хотел бы получить минимальные ненулевые значения в строке в разреженной матрице. Решения, которые я нашел для плотных матриц, предполагали маскировку нулевых значений, установив их на NaN или Inf. Однако это явно не работает для разреженных матриц.Найти минимальные строки в разреженной матрице

В идеале, я должен получить вектор-столбца всех строчных минимумов, так как я хотел бы получить с

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 и 5 rowMinVals, которые являются единственными в два ряда 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

Nice! Спасибо за очень сложный ответ! – Lisa

+0

Пойдите большой или идите домой, не так ли? Но серьезно, 'tankarray' - очень универсальная функция. Это также хороший альтернативный способ сделать гистограмму. – chappjc

Смежные вопросы