【问题标题】:Matlab vs Mathematica, eigenvectors?Matlab vs Mathematica,特征向量?
【发布时间】:2011-04-13 12:12:27
【问题描述】:
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 的所有特征向量?

【问题讨论】:

  • 您的帖子中有很多不必要的代码,这只会影响您问题的核心。可以修剪一下吗
  • 这个问题最好在:math.stackexchange.com
  • 特征向量不是唯一的,取单位矩阵——任何向量都是特征值为1的特征向量

标签: matlab wolfram-mathematica


【解决方案1】:

EigenvectorX 的定义是满足 X 的某个向量

AX = kX

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

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

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

【讨论】:

  • 另外,如果告诉 Mathematica 进行数值分析,它会归一化为范数 1,就像 MATLAB 一样(它们使用相同的迭代方法,其本质上会在每个步骤中对特征向量进行归一化)。
  • 为了清楚起见,应该是“所以有一些常数 c 使得 X_matlab = c * X_mathematica.”。
【解决方案2】:

这是因为如果向量 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倍。

【讨论】:

  • 对不起,我也做了同样的事情,并在你之后几秒钟发布了它。删除我的答案:)
【解决方案3】:

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

  1. 必须有单位范数
  2. v_m*v_n=0 代表所有 m ≠ n(正交)
  3. 满足Av_m=u_m v_m,其中u_m是对应的特征值

返回的确切特征向量取决于实现的算法。作为一个简单的例子来证明一个矩阵可以有两组不同的特征向量,考虑一个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 否则返回错误。

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

【讨论】:

    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2016-04-02
    • 1970-01-01
    相关资源
    最近更新 更多