使用Colt采样Nullspace

时间:2014-05-03 00:49:25

标签: java python linear-algebra sympy colt

我正在编写Java并使用colt作为我的矩阵库,并希望在矩阵的内核中找到(任意)向量。我可以在python中使用sympy执行此操作,如下所示:

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来获取在缩减为row-echelon形式时使用的枢轴,并从中找到null空间中的单个向量。我无法在Colt中找到一个函数来计算零空间,而trapezoidalLower也不会返回枢轴。

我是离开去写自己的rref还是有人知道更高级别的方式来实现与Colt的合作?

1 个答案:

答案 0 :(得分:0)

答案是你在Java中不使用RREF。转换为缩小的梯形形式结果与0进行了大量的比较。如果值为0,我们做一件事。如果该值非常接近0,但不是非常接近0,我们会做一些完全不同的事情(比如除以值)。这意味着一种不稳定的算法。

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