如何纠正任意复杂矩阵的julia中的特征向量

时间:2015-10-29 01:00:05

标签: matrix julia

当我计算某种类型矩阵的特征向量时,我对julia给我的特征向量有一些问题:

[-3.454373366796186+1.0*im -0.25350955594231006 0.08482455312233446 0.5677952929872186 0.8512642461184345 -3.3973836853171955
 -0.25350955594231006 -4.188304472566067 -0.7536261600953561 -0.2208291476393107 -0.9576102121737481 0.7295909738153196
 0.08482455312233446 -0.7536261600953561 -4.145281297093087 0.40094370842599164 -0.3177721876030173 -1.1267847565490017
 0.5677952929872186 -0.2208291476393107 0.40094370842599164 -2.561932209885087 0.40874651002530255 -0.5972057181377701
 0.8512642461184345 -0.9576102121737481 -0.3177721876030173 0.40874651002530255 -4.22394564475772 -0.6957268391716376
 -3.3973836853171955 0.7295909738153196 -1.1267847565490017 -0.5972057181377701 -0.6957268391716376 -3.4158987954939084+1.0*im]

(矩阵应该是埃尔米特,除了元素(1,1)和(6,6)。

它的特征向量是:实部

[[-0.60946085  0.66877065 -0.10826958 -0.253947    0.30520429  0.02194697]
 [ 0.20102357 -0.07276538  0.60248336 -0.07765244  0.71609468 -0.24683536]
 [-0.18741272  0.21271718  0.48641162  0.11191183 -0.52801356 -0.62029698]
 [-0.26210071 -0.0094668  -0.07383844  0.91999668  0.22550855 -0.0102918 ]
 [-0.23182113 -0.02787858  0.61634939  0.03726956 -0.20443225  0.72225431]
 [ 0.64708605  0.70447722  0.04021026  0.22014373 -0.06068686  0.16822489]]

虚构部分

[[ 0.00680416  0.01172969  0.0036139  -0.00816376  0.02468384 -0.05604585]
 [ 0.04974942  0.00719276 -0.01608118  0.09895638  0.         -0.01326765]
 [-0.04007749 -0.06932898  0.01283773 -0.06201991 -0.01329243  0.00324368]
 [-0.07372251  0.00715689  0.0038056   0.         -0.09608138  0.01970827]
 [-0.04798741 -0.00062382  0.         -0.07323346  0.03896021  0.        ]
 [ 0.          0.          0.03589898  0.04052119 -0.08599638 -0.00702559]]

显然存在对虚部的依赖,否则在特征向量的每个虚部中都不会出现零。我之所以知道这部分原因是因为我在mathematica中进行了计算,它并没有给我零。

如何清除此类行为?

2 个答案:

答案 0 :(得分:3)

通过扩展科林的探索(以及我对它的评论),这里有一个函数可以帮助将Julia / Matlab的结果转换为Mathematica结果:

matlab2mathematica(m) = m/Diagonal(vec(m[end,:]))

它只是使用自由选择任意倍数的特征向量,并仍然跨越相同的空间。

在OP中的矩阵上,这给出了:

# m2 is the matrix from OP

real(matlab2mathematica(m2)) = 

6x6 Array{Float64,2}:
 -0.941854   0.949315   -1.45368   -1.12235   -1.86352    0.144124 
  0.31066   -0.10329     8.13901   -0.261148  -3.92277   -1.46145  
 -0.289626   0.30195     6.89       0.441542   2.99565   -3.68169  
 -0.405048  -0.0134381  -0.974822   4.04212   -0.489495  -0.0659565
 -0.358254  -0.0395734   8.52958    0.104523   0.817448   4.28591  
  1.0        1.0         1.0        1.0        1.0        1.0      

imag(matlab2mathematica(m2)) = 

6x6 Array{Float64,2}:
 -0.0105151  -0.0166502    -1.38769      -0.169504  -2.23397       0.327141
 -0.0768822  -0.0102101     7.66628      -0.497577  -5.55877       0.139903
  0.0619353   0.098412      5.832         0.362998   4.02595       0.134477
  0.11393    -0.0101592    -0.964946      0.744021  -2.27687      -0.1144  
  0.0741592   0.000885503   7.61505       0.351901   1.80035      -0.178993
 -0.0        -0.0          -5.55112e-17  -0.0        5.55112e-17  -0.0     

这可能是Mathematica给出的。是吗?

答案 1 :(得分:2)

更新:鉴于OP缺乏澄清,我将把这个问题标记为完全重复并​​投票决定。

你说:“很明显存在对虚部的依赖,否则特征向量的每个想象部分中的零都不会出现。”

我不确定这意味着什么。

但是,您在问题中提供的所有数字对我来说都是正常和正确的,即典型行为。

请记住,特征向量仅在正交变换时才是唯一的,因此任何软件都需要选择规则来扩展特征向量函数的输出。 Mathematica对大多数其他软件使用不同的规则,这在过去使许多用户感到困惑。例如,如果您有Matlab,您会注意到它提供了您在问题中描述的输出。所以Julia在这个例子中表现得像Matlab,而不是Mathematica。

想想看,我之前就Matlab / Mathematica回答了这个问题。见here。我认为这个问题是重复的,但在标记之前可能会等待您的回复。我可能误解了你想要的东西。