2017-07-12 8 views
0

私は、cでgslライブラリを使って行列A(m、n)の空白を計算しています。例えばA = USVtとしてGSLに特異値分解(SVD)関数のドキュメント以下M <NでGSLを介して行列の空白を計算するとエラーが発生する

"階数欠損行列の場合、Aのヌル空間をゼロに対応するVの列によって与えられます。 。

#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; 
} 
:特異値 "

対応する関数は

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

構文は以下の通りです

は、私は次のエラーを取得

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

確かにAがあるM < N.

あなたはM < Nの行列の零空間を計算します別のライブラリを知っていますか? gslの回避策はありますか?

答えて

1

これは、AではなくA '(A転置)のSVDを計算することによって行うことができます.Aの零空間は、特異値がゼロに対応する左特異ベクトルによって広がります。任意の行列Bについて

、ゼロ特異値に対応する右特異ベクトルは、Bのヌル空間にまたがるようにだけ、非ゼロの特異ベクトルに対応する左特異ベクトルはそうB.

の範囲に及びます我々はAのSVDを行う場合は「

A' = U*S*V' 

の範囲で、」非ゼロ特異ベクトルに対応するUの列によって張られます。しかし、Aのヌルスペースは、A 'の範囲に垂直なベクトルのセットです。したがって、Aのゼロ空間は、Uの特異値に対応するUの列にまたがる。

+0

ここにあなたが言ったことをする実用的なコードです。https://github.com/RasmusFonseca/SVDcomparison/blob/master/SVDGSL.cpp – Marouen

関連する問題