首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用最小差matlab实现对阵元

用最小差matlab实现对阵元
EN

Stack Overflow用户
提问于 2015-08-28 10:05:07
回答 3查看 480关注 0票数 3

我有两个数组1x4 'x‘和'y’。我想找出这两个数组之间的元素组合‘配对’会给出最小的差异(数组的元素是角度)。我想找出哪些元素应该配对才能得到最小值。我不关心结果最小本身。我试过用索引,但什么也没得到。

示例:

代码语言:javascript
复制
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

代码语言:javascript
复制
xyMin=  [ 95    80   140    52];

这是两个数组的角度元素之间的最小差异。但是,我想知道数组中的哪些元素被配对以得到这个最小值。所以我需要得到这样的东西:

代码语言:javascript
复制
 [Example]
代码语言:javascript
复制
xyArrayElementsThatGiveMinCombination:  [x1-y3, x2-y4, x3-y1, x4-y2]. 

编辑:

我想澄清一下,我想找出'x‘的哪个元素与'y’的哪个元素配对,这样角度之间的差异就最小了。也就是说,x1 2 3 4-y1 2 3 4将给出最小值。如果有多个组合给予相同的最小选择优先。

对不起,我意识到这很混乱!非常感谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-29 11:36:19

这基本上是RobertSettlers solution,但是使用现在已经从讨论中清楚的距离度量,一个简单的蛮力逼近:

代码语言:javascript
复制
x=x(:);
y=y(:);
Y=perms(y);
[distance,I]=min(sum(bsxfun(absDiffDeg,x,Y.'),1));
best_permuted_y=Y(I,:);
票数 1
EN

Stack Overflow用户

发布于 2015-08-28 12:29:13

您可以在这里使用这个(如果它确实解决了您的问题)

代码语言:javascript
复制
[v,i] = min(sum(abs(perms(y)-repmat(x, factorial(4), 1)), 2))

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

注意:如果大小大于10个条目(对于一个向量),那么置换需要超过3 if!

票数 1
EN

Stack Overflow用户

发布于 2015-08-29 11:42:58

这是另一个解决问题的办法。我不完全确定它是否总是产生正确的结果。其依据是一种假设:

一个最优解可以同时产生x和y的排序,然后是圆形移位y。

如果这是真的,这个解决方案要好得多,但我不确定这是否属实。

代码语言:javascript
复制
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);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32268425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档