首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >f2py:某些返回的数组未更改/为空

f2py:某些返回的数组未更改/为空
EN

Stack Overflow用户
提问于 2012-05-27 22:11:48
回答 1查看 1.1K关注 0票数 1

您好,我正在使用f2py来包装lapack例程dgesvd,方法是编译dgesvd.f文件并将其链接到llapack,如here所解释的那样

根据docstring,dgesvd模块的签名为:

代码语言:javascript
复制
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来调用该模块:

代码语言:javascript
复制
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‘告诉例程只计算第一个min(m,n)奇异向量。将其更改为'A',没有任何区别)

任何想法都是非常感谢的!谢谢Mischa

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-28 04:24:32

f2py为Fortran代码创建了python包装器,但是创建的python函数并不打算像Fortran代码那样被调用。在Fortran中,通常将输出变量作为参数传递给子例程。这不是"pythonic";此外,python并不像Fortran那样支持子例程。出于这个原因,f2py将Fortran子例程转换为python函数,因此所有输出变量都由函数返回,而不包括在调用签名中。因此,您必须以这种方式调用函数:

代码语言:javascript
复制
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假定所有变量都是输入的,这并不是您想要的。出于这个原因,我建议您编写自己的Fortran90包装器例程来调用dgesvd,这样您就可以自己添加INTENT声明,从而给f2py一些提示。我个人也会使用包装器来分配要传递给dgesvd的工作数组,这样您就不必从python传递它了。here解释了f2py究竟是如何确定输入/输出签名的(有三种方法,我更喜欢第三种)。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10774594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档