Julia 朱莉娅:在Linux上链接LAPACK 2.0

Julia 朱莉娅:在Linux上链接LAPACK 2.0,julia,lapack,eigenvalue,Julia,Lapack,Eigenvalue,我在Julia中使用eigs函数来计算特征值和特征向量。结果是不确定的,通常充满0.0。临时解决方案是链接LAPACK 2.0 你知道如何在Linux Ubuntu上实现吗?到目前为止,我无法链接它,也不知道Linux管理技能有多复杂,所以如果有人能发布一些关于如何正确链接它的指南,那将是一件好事 非常感谢 编辑: 我想添加结果,但我注意到代码中有一个缺陷。我使用的是matrix=sparsemapcollect,zip[triplee,edgesg中e的权重]……num_verticesg,n

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

你知道如何在Linux Ubuntu上实现吗?到目前为止,我无法链接它,也不知道Linux管理技能有多复杂,所以如果有人能发布一些关于如何正确链接它的指南,那将是一件好事

非常感谢

编辑:

我想添加结果,但我注意到代码中有一个缺陷。我使用的是matrix=sparsemapcollect,zip[triplee,edgesg中e的权重]……num_verticesg,num_verticesg。这是你对我的一个问题的回答。当顶点从1索引时,它工作正常。但由于从文件中读取,我的顶点具有随机索引。所以我将num_顶点更改为等于最大索引。但我并没有注意到,例如,当最大索引的顶点为1000时,它正在进行考虑1000个顶点的计算,尽管整个图形可能包括3个顶点1、10、1000。知道怎么修吗

编辑2:

5执行上述代码:


该算法确实是非确定性的,这在问题的示例中是显而易见的。但是,答案中有两种非决定论:

特征向量的完全符号反转。 精度误差小。 如果一个向量是一个特征向量,那么在数学上它的每一个标量倍数也是一个特征向量,那么该特征向量是属于一个特征值的特征向量子空间的一部分。因此,如果v是特征向量,那么λv也是。当λ=-1时,这是符号反转。但2v也是一个特征向量。eigs函数将向量标准化为范数1,因此唯一剩下的自由就是符号反转。为了解决这个不确定性,你可以为向量的第一个非零坐标选择一个符号,比如说,正数和特征向量的倍数。代码:

v = v*sign(v[findfirst(v)])
关于第二个非确定性源不准确度,需要注意的是,真实特征值和特征向量通常是实数,不能用Float64精确表示,因此返回值总是关闭的。如果所需的精度水平足够低,则决定性地四舍五入值应使所得近似值相同。如果不清楚,考虑一个计算SqtR2的算法。它可能是不确定的,返回1.4142135623730951,有时返回1.4142135623730949,但四舍五入到小数点后5位将始终返回1.41421

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

如果存在具有相同值的多个特征值,则特征向量的子空间大于一维,并且有更多的自由选择特征向量。这可能使寻找一个或多个确定的向量来跨越这个空间变得更加复杂

应用程序真的需要这种决定论吗


谢谢你的代码位,它们确实有帮助。如果可以快速剪切和粘贴,效果会更好。

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

特征向量的完全符号反转。 精度误差小。 如果一个向量是一个特征向量,那么在数学上它的每一个标量倍数也是一个特征向量,那么该特征向量是属于一个特征值的特征向量子空间的一部分。因此,如果v是特征向量,那么λv也是。当λ=-1时,这是符号反转。但2v也是一个特征向量。eigs函数将向量标准化为范数1,因此唯一剩下的自由就是符号反转。为了解决这个不确定性,你可以为向量的第一个非零坐标选择一个符号,比如说,正数和特征向量的倍数。代码:

v = v*sign(v[findfirst(v)])
关于第二个非确定性源不准确度,需要注意的是,真实特征值和特征向量通常是实数,不能用Float64精确表示,因此返回值总是关闭的。如果所需的精度水平足够低,则决定性地四舍五入值应使所得近似值相同。如果不清楚,考虑一个计算SqtR2的算法。它可能是不确定的,返回1.4142135623730951,有时返回1.4142135623730949,但四舍五入到小数点后5位将始终返回1.41421

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

如果存在具有相同值的多个特征值,则特征向量的子空间大于一维,并且有更多的自由选择特征向量。这可能使寻找一个或多个确定的向量来跨越这个空间变得更加复杂

应用程序真的需要这种决定论吗


谢谢你的代码位,它们确实有帮助。如果可以快速剪切和粘贴,效果会更好。

您能为非确定性和0.0s添加示例代码吗?集中注意力通常是有帮助的
问题的回复。请回复我的编辑?这与你对我问题的一个回答有关。谢谢。@J.Jesenius,我建议您用我们可以运行的代码制作一个简单的示例,以重现问题。您可以将代码放在gist gist.github.com中,例如1000顶点索引可能会导致邻接矩阵变大且大部分为空,从而解释0.0特征值。最好使用Dict对顶点重新编号,以使矩阵更密集。在任何情况下,D.P.Sanders建议的最小示例代码+1。您是否可以为非确定性和0.0s添加示例代码?集中回答问题通常是有帮助的。请回复我的编辑?这与你对我问题的一个回答有关。谢谢。@J.Jesenius,我建议您用我们可以运行的代码制作一个简单的示例,以重现问题。您可以将代码放在gist gist.github.com中,例如1000顶点索引可能会导致邻接矩阵变大且大部分为空,从而解释0.0特征值。最好使用Dict对顶点重新编号,以使矩阵更密集。在任何情况下,D.P.Sanders建议的最少示例代码+1。感谢这一点,帮助很大。我知道代码位并不容易粘贴并运行程序。但我不想在这里发布全部代码。我之前从一些github问题中了解到,这应该是确定性的,因为在python中使用EIG时,它始终是相同的解决方案。但是经过一些思考,答案是不需要非决定论。非常感谢。这帮了大忙。我知道代码位并不容易粘贴并运行程序。但我不想在这里发布全部代码。我之前从一些github问题中了解到,这应该是确定性的,因为在python中使用EIG时,它始终是相同的解决方案。但是经过一些思考,答案是不需要非决定论。谢谢。
v = v*sign(v[findfirst(v)])