2016-03-26 2 views
3

Мне нужно найти индекс максимального элемента в каждой строке в матрице в MATLAB. Что-то вродеИндекс элемента максимального значения в каждой строке (последний индекс)

[~,indexes] = maxValues = max(p_y_x,[],2); 

отлично работает, но мне нужно, чтобы получить последний индекс (если есть больше чем один с максимальным значением). Теперь у меня есть что-то вроде этого:

N=size(p_y_x,1); 
maxValues = max(p_y_x,[],2); 
indexes=zeros(1,N); 

for n=1:N 
    indexes(n)=find(p_y_x(n,:)==maxValues(n),1,'last'); 
end 

Что является сложным и не очень эффективно (из цикла for).

Я сомневаюсь в том, что тривиальное должно быть сделано таким образом. Существует ли более оптимальное решение?

ответ

4

Тот же код для поиска первого вхождения работ для последнего, если вы переверните массив по горизонтали, а затем исправьте индексы:

[~, indexes] = max(fliplr(p_y_x),[],2); 
indexes = size(p_y_x,2)-indexes+1; 
+1

Обратите внимание, что это самый быстрый вариант, безусловно. По моим таймингам Мой ответ так же быстро, как оригинал (на удивление достаточно), @ Divakar's на 35% быстрее, это на 70% быстрее. – Adriaan

+0

@Adriaan Спасибо за время! –

+0

Да, это действительно самое быстрое решение. – michalsol

4

Вы можете использовать linear indexing, чтобы получить последний индекс максимума, находя все максимальные значения в строке, а затем с помощью индекса последнего проиндексировать исходный столбец:

N=size(p_y_x,1); 

for n=1:N 
    [~, indices(n)] = max(fliplr(p_y_x(n,:))); %// find maxima in a row 
end 
indices= size(p_y_x,2)-indices+1; 

С нового исполнения двигателя был введен в MATLAB R2015b for. Циклы уже не очень медленные, и это интуитивно понятный способ сделать это. Опуская время, затрачиваемое на время, find, вероятно, будет самым большим улучшением эффективности, которое вы можете сделать.

Обратите внимание, что я переименовал indexes в indices, так как это латинское множественное число.

4

Пусть bsxfun и accumarray помочь вам -

[r,c] = find(bsxfun(@eq,p_y_x,max(p_y_x,[],2))) 
indexes = accumarray(r,c,[],@max) 

Если вы являетесь поклонником one-liners, для удовольствия вы также можете сделать -

[~,indexes] = max(cumsum(bsxfun(@eq,p_y_x,max(p_y_x,[],2)),2),[],2) 
Смежные вопросы