2015-04-21 2 views
2

Мой вопрос более поддается рассмотрению на примере.Сортированный вектор индексов от вектора

Для произвольного вектора, то есть [6 2 5], я хочу получить еще один вектор, элементами которого являются отсортированные индексы входного вектора: в этом случае [3 1 2].

Есть ли функция MATLAB, способная вернуть это?

Спасибо!

ответ

3

использование второй аргумент sort дважды

[~, tmp] = sort(myInput); 
[~, myOutput] = sort(tmp); 

Относительно работающих раз:

n = 1000; 
x = unique(randi(100*n,1,n)); %// make sure all elements of x are different 
tic; %// try this answer 
[ii t]=sort(x); 
[ii out1]=sort(t); 
toc, 
tic; 
out2 = sum(bsxfun(@ge, x, x.')); 
toc 

Выход:

Elapsed time is 0.000778 seconds. %// this answer 
Elapsed time is 0.003835 seconds. %// bsxfun approach 
3

Если все элементы входного вектора x являются уверены, что различный, вы могли бы использовать bsxfun: для каждого элемента x, подсчитать, сколько элементов (в том числе и себя) она равна или превышает:

y = sum(triu(bsxfun(@ge, x(:).', x(:))), 1); 

Если элементы x являются не обязательно другого, вам нужен еще один шаг, чтобы убедиться, что сравнение сделано только с предыдущими и текущими элементами:

m = bsxfun(@ge, x(:).', x(:)); 
y = sum(m & ~tril(m,-1).', 1); 
+0

Столько, сколько я люблю 'bsxfun', в этом случае ваше решение O (N^2) в то время как' сортировки 'основанный solu это O (n log (n)) ... – Shai

+0

@Shai Да ... Просто чтобы предоставить альтернативу :-) –

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