我正在编写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,我可以调用零空间来得到整个零空间,或者使用rref来得到在化简成行阶梯形时使用的枢轴,并从中找到我自己在零空间中的单个向量。我在Colt中找不到一个函数来计算零空间和梯形allower不返回枢轴。
我要写我自己的参考或有人知道一个更高层次的方式实现这与柯尔特?
答案是无论你做什么都不要在java中使用RREF。转化成简化阶梯形和0有很多比较。如果值为0,我们只做一件事。如果该值非常接近于0,但不完全为0,我们将执行完全不同的操作(例如除以该值)。这意味着一个不稳定的算法。
我们可以使用QR分解,它恰好在colt中实现。