向量的零空间
简单说:SVD 能给出零空间,是因为任何矩阵的右奇异向量中,对应奇异值为 0 的那些列正好张成该矩阵的零空间。下面针对 bearing vector 的情况具体解释。
2. 代码对应
cpp
Eigen::JacobiSVD<Eigen::MatrixXd, Eigen::HouseholderQRPreconditioner> svd_f(f_current.transpose(), Eigen::ComputeFullV); // 对 f^T (1x3) 做 SVD nullspaces[i] = svd_f.matrixV().block(0, 1, 3, 2); // 取 V 的后面两列(索引 1,2)
f_current.transpose()是 1×3 的行向量。matrixV()返回 3×3 的 VV,列是标准正交基。block(0,1,3,2)从第 1 列开始取 2 列,恰好就是对应零奇异值的 v2,v3构成零空间基。
3. 为什么不用特征分解或直接叉乘?
叉乘只能得到一个与 ff 正交的向量(比如任意不共线向量做叉乘),但无法直接得到一对正交归一的基,而 SVD 自动给出正交基。(多搞几步也能得到正交基)
特征分解(ff⊤)虽然也能得到零空间,但数值稳定性和方便程度不如直接对原矩阵 SVD。这里用 SVD 一劳永逸地得到了完美正交的零空间矩阵,便于后续投影和协方差变换。
一句话总结:对 f⊤f⊤ 做 SVD,秩为 1,有两个零奇异值,它们对应的右奇异向量就是零空间。这正是 MLPnP 消去深度参数的关键一步。
