我正在做一个需要计算矩形矩阵的标准正交基的项目,这个矩阵可能是也可能不是排名不足。在matlab中,我们可以调用基于svd的函数orth()来处理这个问题,但是我需要在C中实现它。我试图使用Gram-Schmidt,当矩阵是满秩时它运行良好。 C中有没有可以解决这个问题的库?或者在C中实现它的一些提示?非常感谢。
答案 0 :(得分:1)
当矩阵的秩缺乏k时(例如,如果4x3矩阵的秩为2,则k = 1),则需要生成k个随机向量,然后减去先前生成的其他正交归一化向量的分量来自随机向量的Gram-Schmidt。
您需要自己生成矢量,如下所示:
2x2矩阵
1 1
0 0
Gram-Schmidt,你会得到
1 0
0 0
这是因为原始列空间仅包含单个方向。当您检测到这种情况时norm(v2) < eps
,其中eps
是一个足够小的浮点数,如1e-10),为第二个向量v2
生成一个随机向量,比如说< / p>
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,但是在不同的操作顺序中具有更好的数值稳定性。
答案 1 :(得分:0)
试用LAPACK库。它有svd例程(以及许多其他例程)。