Стабильный кластер в MATLAB
Встроенная функция MATLABaccumarray
принимает функциюfun
в качестве четвертого аргумента.
A = accumarray(subs,val,sz,fun);
Это относитсяfun
для каждого подмножества элементов вval
которые имеют идентичные подписки вsubs
, Документация однако заявляет:
Если подписки вsubs
не сортируются по своим линейным показателям,fun
не должно зависеть от порядка значений во входных данных.
Как мы можем реализоватьстабильный версияaccumarray
, который не имеет этого ограничения, но гарантирует, что подмножества принимают тот же порядок, что иval
?
Пример:
subs = [1:10,1:10];
val = 1:20;
accumarray(subs(:), val(:), [], @(x)x(end)).'
Ожидаемый результат этого будет11:20
еслиaccumarray
были стабильны. На самом деле вывод:
ans =
11 12 13 14 5 6 7 18 19 20
Наша реализация должна дать:
accumarrayStable(subs(:), val(:), [], @(x)x(end)).'`
ans =
11 12 13 14 15 16 17 18 19 20