2015-08-28 95 views
4

我有兩個數組1x4'x'和'y'。我想要找到哪些'在這兩個數組之間'配對的元素組合'會產生最小的差異(數組元素是角度)。我想找到哪些元素應該配對才能達到最小值。我不關心最低結果本身。我嘗試使用索引,但沒有得到任何地方。具有最小差異的pair數組元素matlab

實施例:

x=[x1 x2 x3 x4], y=[y1 y2 y3 y4]. 
x=[ 295 10 25 18 ], y=[ 200 290 245 326]  

我從這裏得到的x和y 'xyMin' 之間的最小角度差: Calculating absolute differences between two angles

xyMin= [ 95 80 140 52]; 

這是2個陣列的角元件之間的最小差值。但是,我想知道陣列中的哪些元素已經配對以實現這個最小值。所以,我需要得到的東西,如:
[例]

xyArrayElementsThatGiveMinCombination: [x1-y3, x2-y4, x3-y1, x4-y2]. 

編輯:

我要澄清的是,我想找到其中的「X」元素與「Y」的元素配對所以角度之間的差異是最小的。即x [1 2 3 4] -y [1 2 3 4]將給出最小值。如果有多個組合給出相同的最小值,請先選擇。

SORRY I REALIZE IT is confusing! 非常感謝您的幫助!

+0

爲什麼減去?至少請評論我的學習。 – mil

+0

首先爲您的數組x和y實際賦值,以及爲什麼這個組合不是您正在尋找的組合。這看起來像一個精細的代碼行。 – Adriaan

+0

我剛編輯過。謝謝你的輸入 – mil

回答

1

這基本上是RobertSettlers solution,但使用距離度量現在是從討論中,一個簡單的蠻力approac明確:

x=x(:); 
y=y(:); 
Y=perms(y); 
[distance,I]=min(sum(bsxfun(absDiffDeg,x,Y.'),1)); 
best_permuted_y=Y(I,:); 
+1

這正是我所需要的。太簡潔了!謝謝! – mil

1

您可以在這裏使用(如果真的解決您的問題)

[v,i] = min(sum(abs(perms(y)-repmat(x, factorial(4), 1)), 2)) 

然後你得到v的最小值和i特定最小值的索引(第一個)

注意:如果尺寸大於10個條目(對於一個矢量),則排列需要3個演出!

1

這又是一個知道如何解決這個問題。我不確定它是否總能產生正確的結果。它基於一個假設:

最佳解決方案可以創建排序x和y,然後循環移位y。

如果這是真的,這個解決方案是好多了,但我不知道如果這是真的。

x=x(:); 
y=y(:); 
%Sort both vector to reduce the problem to the simplified case 
[sorted_x,index_x]=sort(x); 
[sorted_y,index_y]=sort(y); 
distance=nan(1,numel(x)); 
%circular shift, try all combinations 
for shift=1:numel(x) 
    distance(shift)=sum(absDiffDeg(circshift(sorted_x,shift),sorted_y)); 
end 
%get the best shift 
[minimal_distance,shift]=min(distance); 
%Now a solution is fond permuting both x and y, the permutations for x and y are: 
%circshift(index_x,shift) and index_y 
%but permuting x is unnessecary. Undo the permutation of x and keep the paris between x and y 
[~,reverse_x]=sort(circshift(index_x,shift)); 
%Best permutation for y 
y_permutation=index_y(reverse_x); 
%permute y 
y_permuted=y(y_permutation); 
相關問題