я что-то очевидное отсутствует, но здесь идет:R и MATLAB возвращаются различные собственные векторы
В R
,
dput(M)
structure(c(-2.77555756156289e-16, 9.63770703841896e-16, 0, 9.63770703841896e-16,
10.6543192562307, 4.11228781751498e-14, 0, 4.11228781751498e-14,
275.591724761168), .Dim = c(3L, 3L), .Dimnames = list(c("", "",
""), c("", "", "")))
#thus M is
-2.775558e-16 9.637707e-16 0.000000e+00
9.637707e-16 1.065432e+01 4.112288e-14
0.000000e+00 4.112288e-14 2.755917e+02
eig(M)
$values
[1] 2.755917e+02 1.065432e+01 -2.775558e-16
$vectors
[,1] [,2] [,3]
[1,] 5.428099e-34 9.045822e-17 1
[2,] 1.552173e-16 1.000000e+00 0
[3,] 1.000000e+00 0.000000e+00 0
Но в MATLAB
[vv,ee] = eig(M)
% hand-copied so ignore the precision)
vv =
1.0 -0. -0.
0 0 -1
0 -1 0
ee =
%diagonals only
0.0 275.59 10.6543
собственные значения совпадают с где abs(vv) == 1
, но я не понимаю, почему некоторые собственные векторы являются отрицательными в MATLAB, но не в R. Это имеет большое значение, поскольку я пытаюсь передать this MATLAB package (в частности, parabolafit_direct.m
и `parabolafit_directm.m '), и последующие алгоритмы чувствительны к знаку значений. Я проверил, и пакет MATLAB создает правильный установленный выход (параболическая кривая к набору данных), в то время как мой R-порт не из-за этих различий знака.
Итак, почему разница, и что я могу сделать, чтобы изменить код R
, чтобы получить нужные признаки данных?
EDIT: Я продолжаю копаться в коде, чтобы увидеть, будут ли эти два отрицательных значения отменены в следующей системе уравнений, но пока этого не видели.
Вы уверены, что ваши применяемые впоследствии алгоритмы зависят от знака? Собственные векторы не определены до скалярной константы: если 'v' является собственным вектором с собственным значением lambda, то так же' c * v', с тем же собственным значением. Коды на основе собственных значений возвращают нормированные (длина-1) собственные векторы, которые все еще дают вам свободу знаков. Оба '[0 1 0]' и '[0 -1 0]' равноправные ответы на ваш вопрос. Вам нужно дополнительное правило для указания того, какой собственный вектор вам нужен из 2 (что не является тривиальным, если декартовы единичные векторы не являются собственными векторами, т. Е. Если матрица не диагональна). –
@AndrasDeak Я знаю эту часть, но если вы заглянете в ссылочный код, вы увидите, что алгоритм добавляет, вычитает и умножает каждый элемент матрицы собственного вектора множеством способов. Это означает, что знак возврата MATLAB зависит от знаков собственных векторов. Выбор собственного значения производится путем выбора одного с минимальным корнем последующих уравнений в функции 'parabolafit_directM'. Это действительно странно. –
Я просто говорю, что ни один алгоритм не должен зависеть от этих признаков. Что делать, если ваши собственные векторы указывают повсюду? Например, в 5d-пространстве? Если это определенно проблема 3d, тогда могут быть некоторые дополнительные ограничения ... но, как я вижу, удобство двух наборов собственных векторов одинаково (оба являются левыми). Я говорю, что если ваш результат на самом деле отличается (а не эквивалентно другим), тогда может быть ошибка где-то (в портировании или в оригинале). Учитывая, что '%?' - комментарий, присутствующий в цитированных кодах, вполне возможно. –