在 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,:);
我有两个角度数组: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,:);