每行中最大值元素的索引(最后一个索引)

时间:2016-03-26 17:43:29

标签: matlab for-loop matrix max

我需要在MATLAB中找到矩阵中每行的最大元素索引。 像

这样的东西
[~,indexes] = maxValues = max(p_y_x,[],2);

工作正常,但我需要获得LAST索引(当有多个具有最大值时)。 现在我有这样的事情:

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循环)。

我怀疑那些微不足道的事情必须这样做。有更优化的解决方案吗?

3 个答案:

答案 0 :(得分:4)

您可以使用linear indexing通过查找行中的所有最大值,然后使用last的索引来索引原始列来获取最大索引:

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,因为这是拉丁文复数。

答案 1 :(得分:4)

bsxfunaccumarray帮助您 -

[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)

答案 2 :(得分:4)

如果您水平翻转数组然后更正索引,找到第一个匹配项的相同代码适用于最后一个:

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