f2py:一些返回数组的不变/空(f2py: some of returned arrays are

2019-07-29 14:04发布

嗨,我是用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_uout_vh仍然只用零填充,做我必须做一些不同的东西来获得左/右奇异向量呢?

该代码贯穿,没有任何错误,这意味着out_info是0。

(对于jobu和jobvt参数“S”告诉例程以计算仅第一分钟(M,N)的奇异向量。它更改为“A”,不作任何差异)

任何想法是高度赞赏! 由于米沙

Answer 1:

f2py创建Python包装到Fortran代码,但创建的Python函数不打算被称为酷似Fortran代码。 在Fortran中,通常的做法是通过输出变量作为参数的子程序。 这不是“Python的”; 此外,蟒蛇真的不支持以同样的方式为Fortran的子程序。 出于这个原因, f2py将您的Fortran子程序成一个Python函数,因此,所有的输出变量由函数,不包括在调用签名返回 。 所以,你会调用该函数是这样的:

out_s, out_u, out_vh, info = dgesvd(jobu='S', 
                                    jobvt='S',
                                    m=rows,
                                    n=cols,
                                    a=mat,
                                    work=workspace,
                                    lwork=rows*cols)

然而,LAPACK程序写在FORTRAN77,因此它不具有任何INTENT的输入/输出变量的声明。 f2py使用INTENT声明找出哪些变量被用作输入,并且其是要被返回作为输出。 根据您发布的函数签名, f2py承担所有的变量都输入,这是不是你想要的。 出于这个原因,我建议编写自己的Fortran 90的包装程序调用dgesvd ,这样您就可以添加INTENT报关单自己给f2py一些提示。 我个人也使用包装分配工作阵列传递给dgesvd ,这样你就不必从蟒蛇的传递。 究竟如何f2py确定输入/输出签名解释这里 (有三种方法可以做到这一点,我更喜欢第三)。



文章来源: f2py: some of returned arrays are unchanged/empty