我正在做一个需要计算矩形矩阵的正交基的项目,这个矩阵可能会或可能不会缺秩。在matlab中,我们可以只调用基于svd的函数orth()来处理这个问题,但是我需要在C中实现它。我尝试使用Gram-Schmidt,它在矩阵是满秩的时候效果很好。C中有没有可以解决这个问题的库?或者在 C 中实现它的一些提示?非常感谢。
问问题
1445 次
2 回答
1
当矩阵秩亏 k 时(例如,如果 4x3 矩阵的秩为 2,则 k=1),则需要生成 k 个随机向量,然后减去之前由 Gram- 生成的其他正交归一化向量的分量随机向量中的施密特。
有必要自己生成向量,如下例所示:
一个 2x2 矩阵
1 1
0 0
通过 Gram-Schmidt,你会得到
1 0
0 0
这是因为原始列空间只包含一个方向。当您检测到这种情况时(norm(v2) < eps
,其中eps
是一个足够小的浮点数,如 1e-10),为第二个向量生成一个随机向量v2
,比如说
1 0.2
0 -0.3
减去的分量v1
1 0
0 -0.3
并将电流归一化v2
1 0
0 1
通过这种方式,您可以构建原始列空间中不存在的方向。
请注意,如果您关心计算速度,此时或在您的生产代码中,应尽可能避免使用 SVD。尽管 SVD 和矩阵-矩阵乘积都是 O(N^3) 复杂度,但 SVD 通常比矩阵-矩阵乘积慢 10 倍以上。事实上,在这样的问题中,SVD 对你的调查很有用,但更好的工具应该是 QR 分解,它本质上是 Gram-Schidt,但操作顺序不同,以获得更好的数值稳定性。
于 2013-07-20T21:51:01.580 回答
0
试试LAPACK库。它有 svd 例程(和许多其他例程)。
于 2013-07-01T16:02:08.223 回答