3

我一直在使用 svd 计算来做到这一点

[U, S, V] = svd(A)

其中我使用 A 的最后一列作为我的零空间近似值。由于 A 变得非常大,我意识到这会减慢我的计算速度。

对于 null(A),文档似乎表明它无论如何都会执行 SVD。此外,如果 A 是满级,它也不起作用。SVD 通过找到最大的奇异值来进行,然后是下一个,依此类推,而我只需要最小的。

这似乎是一个很大的瓶颈。将非常感谢这方面的帮助。我正在使用 MATLAB。

谢谢。

4

3 回答 3

3

这篇Wikipedia 文章描述了零空间数值计算的三种方法:归约(高斯消除)、SVDQR 分解。简而言之,(1)归约“不适合零空间的实际计算,因为存在舍入误差的数值精度问题”,(2)SVD 是“最先进的方法”,但它“通常成本与使用相同大小的矩阵进行几次矩阵乘法的成本大致相同”,并且(3)数值稳定性和 QR 分解的成本“介于 SVD 和归约方法之间”。

所以如果 SVD 太慢,你可以给QR 分解的机会。带有符号的算法如下:"A是一个4xN矩阵_ _的。矩阵是并且由 的最后一列组成。由于的列跨越 的零空间。4<NA'A'*P = Q*R = [Q1 Q2]*RPQNxNRNx4Q1QQ2Nx(N-4)N-4QA*Q2 = 0Q2A

Matlab 实现:[Q, R, P] = qr(A', 'matrix');矩阵的列Q2 = Q(:, 5:end);给出A.

于 2011-12-14T13:26:09.433 回答
1

这个答案建立在您的评论之上,即您真正想要做的是解决Ax = 0。为此,完整的零空间计算通常是低效的。如果您想要对 进行最小二乘近似x,请查看 matlab 运算符\(请参阅参考资料help mldivide)。

在其他情况下,“经济”SVD viasvd(A,0)可能对非方阵有用(它不计算完整的 S,而只计算非零块)。

于 2011-12-14T12:45:17.877 回答
0

如果所有点都来自平面,则仅使用样本调用 SVD。

于 2011-12-13T23:34:53.697 回答