Matlab 查找列的最后一个true元素

Matlab 查找列的最后一个true元素,matlab,indexing,Matlab,Indexing,我想使用条件为矩阵的每列提取一个值。每列上有多个值与该条件匹配,但只应选择最后一个值。可以安全地假设每行至少包含一个这样的值 因此,给定一个NxM矩阵和一个大小相等的布尔值,提取布尔值为真且是列中最后一个真值的M个值。例如: m = magic(4); i = (m > 10); % m = % 16 2 3 13 % 5 11 10 8 % 9 7 6 12 % 4 14 15 1 % i =

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

因此,给定一个NxM矩阵和一个大小相等的布尔值,提取布尔值为真且是列中最后一个真值的M个值。例如:

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]
我知道这可以通过在列中循环并使用
查找
来轻松实现,但根据我的经验,通常有更好的方法来解决这些问题。

这样就可以了

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
对列起作用。这将为我们提供每列中的最后一个索引

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

您可以使用的第二个输出来查找每列的最后一个true元素。在此之前,逻辑matrx应乘以递增的列向量

[~, idx] = max((1:size(i, 1)).' .* i, [], 1, 'linear') ;
x = m(idx) ;
下面是另一种方法,使用:


“线性”是做什么的?参考页中没有提到它。这不能简化为
max((1:size(i,1)).*i)
?如果没有线性,max函数将返回最大元素的行索引。但linear返回真正的索引。参考页面中有一个例子。我的答案就是使用这种方法的,因为我不知道
'linear'
参数,调用
sub2ind
感觉像个傻瓜!谢谢你的提示,这表明你对文章质量的关心。然而,我看到很多人在注意到他们的方式错误后,不费心修改或删除他们的帖子。如果你重新打开那篇文章,我将是你的选民之一。谢谢accumarray==MATLAB的瑞士军刀。@rahnema1确实如此!:-)
[~, col] = find(i); % column indices
lin = find(i); % linear indices
x = accumarray(col, m(lin), [], @(x) x(end));