代码之家  ›  专栏  ›  技术社区  ›  Felix

查找列的最后一个真元素

  •  0
  • Felix  · 技术社区  · 5 年前

    我想用一个条件在矩阵的每列中提取一个值。每列上有多个值与该条件匹配,但只应选择最后一个值。可以安全地假设每行至少包含一个这样的值。

    m = magic(4);
    i = (m > 10);
    
    % m =
    % 16     2     3    13
    %  5    11    10     8
    %  9     7     6    12
    %  4    14    15     1
    
    % i =
    % 1   0   0   1
    % 0   1   0   0
    % 0   0   0   1
    % 0   1   1   0
    

    % i_ =
    % 1   0   0   0
    % 0   0   0   0
    % 0   0   0   1
    % 0   1   1   0
    
    % x = [16, 14, 15, 12]
    

    我知道通过在列中循环并使用 find 但根据我的经验,通常有更好的方法来解决这些问题。

    0 回复  |  直到 5 年前
        1
  •  3
  •   kkuilla    5 年前

    这样就行了

    m(max(i.*reshape([1:numel(m)],size(m))))
    

    解释

    reshape([1:numel(m)],size(m))
    
    ans =
    
    1    5    9   13
    2    6   10   14
    3    7   11   15
    4    8   12   16
    

    表示每个值的索引的。我们把它乘以 I

    i.*reshape([1:numel(m)],size(m))
    ans =
    
    1    0    0   13
    0    6    0    0
    0    0    0   15
    0    8   12    0
    

    然后我们做一个 max 从那以后 最大值 在柱上工作。这将给出每列中的最后一个索引。

    max(i.*reshape([1:numel(m)],size(m)))
    ans =
    
    1    8   12   15
    

    然后将这些索引应用于 m

    m(max(i.*reshape([1:numel(m)],size(m))))
    ans =
    
       16   14   15   12
    
        2
  •  3
  •   rahnema1    5 年前

    您可以使用 max

    [~, idx] = max((1:size(i, 1)).' .* i, [], 1, 'linear') ;
    x = m(idx) ;
    
        3
  •  1
  •   Luis Mendo    5 年前

    还有一种方法,使用 accumarray

    [~, col] = find(i); % column indices
    lin = find(i); % linear indices
    x = accumarray(col, m(lin), [], @(x) x(end));