覆盖具有不需要的行为的库构造函数

时间:2012-10-15 09:22:43

标签: java math inheritance apache-commons

我正在使用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。拆分容差参数(人们可能认为指定容差级别)仅仅是一个虚拟参数。

3 个答案:

答案 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];