我有两个角度阵列: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! :)
答案 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,:);