我正在使用Apache Commons Library进行一些基本的计算,我有一个2x2对称的RealMatrix,我需要计算它的EigenDecomposition。矩阵如下:
{{10.387035702893005, 0.14862451664049367},
{0.14862451664049442, -5.1952457826500815}}
double类型的右上角和左下角元素应该是相同的,你会发现它们几乎是相同的。但是,当我将矩阵传递给EigenDecomposition的新实例时,我会得到一个例外。 isSymmetric()计算false,并且因为构造函数将'true'作为参数传递,所以isSymmetric()方法引发异常。我基本上需要绕过这个检查。我有什么选择?谢谢!
public EigenDecomposition(final RealMatrix matrix,
final double splitTolerance) {
if (isSymmetric(matrix, true)) {
transformToTridiagonal(matrix);
findEigenVectors(transformer.getQ().getData());
}
}
N.B。拆分容差参数(人们可能认为指定容差级别)仅仅是一个虚拟参数。
答案 0 :(得分:0)
问题似乎是一个数字错误 - 值几乎相同,但并不完全相同。一个快速而肮脏的解决方案可能是:
使用以下条件检查两个值是否相等:Math.abs(matrix[0][1] - matrix[1][0]) < DELTA
。其中DELTA
是您的容差因子(您可以容忍的最大值是多少,因此矩阵将被视为对称)。
如果是 - 请指定matrix[0][1] = matrix[1][0]
很容易看出,满足条件的矩阵现在应该按照定义进行对称。
答案 1 :(得分:0)
你可以覆盖isSymmetric
然后让第二个参数被忽略。然后,你可以调用自己的isSymmetric
方法
例如
@override
public boolean isSymmetric(RealMatrix m, Boolean b) {
return _isSymmetric(m);
}
其中_isSymmetric(m)
是您自己的实现。然后,您可以以任何您认为合适的方式比较双值。我建议使用delta而不是直的==因为double值很少是完全相等但通常足够相等;)
答案 2 :(得分:0)
如果这两个值相等,你可以只在另一个上面复制一个吗?
matrix[0][1] = matrix[1][0];