我一直在使用 svd 计算来做到这一点
[U, S, V] = svd(A)
其中我使用 A 的最后一列作为我的零空间近似值。由于 A 变得非常大,我意识到这会减慢我的计算速度。
对于 null(A),文档似乎表明它无论如何都会执行 SVD。此外,如果 A 是满级,它也不起作用。SVD 通过找到最大的奇异值来进行,然后是下一个,依此类推,而我只需要最小的。
这似乎是一个很大的瓶颈。将非常感谢这方面的帮助。我正在使用 MATLAB。
谢谢。
我一直在使用 svd 计算来做到这一点
[U, S, V] = svd(A)
其中我使用 A 的最后一列作为我的零空间近似值。由于 A 变得非常大,我意识到这会减慢我的计算速度。
对于 null(A),文档似乎表明它无论如何都会执行 SVD。此外,如果 A 是满级,它也不起作用。SVD 通过找到最大的奇异值来进行,然后是下一个,依此类推,而我只需要最小的。
这似乎是一个很大的瓶颈。将非常感谢这方面的帮助。我正在使用 MATLAB。
谢谢。
这篇Wikipedia 文章描述了零空间数值计算的三种方法:归约(高斯消除)、SVD和QR 分解。简而言之,(1)归约“不适合零空间的实际计算,因为存在舍入误差的数值精度问题”,(2)SVD 是“最先进的方法”,但它“通常成本与使用相同大小的矩阵进行几次矩阵乘法的成本大致相同”,并且(3)数值稳定性和 QR 分解的成本“介于 SVD 和归约方法之间”。
所以如果 SVD 太慢,你可以给QR 分解的机会。带有符号的算法如下:"A
是一个4xN
矩阵_ _的。矩阵是并且由 的最后一列组成。由于的列跨越 的零空间。4<N
A'
A'*P = Q*R = [Q1 Q2]*R
P
Q
NxN
R
Nx4
Q1
Q
Q2
Nx(N-4)
N-4
Q
A*Q2 = 0
Q2
A
Matlab 实现:[Q, R, P] = qr(A', 'matrix');
矩阵的列Q2 = Q(:, 5:end);
给出A
.
这个答案建立在您的评论之上,即您真正想要做的是解决Ax = 0
。为此,完整的零空间计算通常是低效的。如果您想要对 进行最小二乘近似x
,请查看 matlab 运算符\
(请参阅参考资料help mldivide
)。
在其他情况下,“经济”SVD viasvd(A,0)
可能对非方阵有用(它不计算完整的 S,而只计算非零块)。
如果所有点都来自平面,则仅使用样本调用 SVD。