我在使用numeric.js库的 eig 方法时面临一个奇怪的问题,该方法用于计算方阵的特征值。如果矩阵的大小是4或5,则该方法计算特征值没有任何问题,当大小为6时,我得到
Uncaught Error: eig: internal error
at Function.numeric.house (VM145 numeric.min.js:1)
at Function.numeric.QRFrancis (VM145 numeric.min.js:1)
at Function.numeric.QRFrancis (VM145 numeric.min.js:1)
at Function.numeric.eig (VM145 numeric.min.js:1)
at js:32
我创建了一个小脚本,使用不同大小的方矩阵复制问题。
ns = [4,5,6]
for (var h=0; h<ns.length; h++){
matr = []
n = ns[h]
for (var i=0; i<n; i++){
row = []
for (var j=0; j<n; j++){
row.push(1)
}
matr.push(row)
}
eigenvalues = numeric.eig(matr)
console.log(eigenvalues.lambda.x)
}
&#13;
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/numeric/1.2.6/numeric.min.js"></script>
</head>
<body>
Nothing to see here, look at your console.
</body>
&#13;
有人面临同样的问题吗?有任何解决方法吗?
答案 0 :(得分:1)
我在 numeric.js 库中遇到了同样的问题。它可以解决这样的适定矩阵:
numeric.eig([[1, 0.5],[0, -1.4]]);
给出结果:
x: [ -1.4000000000000004, 1.0000000000000002 ]
然而,numeric.js 无法解决这个问题的特征值 -
matrix =
[
[ 0, 1, 0, 1, 0, 1 ],
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 1, 0, 1, 0, 1 ],
[ 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0 ],
[ 1, 0, 1, 0, 0, 0 ]
]
我尝试了许多类似的二进制/稀疏矩阵,但遇到了内部错误,例如您的问题。
评论建议了替代方案,例如 mathjs 库。在找到更强大的选项之前,我尝试了这个和其他几个库但没有成功。
一个令人沮丧的下午。幸运的是,我最终在 Reddit 线程中浏览了这个库:
https://www.npmjs.com/package/ml-matrix
这个库终于解决了我的问题:
const mlMatrix = require('ml-matrix');
const M = new mlMatrix.Matrix(matrix);
const e = new mlMatrix.EigenvalueDecomposition(M);
e.realEigenvalues -> [-1.4142135623730945, 2.220446049250313e-16, 1.4142135623730954, 0, 0, 0 ]
e.imaginaryEigenvalues -> [ 0, 0, 0, 0, 0, 0 ]
设置合理的零容忍度(例如 1e-10)可以解决舍入误差。