0

我正在使用 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());
    }
}

NB 分裂容差参数,人们可能认为它指定了容差水平,只是一个虚拟参数。

4

3 回答 3

0

如果这两个值应该相等,您可以将一个复制到另一个之上吗?

matrix[0][1] = matrix[1][0];
于 2012-10-15T09:42:02.677 回答
0

问题似乎是一个数字错误 - 值几乎相同,但不完全相同。一个快速而肮脏的解决方案可能是:

使用条件检查两个值是否相等:Math.abs(matrix[0][1] - matrix[1][0]) < DELTA。你的容忍因子在哪里DELTA(你可以容忍的最大值是多少,所以矩阵将被认为是对称的)。

如果是 - 分配matrix[0][1] = matrix[1][0]

很容易看出,满足条件的矩阵现在应该按照定义是对称的。

于 2012-10-15T09:29:43.603 回答
0

你可以覆盖isSymmetric然后让第二个参数被忽略。然后你可以调用你自己的isSymmetric方法

例如

@override
public boolean isSymmetric(RealMatrix m, Boolean b) {
     return _isSymmetric(m);
}

_isSymmetric(m)你自己的实现在哪里。然后,您可以以任何您认为合适的方式比较双精度值。我建议使用 delta 而不是直接 == 因为 double 值很少完全相等,但通常足够相等;)

于 2012-10-15T09:33:29.357 回答