我有两个不同大小的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
答案 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循环构建Bmin
和Bmax
,它可能会更快,但是while循环更有趣。)
现在很简单。要查找大于任何给定值的B
的第一个元素,请在histc
上使用Bmax
。由于histc
是矢量化的,因此操作很快。为此,请查看histc
的第二个返回参数。或者,您可以编写矢量化二进制搜索方案。 histc
也会通过翻转Bmin
中元素的顺序来解决最小元素问题。
如果你的目标是找到元素的INDEX,那么在构建Bmin
和Bmax
时保留这些信息也很简单。