Julia:在Linux

时间:2016-04-20 20:20:30

标签: julia lapack eigenvalue

我在Julia中使用eigs()函数来计算特征值和特征向量。结果非确定性且通常充满 0.0 。临时解决方案是链接 LAPACK 2.0

知道如何在Linux Ubuntu上做到这一点?到目前为止,我无法链接它,而且我没有多少复杂的Linux管理技能,所以如果有人可以发布一些如何正确链接它的指南会很好。

非常感谢。

修改

我想添加结果,但我注意到代码中存在一个缺陷。我正在使用matrix = sparse(map(collect,zip([triple(e,"weight") for e in edges(g)]...))..., num_vertices(g), num_vertices(g))。它回答你的一个问题。当顶点从1开始索引时,它可以正常工作。但是我的顶点由于从文件中读取它们而具有随机索引。所以我将 num_vertices 更改为等于最大索引。但是我没有注意到,当具有最大索引的顶点为1000时,它考虑了1000个顶点的计算,尽管整个图形可以包括例如3个顶点1,10,1000。知道怎么解决吗?

编辑2:

#Content of matrix = matrix+matrix'
[2, 1]  =  10.0
[3, 1]  =  14.0
[1, 2]  =  10.0
[3, 2]  =  10.0
[5, 2]  =  2.0
[1, 3]  =  14.0
[2, 3]  =  10.0
[4, 3]  =  20.0
[5, 3]  =  20.0
[3, 4]  =  20.0
[2, 5]  =  2.0
[3, 5]  =  20.0
[6, 5]  =  10.0
[5, 6]  =  10.0   

matrix = matrix+matrix'
(d, v) = eigs(matrix, nev=1, which=:LR, maxiter=1)

上述代码的5次执行:

[-0.3483956604402672
 -0.3084333257587648
 -0.6697046040724708
 -0.37450798643794125
 -0.4249810113292739
 -0.11882760090004019]

[0.3483956604402674
 0.308433325758765
 0.6697046040724703
 0.3745079864379416
 0.424981011329274
 0.11882760090004027]

[-0.3483956604402673
 -0.308433325758765
 -0.669704604072471
 -0.37450798643794114
 -0.4249810113292739
 -0.1188276009000403]

[0.34839566044026726
 0.30843332575876503
 0.6697046040724703
 0.37450798643794114
 0.4249810113292739
 0.11882760090004038]

[0.34839566044026715
 0.30843332575876503
 0.6697046040724708
 0.3745079864379412
 0.4249810113292738
 0.11882760090004038]

1 个答案:

答案 0 :(得分:4)

该算法确实是非确定性的(在问题的例子中很明显)。但是,答案中有两种非决定论:

  1. 特征向量的完全符号反转。
  2. 小准确度错误。
  3. 如果向量是特征向量,那么它的每个标量倍数(数学上,特征向量是属于特征值的特征向量的子空间的一部分)。因此,如果 v 是特征向量,那么λv。当λ= -1 时,这是符号反转。但 2v 也是一个特征向量。 eigs函数将向量归一化为norm 1 ,因此唯一的自由就是这个符号反转。要解决这种非确定性问题,您可以为矢量的第一个非零坐标(例如,正数)选择一个符号,然后选择多个特征向量来实现。在代码中:

    v = v*sign(v[findfirst(v)])
    

    关于第二个非确定性源(不准确性),重要的是要注意真实的特征值和特征向量通常是实数,而Float64无法准确表示,因此返回值总是关闭。如果所需的精度水平足够低,则确定性地舍入值应使得得到的近似值相同。如果不清楚,请考虑计算sqrt(2)的算法。它可能是非确定性的并返回1.4142135623730951,有时会返回1.4142135623730949,但舍入到5位小数将始终产生1.41421

    以上内容应提供使结果更具确定性的指南。但请考虑:

    1. 如果存在多个具有相同值的特征值,则特征向量的子空间大于1维,并且可以更自由地选择特征向量。这可能会使找到一个确定性向量(或多个向量)来跨越这个空间更复杂。

    2. 应用程序确实需要这种确定性吗?

    3. (感谢代码位 - 它们确实有帮助。当它们可以快速剪切粘贴时更好。)