【问题标题】:Overriding library constructor with unwanted behavior用不需要的行为覆盖库构造函数
【发布时间】:2012-10-05 06:02:59
【问题描述】:

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

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

【问题讨论】:

  • 你是如何构建这个矩阵的?
  • 它来自一点计算。取一个大矩阵,找到它的最大非对角线行和列,然后从 [[ii, ij],[ji, jj]] 形成 2x2 矩阵。我想,通过后面涉及一些突变的计算步骤,较大矩阵 ij 和 ji 中的数字略有不同。

标签: java math inheritance apache-commons


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    例如

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

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

    【讨论】:

      【解决方案3】:

      如果这两个值应该相等,你能把一个复制到另一个上面吗?

      matrix[0][1] = matrix[1][0];
      

      【讨论】:

        猜你喜欢
        • 2014-06-09
        • 1970-01-01
        • 1970-01-01
        • 2014-04-11
        • 1970-01-01
        • 1970-01-01
        • 2015-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多