在 2 个数组之间找到 min/max 相减的组合 matlab

find combination of min/max subtract between 2 arrays matlab

我有两个角度数组: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 人快乐! :)

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

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