0

私は Java を書いていて、colt をマトリックス ライブラリとして使用しており、マトリックスのカーネルで (任意の) ベクトルを見つけたいと考えています。次のようにsympyを使用してpythonでこれを行うことができます:

def kernel(A, n):
    if A.rows == 0:
        return Matrix([1]*n)

    R, pivots = A.rref()
    Ap = A.extract(range(A.rows), pivots)
    bp = Matrix([0]*Ap.rows)

    free = list(set(range(n)) - set(pivots))
    for i in free:
        bp -= A[:, i]

    xp = Ap.LUsolve(bp)
    x = [1]*n

    for i in range(len(pivots)):
        x[pivots[i]] = xp[i]

    return Matrix(x)

sympy を使用すると、nullspace を呼び出して nullspace 全体を取得したり、rref を使用して行エシュロン形式に縮小するときに使用されるピボットを取得したり、そこから nullspace で単一のベクトルを見つけたりすることができます。Colt で nullspace を計算する関数を見つけることができず、trapezoidalLower はピボットを返しません。

私は自分の rref を書くことを余儀なくされていますか、それとも Colt でこれを達成するためのより高いレベルの方法を誰かが知っていますか?

4

1 に答える 1

0

答えは、Java で RREF を使用しないことです。縮小階層形式に変換すると、0 との比較が多数あることがわかります。値が 0 の場合、1 つのことを行います。値が 0 に非常に近いが完全に 0 ではない場合、まったく異なる処理を行います (値で割るなど)。これは、1 つの不安定なアルゴリズムを意味します。

代わりに、colt に実装されているQR Decompositionを使用できます。

于 2014-05-08T00:57:29.230 に答える