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 中找不到计算零空间的函数,并且 trapezoidalLower 不返回枢轴。

我是要自己写 rref 还是有人知道用 Colt 实现这一目标的更高层次的方法?

4

1 回答 1

0

答案是无论你做什么都不要在 java 中使用 RREF。转换为简化的梯队形式结果与 0 有很多比较。如果值为 0,我们做一件事。如果该值非常接近 0,但又不完全为 0,我们会做一些完全不同的事情(例如除以该值)。这意味着一种不稳定的算法。

相反,我们可以使用QR Decomposition,它恰好在 colt 中实现。

于 2014-05-08T00:57:29.230 回答