Matlab:在数组中找到第一个更小或更大的元素

时间:2012-05-11 14:56:44

标签: matlab

我有两个不同大小的A和B的数组。我正在比较A和B,并希望为A中的每个元素找到B中第一个较小/较大的元素。

我想使用像成员(A,B)这样的东西,除了我不是在寻找相同的元素。问题是'find'不起作用,因为A和B的大小不同。

我现在使用循环,但我正在寻找一种更优雅的方式来编程。这是循环:

        for zz=1:length(A)
            tmpmax(zz) = find(B>=A(zz),1);
            tmpmin(zz) = find(B<=A(zz),1,'last');                
        end

感谢您的建议!

IMMO

2 个答案:

答案 0 :(得分:1)

你可以用以下方法摆脱循环:

tmpmin = arrayfun(@(x) find(B>=x,1), A);
tmpmax = arrayfun(@(x) find(B<=x,1,'last'), A );

答案 1 :(得分:1)

这取决于你做这个的频率,以及你的向量有多大。但我建议预处理数组B。例如,考虑测试用例:

B = rand(1,10)
B =
  0.82346 0.69483 0.3171 0.95022 0.034446 0.43874 0.38156 0.76552 0.7952 0.18687

我们需要构建累积的最小和最大矢量。如果B相当长,可以通过以下几种方式完成。

Bmin = B;
N = inf;
while numel(Bmin) < N
  N = numel(Bmin);
  k = find(diff(Bmin) >= 0);
  Bmin(k+1) = [];
end
Bmax = B;
N = inf;
while numel(Bmax) < N
  N = numel(Bmax);
  k = find(diff(Bmax) <= 0);
  Bmax(k+1) = [];
end

然后

Bmin
Bmin =
   0.82346      0.69483       0.3171     0.034446

Bmax
Bmax =
   0.82346      0.95022

(我本可以使用简单的for循环构建BminBmax,它可能会更快,但是while循环更有趣。)

现在很简单。要查找大于任何给定值的B的第一个元素,请在histc上使用Bmax。由于histc是矢量化的,因此操作很快。为此,请查看histc的第二个返回参数。或者,您可以编写矢量化二进制搜索方案。 histc也会通过翻转Bmin中元素的顺序来解决最小元素问题。

如果你的目标是找到元素的INDEX,那么在构建BminBmax时保留这些信息也很简单。