Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays f2py:返回的某些数组未更改/为空_Arrays_Return_Zero_F2py - Fatal编程技术网

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

Arrays f2py:返回的某些数组未更改/为空,arrays,return,zero,f2py,Arrays,Return,Zero,F2py,您好,我正在使用f2py来包装lapack例程dgesvd,方法是编译dgesvd.f文件并将其与llapack链接,如前所述 根据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

您好,我正在使用f2py来包装lapack例程dgesvd,方法是编译dgesvd.f文件并将其与llapack链接,如前所述

根据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\u s
中的正确奇异值,但是矩阵
out\u
out\u vh
仍然只填充了零,我是否也需要做一些不同的事情来获得左/右奇异向量

代码运行通过,没有任何错误,这意味着
out\u info
为0

(jobu和jobvt的参数'S'告诉例程仅计算第一个min(m,n)奇异向量。将其更改为'A'不会产生任何差异)

任何想法都将受到高度赞赏! 谢谢
Misha

f2py
创建了Fortran代码的python包装器,但创建的python函数的调用并不完全像Fortran代码那样。在Fortran中,通常将输出变量作为参数传递给子例程。这不是“pythonic”;此外,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
的工作数组,这样就不必从python传递它。解释了
f2py
确定输入/输出签名的确切方式(有三种方法,我更喜欢第三种)

f2py
为Fortran代码创建python包装,但创建的python函数的调用并不完全像Fortran代码那样。在Fortran中,通常将输出变量作为参数传递给子例程。这不是“pythonic”;此外,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
的工作数组,这样就不必从python传递它。解释了
f2py
确定输入/输出签名的确切方式(有三种方法,我更喜欢第三种)

是直接包装LAPACK例程,还是编写自己的调用LAPACK例程的例程?我使用
f2py-L/usr/lib/-llapack-lblas-dgesvd-c dgesvd.f直接包装它
上面的dgesvd例程是dgesvd.dgesvd。不过,我正在链接一个较旧的lapack版本。(来源3.4.1,liblapack:3.3.1)希望这不是问题所在,因为我计划在集群上使用它,而不需要在集群上重新编译整个lapack库……我们直接包装lapack例程,或者编写自己的调用LAPACK例程的例程?我直接使用
f2py-L/usr/lib/-llapack-lblas-dgesvd-c dgesvd.f来包装它
上面的dgesvd例程是dgesvd.dgesvd。不过,我正在链接一个较旧的lapack版本。(来源3.4.1,liblapack:3.3.1)希望这不是问题所在,因为我计划在集群上使用它,而不必重新编译整个lapack库……在一些猴子看到猴子做小提琴后,效果相当好,非常感谢你的帮助!在一些猴子看到猴子做小提琴后,效果很好,非常感谢你的帮助!