通过 M<N 的 GSL 计算矩阵的 null space 会产生错误

Computing null space of matrix via GSL with M<N gives an error

我正在用 c 中的 gsl 库计算矩阵 A(m,n) 的空值 space。

遵循gsl中奇异值分解(SVD)函数的文档,例如A = USVt

" 对于秩亏矩阵,A 的空 space 由对应于零奇异值的 V 的列给出。"

对应的函数是

int gsl_linalg_SV_decomp(gsl_matrix * A, gsl_matrix * V, gsl_vector * S, gsl_vector * work)

语法如下:

#include <gsl/gsl_linalg.h>
#include <gsl/gsl_blas.h>
#include <stdio.h>
#include <stdlib.h>
...

int main(int argc, char **argv){
    ...
    gsl_linalg_SV_decomp(A,V,S,work);

return 0;
}

我收到以下错误

gsl: svd.c:60: ERROR: svd of MxN matrix, M<N, is not implemented
Default GSL error handler invoked

确实 A 有 M < N。

您是否知道另一个库可以计算 M < N 矩阵的 Null space?有 gsl 的解决方法吗?

您可以通过计算 A'(A 转置)而不是 A 的 SVD 来执行此操作。A 的空值 space 由对应于零奇异值的左奇异向量跨越。

对于任意矩阵B,正如零奇异值对应的右奇异向量跨越B的零space,非零奇异向量对应的左奇异向量跨越B的范围。

因此,如果我们对 A' 进行 SVD,

A' = U*S*V'

A' 的范围被 U 中对应于非零奇异向量的列所跨越。但是A的null-space是垂直于A'范围的向量集。因此,A 的 null-space 被对应于零奇异值的 U 的列所跨越。