【问题标题】:Index of maximum value element in each row (last index)每行中最大值元素的索引(最后一个索引)
【发布时间】:2016-07-14 07:30:36
【问题描述】:

我需要在 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 循环)。

我怀疑必须以这种方式完成微不足道的事情。有没有更优化的解决方案?

【问题讨论】:

    标签: matlab for-loop matrix max


    【解决方案1】:

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

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

    【讨论】:

    • 请注意,这是迄今为止最快的选择。根据我的时间安排,我的答案与原始答案一样快(令人惊讶的是),@Divakar 的速度快了 35%,而这个速度则快了 70%。
    • @Adriaan 感谢您的时间!
    • 是的,这确实是最快的解决方案。
    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

      您可以使用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,因为那是拉丁文的复数形式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-30
        • 2012-12-10
        • 1970-01-01
        • 2021-04-20
        • 2022-01-05
        • 2021-07-02
        • 2019-05-14
        相关资源
        最近更新 更多