Julia:在 Linux 上链接 LAPACK 2.0

Julia: Linking LAPACK 2.0 on Linux

我在 Julia 中使用 eigs() 函数来计算特征值和特征向量。结果是 不确定的 并且通常充满 0.0。临时解决办法是linkLAPACK 2.0.

知道如何在 Linux Ubuntu 上完成吗?到目前为止,我无法 link 它并且我没有多么复杂的 Linux 管理技能所以如果有人可以 post 一些如何 link 它的指南会很好正确。

非常感谢。

编辑:

我想添加结果,但发现代码中存在一个缺陷。我正在使用 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. 特征向量的完整符号反转。
  2. 精度误差小。

如果向量是特征向量,那么它的每个标量倍数也是特征向量(从数学上讲,特征向量是属于特征值的特征向量的子 space 的一部分)。因此,如果 v 是特征向量,那么 λv 也是。当λ = -1这就是符号反转。但是 2v 也是一个特征向量。 eigs 函数将向量归一化为范数 1,因此唯一剩下的自由就是符号反转。为了解决这种不确定性,您可以为向量的第一个非零坐标(例如,正数)选择一个符号,并将特征向量乘以使其如此。在代码中:

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

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

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

  1. 如果有多个相同值的特征值,则特征向量的subspace多于1维,选择特征向量的自由度更大。这可能会使找到一个(或多个)确定性向量来跨越这个 space 更加复杂。

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

(感谢代码位 - 它们确实有帮助。如果可以快速剪切和粘贴它们就更好了)。