Я полагаю, что решение 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 предложил, перейдите к грубому принуждению:
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, чтобы у самого большого элемента в каждом векторе был положительный знак.