2015-12-26 4 views
3

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

+9

Вы уверены, что ваши применяемые впоследствии алгоритмы зависят от знака? Собственные векторы не определены до скалярной константы: если 'v' является собственным вектором с собственным значением lambda, то так же' c * v', с тем же собственным значением. Коды на основе собственных значений возвращают нормированные (длина-1) собственные векторы, которые все еще дают вам свободу знаков. Оба '[0 1 0]' и '[0 -1 0]' равноправные ответы на ваш вопрос. Вам нужно дополнительное правило для указания того, какой собственный вектор вам нужен из 2 (что не является тривиальным, если декартовы единичные векторы не являются собственными векторами, т. Е. Если матрица не диагональна). –

+1

@AndrasDeak Я знаю эту часть, но если вы заглянете в ссылочный код, вы увидите, что алгоритм добавляет, вычитает и умножает каждый элемент матрицы собственного вектора множеством способов. Это означает, что знак возврата MATLAB зависит от знаков собственных векторов. Выбор собственного значения производится путем выбора одного с минимальным корнем последующих уравнений в функции 'parabolafit_directM'. Это действительно странно. –

+0

Я просто говорю, что ни один алгоритм не должен зависеть от этих признаков. Что делать, если ваши собственные векторы указывают повсюду? Например, в 5d-пространстве? Если это определенно проблема 3d, тогда могут быть некоторые дополнительные ограничения ... но, как я вижу, удобство двух наборов собственных векторов одинаково (оба являются левыми). Я говорю, что если ваш результат на самом деле отличается (а не эквивалентно другим), тогда может быть ошибка где-то (в портировании или в оригинале). Учитывая, что '%?' - комментарий, присутствующий в цитированных кодах, вполне возможно. –

ответ

1

Большая часть важной информации находится в комментариях Andras Deak. Подводя итог: как мы все (должны) знать, собственные значения и собственные векторы являются единственными с точностью до мультипликативной константы. В то время как в этом конкретном случае R и MATLAB оказались в конечном итоге с разными знаками, все последующие операции матрицы по собственным векторам дадут тот же результат (опять же, с точностью до знака или постоянного значения).

В моем конкретном случае окончательный результат был по существу: один ответ был a*x -b =0, а другой был -a*x + b = 0.

Смежные вопросы