我需要在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
循环)。
我怀疑那些微不足道的事情必须这样做。有更优化的解决方案吗?
答案 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)
让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)
答案 2 :(得分:4)
如果您水平翻转数组然后更正索引,找到第一个匹配项的相同代码适用于最后一个:
[~, indexes] = max(fliplr(p_y_x),[],2);
indexes = size(p_y_x,2)-indexes+1;