Matlab与Mathematica,特征向量?

时间:2011-04-13 12:12:27

标签: matlab wolfram-mathematica

function H = calcHyperlinkMatrix(M)
    [r c] = size(M);
    H = zeros(r,c);
    for i=1:r,
        for j=1:c,
            if (M(j,i) == 1)
                colsum = sum(M,2);
                H(i,j) = 1 / colsum(j);
            end;
        end;
    end;
    H     


function V = pageRank(M)
    [V D] = eigs(M,1);
    V

function R = google(links)
    R = pageRank(calcHyperlinkMatrix(links));
    R

M=[[0 1 1 0 0 0 0 0];[0 0 0 1 0 0 0 0];[0 1 0 0 1 0 0 0];[0 1 0 0 1 1 0 0];
    [0 0 0 0 0 1 1 1];[0 0 0 0 0 0 0 1];[1 0 0 0 1 0 0 1];[0 0 0 0 0 1 1 0];]
google(M)

ans =

   -0.1400
   -0.1576
   -0.0700
   -0.1576
   -0.2276
   -0.4727
   -0.4201
   -0.6886

数学:

calculateHyperlinkMatrix[linkMatrix_] := {
  {r, c} = Dimensions[linkMatrix];
  H = Table[0, {a, 1, r}, {b, 1, c}];
  For[i = 1, i < r + 1, i++,
   For[j = 1, j < c + 1, j++,
    If[linkMatrix[[j, i]] == 1, H[[i, j]] = 1/Total[linkMatrix[[j]]], 
     0]
    ]
   ];
  H
  }


H = {{0, 0, 0, 0, 0, 0, 1/3, 0}, {1/2, 0, 1/2, 1/3, 0, 0, 0, 0}, {1/2,
     0, 0, 0, 0, 0, 0, 0}, {0, 1, 0, 0, 0, 0, 0, 0}, {0, 0, 1/2, 1/3, 
    0, 0, 1/3, 0}, {0, 0, 0, 1/3, 1/3, 0, 0, 1/2}, {0, 0, 0, 0, 1/3, 
    0, 0, 1/2}, {0, 0, 0, 0, 1/3, 1, 1/3, 0}};
R = Eigensystem[H];
VR = {R[[1, 1]], R[[2, 1]]}
PageRank = VR[[2]]


{1, {12/59, 27/118, 6/59, 27/118, 39/118, 81/118, 36/59, 1}}

Matlab和Mathematica没有给出具有特征值1的相同特征向量。但两者都有效...哪一个是正确的,为什么它们不同?如何使用特征值1来获取所有特征向量?

3 个答案:

答案 0 :(得分:5)

Eigenvector X的定义是满足

的某个向量X

AX = kX

其中A是矩阵,k是常量。从定义可以清楚地看出,cX也是任何c不等于0的特征向量。因此,有一些c常量X_matlab = cX_mathematica

看起来第一个是正常的(欧几里德长度为1,即加上坐标的平方和,然后取平方根,你将得到1),第二个被归一化,使最终坐标为1(找到任何特征向量,然后所有坐标除以最终坐标。)

如果你需要的只是一个特征向量,你可以使用你想要的任何一个。

答案 1 :(得分:3)

这是因为如果向量x是矩阵H的本征向量,则x的任何倍数也是如此。 你引用的矢量作为matlab的答案并没有完全检查:

In[41]:= H.matlab - matlab

Out[41]= {-0.0000333333, 0.0000666667, 0., 0., 0.0000333333, 0., \
-0.0000666667, 0.}

但假设它足够接近,你会看到

In[43]:= {12/59, 27/118, 6/59, 27/118, 39/118, 81/118, 36/59, 
  1}/{-0.1400, -0.1576, -0.0700, -0.1576,
  -0.2276, -0.4727, -0.4201, -0.6886}

Out[43]= {-1.45278, -1.45186, -1.45278, -1.45186, -1.45215, -1.45217, \
-1.45244, -1.45222}

由几乎相同的元素组成。因此,matlab的向量是Mathematica的-1.45倍。

答案 2 :(得分:2)

特征向量不一定是唯一的。所有特征向量都需要

  1. 必须有单位规范
  2. 所有v_m*v_n=0(正交性)的
  3. m ≠ n
  4. 满足Av_m=u_m v_m,其中u_m是对应的特征值
  5. 返回的确切特征向量取决于实现的算法。作为一个简单的例子来证明一个矩阵可以有两组不同的特征向量,考虑一个NxN单位矩阵:

    I=   1     0     0     0
         0     1     0     0
        ...   ...   ...   ...
         0     0     0     1
    

    很明显(并且可以很容易地确认)I的每列都是特征向量,特征值都是1。

    我现在声明以下向量

    v_m=[1,exp(2*pi*1i*m/N),...,exp(2*pi*1i*m*(N-1)/N)]';
    
    m=1,2...,N

    形成具有范数1的正交基组,因此是I的特征向量。这里1i指的是MATLAB表示法中-1的平方根。您可以自己验证:

    N=50;
    v=1/sqrt(N)*cumprod(repmat(exp(-1i*2*pi/N*(0:N-1)),N,1),1);
    imagesc(real(v*v'));
    

    这里我采用了实际部分,因为假想部分由于机器精度影响而非零(10^-16阶),但应该为零(你甚至可以分析地做到这一点,它应该为零) )。 imagesc否则会返回错误。

    因此,总而言之,特征向量不一定是唯一的,并且都传达相同的信息;只是在不同的表现形式。