0

私は Apache Commons Library を使用していくつかの基本的な計算を行っており、EigenDecomposition を計算する必要がある 2x2 の対称 RealMatrix があります。マトリックスは次のとおりです。

{{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());
    }
}

注意: 許容レベルを指定すると考えられる分割許容パラメータは、単なるダミー パラメータです。

4

3 に答える 3

0

2つの値が等しいと想定される場合、一方を他方の上にコピーすることはできますか?

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

問題は数値エラーのようです - 値はほぼ同じですが、正確ではありません。迅速で汚い解決策は次のとおりです。

次の条件を使用して、2 つの値が互いに等しいかどうかを確認しますMath.abs(matrix[0][1] - matrix[1][0]) < DELTA。許容係数はどこにDELTAありますか(行列が対称と見なされるように許容できる最大値は何ですか)。

そうであれば - 割り当てるmatrix[0][1] = matrix[1][0]

条件を満足する行列は、定義上対称である必要があることは簡単にわかります。

于 2012-10-15T09:29:43.603 に答える
0

オーバーライドisSymmetricしてから、2 番目のパラメーターを無視することはできますか。isSymmetricその後、独自のメソッドを呼び出すことができます

例えば

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

_isSymmetric(m)独自の実装はどこにありますか。次に、適切と思われる方法で double 値を比較できます。double 値が完全に等しいことはめったにありませんが、通常は十分に等しいため、ストレート == ではなくデルタを使用することをお勧めします;)

于 2012-10-15T09:33:29.357 に答える