Matlab 查找列的最后一个true元素
我想使用条件为矩阵的每列提取一个值。每列上有多个值与该条件匹配,但只应选择最后一个值。可以安全地假设每行至少包含一个这样的值 因此,给定一个NxM矩阵和一个大小相等的布尔值,提取布尔值为真且是列中最后一个真值的M个值。例如: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 =
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));