Это идеальное решение для 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
Nice! Спасибо за очень сложный ответ! – Lisa
Пойдите большой или идите домой, не так ли? Но серьезно, 'tankarray' - очень универсальная функция. Это также хороший альтернативный способ сделать гистограмму. – chappjc