2012-11-05 115 views
7

我在MATLAB,A和B中有兩個向量.B包含一些索引(從1到結束)。我有一個隨機索引,R(在向量索引的範圍內)。我想要寫的函數(或聲明),以選擇A [Z],其中,z是不包括在B.如何在Matlab中查找指定索引的最近索引

實施例中最最近的數目(即,索引),以R:

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

函數必須返回3,因爲最靠近的索引是2,因爲5-2 < 9-5和2不在B中,所以A [2] = 3;

感謝

回答

0

請注意,setdiff和setxor函數對結果進行排序。

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

同樣的例子中的問題:

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 

感謝您的想法。

6

提高雅各布的答案,這裏是正確的解決方案:

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

而在你的情況下產生z = 2result = A(2) = 3

+1

謝謝你的幫助。我認爲最好使用settdiff而不是setxor。我在下面更改了你的代碼。請讓我知道你的意見。 – remo

+0

我正在使用MATLAB 2012.如setxor文檔中所述,setxor(A,B)= A-B union B-A(對稱差異)。然而,在我們的案例中,我認爲它不會產生任何區別,因爲B包含範圍內的數字。 – remo

2

如果我理解正確,可以先排除,找到不在B中的索引,即excl = A(setxor(B,1:length(A)))。然後很容易得到像這樣的分鐘excl(min(abs(R-excl)))

+0

'setxor'絕對是正確的方向,但結果是錯誤的。 'excl'應該包含'A'的索引,而不是其值。 –