2012-11-05 39 views
7

Tôi có hai vectơ trong MATLAB, A và B. B chứa một số chỉ mục (1 đến cuối). Tôi có một chỉ số ngẫu nhiên, R (trong phạm vi của các chỉ số vector). Tôi muốn viết một hàm (hoặc báo cáo) để lựa chọn A [z], nơi z là số gần nhất (tức là index) cho R mà không được bao gồm trong B.Cách tìm chỉ mục gần nhất với chỉ mục được chỉ định trong Matlab

Ví dụ:

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

Hàm phải trả về 3, vì chỉ số gần nhất là 2, bởi vì 5-2 < 9-5 và 2 không nằm trong B, do đó A [2] = 3;

Cảm ơn

Trả lời

0

Xin lưu ý rằng các hàm setdiff và setxor sắp xếp kết quả.

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

ví dụ tương tự trong câu hỏi:

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 

Cảm ơn bạn đã ý tưởng của bạn.

6

Cải thiện câu trả lời của Jacob, đây là giải pháp đúng:

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

Và trong trường hợp của bạn mà mang lại z = 2result = A(2) = 3.

+1

Cảm ơn sự giúp đỡ của bạn. Tôi nghĩ tốt hơn là nên sử dụng settdiff thay vì setxor. Tôi đã thay đổi mã của bạn sau đây. Hay cho tôi biêt y kiên của bạn. – remo

+0

Tôi đang sử dụng MATLAB 2012. Như đã nêu trong tài liệu setxor, setxor (A, B) = A-B union B-A (sự khác biệt đối xứng). Tuy nhiên, trong trường hợp của chúng tôi, tôi nghĩ rằng nó không tạo ra bất kỳ sự khác biệt nào, bởi vì B chứa các số trong phạm vi. – remo

2

nếu tôi hiểu chính xác, trước tiên bạn có thể loại trừ, để tìm các chỉ mục không có trong B, tức là excl = A(setxor(B,1:length(A))). Sau đó, nó rất dễ dàng để có được min như thế này excl(min(abs(R-excl))).

+0

'setxor' chắc chắn là đúng hướng, nhưng kết quả là sai. 'excl' được cho là chứa các chỉ số của' A', không phải giá trị của nó. –

Các vấn đề liên quan