R 和 MATLAB 返回不同的特征向量
R and MATLAB returning different eigenvectors
我遗漏了一些明显的东西,但这里是:
在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
代码以获得所需的数据符号?
编辑:我继续深入研究代码,看看这两个 "negative one" 值是否在下一组方程中抵消了,但还没有看到。
大部分重要信息都在 Andras Deak 的评论中。总结一下:正如我们都(应该)知道的那样,特征值和特征向量仅在乘法常数范围内是唯一的。虽然在这种特殊情况下 R
和 MATLAB
碰巧以不同的符号结束,但特征向量上的所有后续矩阵运算将产生相同的结果(同样,在符号或常数值范围内)。
在我的特殊情况下,最终结果基本上是:一个答案是 a*x -b =0
,另一个是 -a*x + b = 0
。
我遗漏了一些明显的东西,但这里是:
在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
代码以获得所需的数据符号?
编辑:我继续深入研究代码,看看这两个 "negative one" 值是否在下一组方程中抵消了,但还没有看到。
大部分重要信息都在 Andras Deak 的评论中。总结一下:正如我们都(应该)知道的那样,特征值和特征向量仅在乘法常数范围内是唯一的。虽然在这种特殊情况下 R
和 MATLAB
碰巧以不同的符号结束,但特征向量上的所有后续矩阵运算将产生相同的结果(同样,在符号或常数值范围内)。
在我的特殊情况下,最终结果基本上是:一个答案是 a*x -b =0
,另一个是 -a*x + b = 0
。