嗨,我正在使用 f2py 来包装 lapack 例程 dgesvd,方法是编译 dgesvd.f 文件并将其链接到 llapack,如此处所述
根据文档字符串, 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”,没有任何区别)
任何想法都受到高度赞赏!谢谢米莎