找到2个数组之间的最小/最大减法组合matlab

时间:2015-08-21 13:59:42

标签: arrays matlab min angle subtraction

我有两个角度阵列:a = [140 360 170 3]; b = [12 270 0 21];我需要找到在减去(/添加)数组元素时最小化的组合。我现在正在这样做:

c = [ones(1,4)*a(1)-b; ones(1,4)*a(2)-b; ones(1,4)*a(3)-b; ones(1,4)*a(4)-b];

cc= abs(c);

[minNumk, minIndkl] = min(cc(:));
[rowk, colk] = ind2sub(size(cc), minIndkl);
cc(rowk,:)=[];
cc(:,colk)=[];

 [min2k,minInd2k]=min(cc(:));
 [row2k, col2k] = ind2sub(size(cc), minInd2k);
 cc(row2k,:)=[];
 cc(:,col2k)=[];

 [min3k,minInd3k]=min(cc(:));
 [row3k, col3k] = ind2sub(size(cc), minInd3k);
 cc(row3k,:)=[];
 cc(:,col3k)=[];
 min4k= cc;
total=minNumk+min2k+min3k+min4k

问题。有没有办法以更简洁的方式做到这一点?另外我想在这里需要使用mod(,360)吗?

编辑:如果使用(减去)元素,则不能再使用它。 (因此,整个行和列都将被删除。)

提前致谢!!!

非常感谢任何建议! 快乐10 000 000! :)

1 个答案:

答案 0 :(得分:5)

如果我理解正确,你想尝试其中一个向量的所有排列最小化(在所有排列中)( (向量条目)绝对值的向量之间的差异:

result_total = min(sum(abs(bsxfun(@minus, a, perms(b))), 2));

获得最小化绝对差异总和的单一差异:

d = bsxfun(@minus, a, perms(b));
[result_total, ind] = min(sum(abs(d), 2));
result_indiv = d(ind,:);

如果您想将差异视为0-360,请使用mod(然后您不需要abs):

d = mod(bsxfun(@minus, a, perms(b)),360);
[result_total, ind] = min(sum(d, 2));
result_indiv = d(ind,:);