【问题标题】:Matlab: optimal-distance matching of the elements of two setsMatlab:两组元素的最佳距离匹配
【发布时间】:2011-08-05 11:22:54
【问题描述】:

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

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

是否有一个现有的函数可以以理智和安全的方式执行此操作,还是我真的需要推出自己的缓慢且错误检查不佳的实现?

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

【问题讨论】:

    标签: matlab variable-assignment


    【解决方案1】:

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

    【讨论】:

    • 看到了,谢谢(我想创建标签“分配问题”,但我没有足够的声誉)。我现在正在使用类似的代码,但我仍然必须编写一些容易出错的样板包装器。我希望能找到一些预先罐装的东西;在我看来,这似乎是一个很常见的问题。
    【解决方案2】:

    我相信您丢弃的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)]
    

    如果你懒得实现@AnthonyLabarre 建议的Hungarian algorithm,那就去暴力破解吧:

    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 返回的特征值是经过排序的这一事实之外,如果还要匹配特征向量,您还必须处理另一个困难:如果v 是特征向量,它们就不是唯一的, 那么k*v 也是一个,尤其是k=-1。通常你会强制执行一个符号约定,例如:乘以 -/+1,以便每个向量中的最大元素具有正号。

    【讨论】:

    • 如果特征值被精确计算,基于排序的解决方案将起作用。如果真正的特征值是 1i、1 和 -1,并且a 包含[0.99;-1.01;1i]b 包含[1.01;-0.99;1i],那么所有基于排序的解决方案都必然会失败。事实上,我猜想所有在ab 上单独工作以得出一个共同顺序的解决方案都注定会失败。
    • @FedericoPoloni: 很好的反例(虽然字典顺序适用)...我想解决分配问题是要走的路:)
    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多