2013-08-01 2 views
2

Допустим, у меня есть следующие 2 векторов:найти несколько ближайших значений в векторе сразу без «перехода» (Matlab)

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

Есть ли функция, которую я могу использовать так, что для каждого элемента b, я могу найти индекс ближайшего значения этому элементу в a без «перехода» значения, которое я ищу? Ожидаемый результат будет:

[1 2 7] 

Я нашел предыдущие ответы, которые касаются нахождения наиболее близкого значения, но не самое близкое значения без превышения значения разыскиваются.

ответ

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 
Смежные вопросы