我在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]
答案 0 :(得分:4)
该算法确实是非确定性的(在问题的例子中很明显)。但是,答案中有两种非决定论:
如果向量是特征向量,那么它的每个标量倍数(数学上,特征向量是属于特征值的特征向量的子空间的一部分)。因此,如果 v 是特征向量,那么λv。当λ= -1 时,这是符号反转。但 2v 也是一个特征向量。 eigs
函数将向量归一化为norm 1 ,因此唯一的自由就是这个符号反转。要解决这种非确定性问题,您可以为矢量的第一个非零坐标(例如,正数)选择一个符号,然后选择多个特征向量来实现。在代码中:
v = v*sign(v[findfirst(v)])
关于第二个非确定性源(不准确性),重要的是要注意真实的特征值和特征向量通常是实数,而Float64无法准确表示,因此返回值总是关闭。如果所需的精度水平足够低,则确定性地舍入值应使得得到的近似值相同。如果不清楚,请考虑计算sqrt(2)
的算法。它可能是非确定性的并返回1.4142135623730951
,有时会返回1.4142135623730949
,但舍入到5位小数将始终产生1.41421
。
以上内容应提供使结果更具确定性的指南。但请考虑:
如果存在多个具有相同值的特征值,则特征向量的子空间大于1维,并且可以更自由地选择特征向量。这可能会使找到一个确定性向量(或多个向量)来跨越这个空间更复杂。
应用程序确实需要这种确定性吗?
(感谢代码位 - 它们确实有帮助。当它们可以快速剪切粘贴时更好。)