在一次向量中找到多个最接近的值而不“过去”(Matlab)

时间:2013-08-01 00:23:56

标签: matlab

假设我有以下2个向量:

a = [1 3 5 7 8 9 10 15 16];
b = [2 4 14];

是否有一个我可以使用的函数,以便对于b中的每个元素,我可以在a中找到与该元素最接近的值的索引,而不会“超过”值I'我在寻找?预期的输出是:

[1 2 7]

我找到了以前的答案,解决了找到最接近的值,但没有超出所搜索的值的最接近的值。

1 个答案:

答案 0 :(得分:3)

编辑:现在有一个单行:

[~,index] = max(repmat(a,numel(b),1) + 0./bsxfun(@le,a,b'), [], 2)
'#% The 0./(0 or 1) creates a NaN mask where the condition
#% isn't met, leaving only the desired values in the matrix     
#% max ignores NaNs, conveniently                  

这不是内置函数,但非常简单(link on ideone):

a = [1 3 5 7 8 9 10 15 16];
b = [2 4 14];

c = bsxfun(@minus,b',a) #%' transpose b

c(c<0)=nan; #% discard the values in a greater than b
[~,ci] = min(c,[],2) #% min ignores nan
d = a(ci) #% if you want the actual values of a

输出:

c =

    1   -1   -3   -5   -6   -7   -8  -13  -14
    3    1   -1   -3   -4   -5   -6  -11  -12
   13   11    9    7    6    5    4   -1   -2

ci =

   1
   2
   7

d =

    1    3   10