Matlab:查找数组中第一个较小或较大的元素

Matlab:查找数组中第一个较小或较大的元素,matlab,Matlab,我有两个大小不同的数组A和B。我正在比较A和B,并希望为A中的每个元素找到B中较小/较大的第一个元素 我想使用类似ismember(A,B)的东西,只是我不寻找相同的元素。问题是“查找”不起作用,因为A和B的大小不同 我现在使用了一个循环,但我正在寻找一种更优雅的方式来编程。以下是循环: for zz=1:length(A) tmpmax(zz) = find(B>=A(zz),1); tmpmin(zz) = find(B&

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

我想使用类似ismember(A,B)的东西,只是我不寻找相同的元素。问题是“查找”不起作用,因为A和B的大小不同

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

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

tmpmin(zz)=find(B您可以通过以下方法摆脱循环:

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

TMPMAX = ArayFun(@(x)查找(b<P>),这取决于您多久会这样做,以及您的向量有多大。但是我建议预处理数组<代码> 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
(我也可以使用一个简单的for循环来构建
Bmin
Bmax
,它可能会更快,但while循环编写起来更有趣。)

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


如果您的目标是找到元素的索引,这也很简单,在构建
Bmin
Bmax
时保留这些信息,即使它们大小相同,find仍然是不合适的。
Bmin
Bmin =
   0.82346      0.69483       0.3171     0.034446

Bmax
Bmax =
   0.82346      0.95022