我有两个数组1x4 'x'和'y'。我想找出这两个数组之间"配对"的元素组合将给出最小的差异(数组的元素是角度)。我想找出哪些元素应该配对才能得到最小值。我不关心最小值本身。我尝试使用索引,但没有得到任何地方。
的例子:
x=[x1 x2 x3 x4], y=[y1 y2 y3 y4].
x=[ 295 10 25 18 ], y=[ 200 290 245 326]
我从这里得到x和y 'xyMin'之间的最小角度差:计算两个角度的绝对差
xyMin= [ 95 80 140 52];
这是两个数组的角度元素之间的最小差值。但是,我想知道数组中的哪些元素是配对的,从而得到这个最小值。所以我需要得到这样的东西:
(例子)
xyArrayElementsThatGiveMinCombination: [x1-y3, x2-y4, x3-y1, x4-y2].
编辑:
我想澄清一下,我想找到x的哪个元素与y的哪个元素配对,以便角度之间的差异最小。即x[1 2 3 4]-y[1 2 3 4]给出最小值。如果有一个以上的组合给出相同的最小选择优先。
对不起,我知道这是令人困惑的!非常感谢你的帮助!这基本上是RobertSettlers的解决方案,但使用距离度量(现在从讨论中可以清楚地看到),一个简单的蛮力方法:
x=x(:);
y=y(:);
Y=perms(y);
[distance,I]=min(sum(bsxfun(absDiffDeg,x,Y.'),1));
best_permuted_y=Y(I,:);
你可以在这里使用这个(如果它真的解决了你的问题)
[v,i] = min(sum(abs(perms(y)-repmat(x, factorial(4), 1)), 2))
然后你得到v
为最小值i
为特定最小值(第一个)的索引
注意:如果大小大于10个条目(对于一个向量),那么排列需要超过3gigs !
这是解决这个问题的另一个想法。我不能绝对肯定它是否总是产生正确的结果。它基于一个假设:
一个最优解可以创建对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);