我的目的是找到矩阵的特征向量。在Matlab中,有一个[V,D] = eig(M)
来获取矩阵的特征向量:[V,D] = eig(M)
。或者,我使用网站 WolframAlpha 来仔细检查我的结果。
我们有一个名为10X10
的{{1}}矩阵:
M
0.736538062307847 -0.638137874226607 -0.409041107160722 -0.221115060391256 -0.947102932298308 0.0307937582853794 1.23891356582639 1.23213871779652 0.763885436104244 -0.805948245321096
-1.00495215920171 -0.563583317483057 -0.250162608745252 0.0837145788064272 -0.201241986127792 -0.0351472158148094 -1.36303599752928 0.00983020375259212 -0.627205458137858 0.415060573134481
0.372470672825535 -0.356014310976260 -0.331871925811400 0.151334279460039 0.0983275066581362 -0.0189726910991071 0.0261595600177302 -0.752014960080128 -0.00643718050231003 0.802097123260581
1.26898635468390 -0.444779390923673 0.524988731629985 0.908008064819586 -1.66569084499144 -0.197045800083481 1.04250295411159 -0.826891197039745 2.22636770820512 0.226979917020922
-0.307384714237346 0.00930402052877782 0.213893752473805 -1.05326116146192 -0.487883985126739 0.0237598951768898 -0.224080566774865 0.153775526014521 -1.93899137944122 -0.300158630162419
7.04441299430365 -1.34338456640793 -0.461083493351887 5.30708311554706 -3.82919170270243 -2.18976040860706 6.38272280044908 2.33331906669527 9.21369926457948 -2.11599193328696
1 0 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
:
D
2.84950796497613 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 1.08333535157800 + 0.971374792725758i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 1.08333535157800 - 0.971374792725758i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -2.05253164206377 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -0.931513274011512 + 0.883950434279189i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -0.931513274011512 - 0.883950434279189i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -1.41036956613286 + 0.354930202789307i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -1.41036956613286 - 0.354930202789307i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i -0.374014257422547 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i
0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.00000000000000 + 0.00000000000000i 0.165579401742139 + 0.00000000000000i
:
V
我得到了以下结果:
D(特征值)
V(特征向量)
是否有可能为eigenVectors获得不同的解决方案,或者它应该是一个独特的答案。我有兴趣澄清这个概念。
答案 0 :(得分:11)
由于各种原因,特征向量不是唯一的。改变符号,并且特征向量仍然是相同特征值的特征向量。实际上,乘以任何常数,特征向量仍然存在。不同的工具有时可以选择不同的规范化。
如果特征值的多重性大于1,那么只要它们跨越相同的子空间,特征向量就不再是唯一的。
答案 1 :(得分:10)
正如木片指出(+1),特征向量仅在线性变换时才是唯一的。从定义中可以明显看出这一事实,即特征向量/特征值对解决了特征函数A * v = k * v,其中A是矩阵,v是特征向量,k是特征值。
让我们考虑一个比你(可怕的)问题更简单的例子:
M = [1, 2, 3; 4, 5, 6; 7, 8, 9];
[EigVec, EigVal] = eig(M);
Matlab产量:
EigVec =
-0.2320 -0.7858 0.4082
-0.5253 -0.0868 -0.8165
-0.8187 0.6123 0.4082
而Mathematica收益:
EigVec =
0.2833 -1.2833 1
0.6417 -0.1417 -2
1 1 1
来自Matlab文档:
“对于eig(A),特征向量被缩放,使得每个的范数为1.0。”。
另一方面,Mathematica显然是缩放特征向量,因此最终元素是统一的。即使只是看到我给出的输出,你也可以开始看到关系出现(特别是比较两个输出的第三个特征向量)。
顺便说一下,我建议你编辑你的问题,以便有一个更简单的输入矩阵M
,比如我在这里使用的那个。这将使将来访问此页面的任何人都更具可读性。它实际上并不是一个糟糕的问题,但它目前的格式化方式可能会导致它被低估。
答案 2 :(得分:3)
我完全同意 Mr.Colin T Bowers ,即MATHEMATICA进行规范化,以便EigenVectors的最后一个值变为一。使用MATLAB,如果有人想要生成像MATHEMATICA这样的EigenVectors结果,那么我们可以使用以下标准化步骤告诉MATLAB将 EigenVectors 的最后一个值归结为 1 。
M = [1, 2, 3; 4, 5, 6; 7, 8, 9];
[EigVec, EigVal] = eig(M);
sf=1./EigVec(end,:); %get the last value of each eigen vector and inverse for scale factor
sf=repmat(sf,size(EigVec,1),1); % Repeat Scale value of each element in the vector
Normalize_EigVec=EigVec.*sf;
Normalize_EigVec =
0.2833 -1.2833 1.0000
0.6417 -0.1417 -2.0000
1.0000 1.0000 1.0000
答案 3 :(得分:0)
正如Rody所指出的,Mathematica使用的规范化是使最后一个元素统一。其他的eig函数就像QZ算法(例如你必须在Matlab编码器中使用,因为Cholesky不被支持),不要像Matlab那样对[V,lam] = eig(C)进行正常化。 。 EX:[V,lam] = eig(C,眼睛(尺寸(C)),' qz');
来自文档http://www.mathworks.com/help/techdoc/ref/eig.html
注意:对于eig(A),缩放特征向量,使每个向量的范数为1.0。对于eig(A,B),eig(A,' nobalance')和eig(A,B,flag),特征向量未被标准化。另请注意,如果A是对称的,则eig(A,' nobalance')会忽略不平衡选项,因为A已经平衡。
对于[V,lam] = eig(C);特征向量被缩放,因此每个的标准都是1.0。这就是我们在这里所需要的。 Matlab为Cholesky公式做了这个,那么,如何重新规范QZ生成的特征向量,使它们具有相同的比例?像这样:
W = V;
for i = 1:size(V,2) % for each column
V(:,i) = V(:,i) / norm(V(:,i), 2); % Normalize column i
end
这将找到每个向量的长度,并将元素除以该长度以缩放向量。 Mathamatica基本上做同样的事情,使最后一个元素1而不是规范化向量。 http://www.fundza.com/vectors/normalize/
请注意,向量和值的顺序不一样,因此您可能仍需要对它们进行排序。 Matlab的Cholesky算法按照如下排序顺序生成项目:
lam=diag(lam);
[sorted_lam,index]=sort(lam);
for cont=1:length(sorted_lam)
sorted_V(:,cont)=V(:,index(cont));
end
W=sorted_W;
lam = diag(sorted_lam);
即使在这样做之后,符号可能也不会指向相同的方向(如果它们乘以-1,则特征向量仍然是特征向量)。请注意,相同的排序必须应用于lambda(特征值)或那些将不按顺序排序。
典型的惯例是,如果列中的第一个元素为负,则填充列的符号。
如果超过2个是否定的话,你可以做的就是翻转标志:
%FLIP SIGNS IF MORE THAN 2 ARE NEGATIVE
W=sorted_W;
for i = 1:size(W,2) % for each column in V
A = W(:,i);
s=sign(A);
inegatif=sum(s(:)==-1);
if(inegatif>1)
W(:,i) = -W(:,i);
end
end
但这只有在元素不接近0时才有用,因为如果它们接近0,则不同的算法可能会在0的另一侧找到该值,但它比什么都没有。
最后一件事,对于' B'值(广义特征值问题输入矩阵),我正在使用' eye(size(C))'。 是否有最佳方式来选择' B'改进这个算法并使它给出更接近Cholesky的答案或更准确?你可以使用任何(相同大小的实际矩阵)值,如B再次包括A或A' (A是输入矩阵),但什么是一个好的选择?' 可能 A' ,我注意到某些输入为3x3 -1似乎给出了与' chol'
相同的答案