2012-11-05 12 views
7

Mam dwa wektory w MATLAB, A i B. B zawiera niektóre indeksy (od 1 do końca). Mam losowy indeks, R (w zakresie wektora wskaźników). Chcę napisać funkcję (lub oświadczenie), aby wybrać [Z], gdzie Z jest najbardziej najbliższy numer (tj index) do R, które nie są ujęte w B.Jak znaleźć najbliższy indeks do określonego indeksu w Matlab

Przykład:

A = [2 3 6 1 9 7 4 5 8] 
B = [3 4 5 6 7 8] 
R = 5 

Funkcja musi zwrócić 3, ponieważ najbardziej najbliższy indeks wynosi 2, ponieważ 5-2 < 9-5 i 2 nie ma w B, więc A [2] = 3;

Dzięki

Odpowiedz

0

Należy pamiętać, że funkcje setdiff i setxor sortują wynik.

tmpSet = R - setdiff(1:numel(A),B); 
[~,z] = min(abs(tmpSet)); 
z = tmpSet(z); 
Result = A(R-z); 

Ten sam przykład w pytaniu:

A = [2 3 6 1 9 7 4 5 8] 
B = [3 4 5 6 7 8] 
R = 5 

tmpSet = 5 - {1 2 9} = {4 3 -4} 
z = 2 
z = 3 
Result = A(5-3) = A(2) = 3 

Dziękuję za swoimi pomysłami.

6

Poprawa odpowiedź Jakuba, oto poprawne rozwiązanie:

[result, z] = min(abs(R - setxor(B, 1:numel(A)))) 

A w twoim przypadku, że daje z = 2 i result = A(2) = 3.

+1

Dziękuję za pomoc. Myślę, że lepiej jest użyć settdiff zamiast setxor. Zmieniłem twój kod w następujący sposób. Proszę dać mi znać swoją opinię. – remo

+0

Używam MATLAB 2012. Jak podano w dokumentacji Setxor, setxor (A, B) = A-B union B-A (różnica symetryczna). Jednak w naszym przypadku myślę, że nie powoduje żadnej różnicy, ponieważ B zawiera liczby w zakresie. – remo

2

Jeśli dobrze rozumiem, możesz najpierw zrobić wykluczenie, aby znaleźć indeksy nie w B, tj. excl = A(setxor(B,1:length(A))). Wtedy łatwo jest uzyskać taką minę, jak excl(min(abs(R-excl))).

+0

'setxor' jest zdecydowanie właściwym kierunkiem, ale wynik jest błędny. 'excl' powinien zawierać indeksy' A', a nie jego wartości. –

Powiązane problemy