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]
该算法确实是不确定的(在问题的例子中很明显)。但是,答案中有两种不确定性:
- 特征向量的完整符号反转。
- 精度误差小。
如果向量是特征向量,那么它的每个标量倍数也是特征向量(从数学上讲,特征向量是属于特征值的特征向量的子 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
.
以上内容应提供使结果更具确定性的指南。但请考虑:
如果有多个相同值的特征值,则特征向量的subspace多于1维,选择特征向量的自由度更大。这可能会使找到一个(或多个)确定性向量来跨越这个 space 更加复杂。
应用程序真的需要这种确定性吗?
(感谢代码位 - 它们确实有帮助。如果可以快速剪切和粘贴它们就更好了)。
我在 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]
该算法确实是不确定的(在问题的例子中很明显)。但是,答案中有两种不确定性:
- 特征向量的完整符号反转。
- 精度误差小。
如果向量是特征向量,那么它的每个标量倍数也是特征向量(从数学上讲,特征向量是属于特征值的特征向量的子 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
.
以上内容应提供使结果更具确定性的指南。但请考虑:
如果有多个相同值的特征值,则特征向量的subspace多于1维,选择特征向量的自由度更大。这可能会使找到一个(或多个)确定性向量来跨越这个 space 更加复杂。
应用程序真的需要这种确定性吗?
(感谢代码位 - 它们确实有帮助。如果可以快速剪切和粘贴它们就更好了)。