我正在编写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的合作?
答案 0 :(得分:0)
答案是你在Java中不使用RREF。转换为缩小的梯形形式结果与0进行了大量的比较。如果值为0,我们做一件事。如果该值非常接近0,但不是非常接近0,我们会做一些完全不同的事情(比如除以值)。这意味着一种不稳定的算法。
相反,我们可以使用QR Decomposition,这恰好在colt中实现。