Matlab中将数组元素配对以获得最小差异

3
我有两个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] 将给出最小值。如果有多种组合给出相同的最小值,请选择第一个。

对不起,我意识到这很令人困惑!非常感谢您的帮助!


为什么要减去?至少请给我留下评论,以便我学习。 - mil
首先,实际为数组x和y分配值,并且确定这种组合不是您要寻找的组合。这看起来像一行很好的代码。 - Adriaan
我刚刚编辑完了。谢谢你的反馈。 - mil
@RobertStettler 请查看修改后的问题。我想找出应该与 y 的哪些元素配对以获得最佳最小值的 X 元素。我不关心最小差异本身。 - mil
1
@mil:这有点太长放在评论中了。计算角度差的代码可以在这里找到。我想这就是你想要最小化的东西。 - Daniel
显示剩余10条评论
3个回答

1
你可以在这里使用它(如果它确实解决了你的问题)
[v,i] = min(sum(abs(perms(y)-repmat(x, factorial(4), 1)), 2))

然后你会得到v的最小值和i这个特定最小值的索引(第一个)

注意:如果大小超过10个条目(对于一个向量),则排列需要超过3 GB!


1
这基本上是RobertSettlers solution,但使用了距离度量,这在讨论中现在已经很清楚了,是一种简单的蛮力方法:
x=x(:);
y=y(:);
Y=perms(y);
[distance,I]=min(sum(bsxfun(absDiffDeg,x,Y.'),1));
best_permuted_y=Y(I,:);

1
这正好符合我的需求。而且如此整洁简明!谢谢你! - mil

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接