0

我有两个不同大小的数组 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

感谢您的建议!

伊莫

4

2 回答 2

1

您可以通过以下方式摆脱循环:

tmpmin = arrayfun(@(x) find(B>=x,1), A);
tmpmax = arrayfun(@(x) find(B<=x,1,'last'), A );
于 2012-05-11T15:13:06.130 回答
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

(我也可以构建BminBmax使用一个简单的 for 循环,它可能会更快,但 while 循环写起来更有趣。)

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

如果您的目标是找到元素的 INDEX,这也很简单,只需在构建BminBmax.

于 2012-05-11T16:00:45.910 回答