こんにちは、こちらで説明されているように、f2py を使用して、dgesvd.f ファイルをコンパイルし、それを llapack にリンクすることで、lapack ルーチン dgesvd をラップしています。
docstring によると、dgesvd モジュールには署名があります。
dgesvd - Function signature:
dgesvd(jobu,jobvt,m,n,a,s,u,vt,work,lwork,info,[lda,ldu,ldvt])
Required arguments:
jobu : input string(len=1)
jobvt : input string(len=1)
m : input int
n : input int
a : input rank-2 array('d') with bounds (lda,*)
s : input rank-1 array('d') with bounds (*)
u : input rank-2 array('d') with bounds (ldu,*)
vt : input rank-2 array('d') with bounds (ldvt,*)
work : input rank-1 array('d') with bounds (*)
lwork : input int
info : input int
Optional arguments:
lda := shape(a,0) input int
ldu := shape(u,0) input int
ldvt := shape(vt,0) input int
次に、次の ocde を使用してモジュールを呼び出します。
mat = rand(20,30)
out_u,out_s,out_vh = zeros((20,20)), zeros((20,)), zeros((30,30))
rows, cols = shape(mat)
workspace = zeros((rows*cols))
out_info = 0
dgesvd(jobu='S',
jobvt='S',
m=rows,
n=cols,
a=mat,
s=out_s,
u=out_u,
vt=out_vh,
work=workspace,
lwork=rows*cols,
info=out_info)
に格納されている正しい特異値が得られますout_s
が、行列out_u
とout_vh
はまだゼロで埋められているだけです。左/右の特異ベクトルを取得するには、何か別のことをする必要がありますか?
コードはエラーなしで実行されます。つまり、out_info
0 です。
(jobu と jobvt の引数 'S' は、最初の min(m,n) 特異ベクトルのみを計算するようにルーチンに指示します。これを 'A' に変更しても、違いはありません)
どんなアイデアでも大歓迎です!ありがとうミーシャ