Matlab:两组元素的最佳距离匹配

时间:2011-08-05 11:22:55

标签: matlab variable-assignment

我有两个浮点数向量,它们包含相同的值,直到一个小错误,但不一定以相同的方式排序;例如,A=rand(10);a=eig(A);b=eig(A+1e-10);(请记住eig输出没有指定顺序的特征值。)

我需要找到与相应元素匹配的排列p,即p=mysterious_function(a,b),以使norm(a-b(p))很小。

是否存在以健全和安全的方式执行此操作的现有功能,或者我是否真的需要推出自己的慢速且错误检查错误的实现?

我现在只需要将其用于测试目的,不需要过度优化。请注意,在包含复杂等模数据的向量(例如sort的典型输出)的情况​​下,涉及使用eig()对两个向量进行排序的解决方案都会失败。

2 个答案:

答案 0 :(得分:4)

您似乎想要解决linear assignment problem。我自己没有测试过,但this piece of code应该对你有帮助。

答案 1 :(得分:0)

我相信你丢弃的sort()解决方案可能真的对你有用;根据定义,您定义的标准minimize norm(a-b)是考虑复数的模数(绝对值):norm(a-b) == sqrt(sum(abs(a-b).^2))

如您所知,SORT根据其绝对值对复数进行排序:sort(a)相当于复数输入的sort(abs(a))

%# sort by complex-magnitude
[sort(a) sort(b)]

只要对两者都应用相同的顺序,你也可以尝试按字典排序(按实部排序,如果相等,则按虚部排序):

%# lexicographic sort order
[~,ordA] = sortrows([real(a) imag(a)],[1 2]);
[~,ordB] = sortrows([real(b) imag(b)],[1 2]);
[b(ordB) a(ordA)]

如果您懒得实施Hungarian algorithm建议的@AnthonyLabarre,请选择强制执行:

A = rand(5);
a = eig(A);
b = eig(A+1e-10);

bb = perms(b);                                       %# all permutations of b
nrm = sqrt( sum(abs(bsxfun(@minus, a,bb')).^2) );    %'
[~,idx] = min(nrm);                                  %# argmin norm(a-bb(i,:))
[bb(idx,:)' a]

除了EIG返回的特征值不能保证排序之外,如果你要匹配特征向量,还有另外一个难点:在vk*v的意义上它们不是唯一的一个特征向量,然后k=-1也是一个,尤其是{{1}}。通常你会强制执行一个符号约定:乘以 - / + 1,这样每个向量中的最大元素都有一个正号。