【问题标题】:How to call octave function from python?如何从python调用八度函数?
【发布时间】:2017-10-16 12:25:30
【问题描述】:

我有一个 issue.m 文件,它具有这样的功能:myfun(p,m)

它进行一些计算并返回结果。为了测试这个函数的执行,我有一个如下所示的 test.m 文件。
myfun(myarg1,myarg2)

如果我将此文件运行为: octave test.m 然后它返回正确的结果,如下所示:0.38007

现在,问题是当使用 python 调用这个函数 myfun(p,m) 时。我尝试使用 python 库:oct2py

python 代码如下所示:

import sys
import subprocess
import oct2py
import requests
from oct2py import octave

def myfun(p,m):
    octave.addpath('/mypath');
    oc = oct2py.Oct2Py()
    #res = octave.myfun(p,m nout=1);#this didn't work, hence comment
    #res = oc.myfun(p, m) #this didn't work, hence comment    
    x = oc.feval("myfun",p,m);
    print(x);

if __name__ == '__main__':
    myfun(sys.argv[1],sys.argv[2])

当我将此代码运行为:python FileName.py arg1 arg2(我在 test.m 中使用的参数相同)时,它会给我一条警告消息和一个像这样的空列表:

警告:返回值列表中的某些元素未定义 []

我不知道该怎么做。由于该函数似乎在使用八度时以正确的格式返回正确的结果。但由于某种原因 oct2py 无法正常工作。

【问题讨论】:

  • 您的 Octave 函数是实际返回输出还是只是将其打印到命令窗口?请参阅minimal reproducible example
  • 我的 octave 函数返回一个输出,正如我在 octave-cli 中看到的那样:octave:1> mytest timeBSeuCallUI = 2.6464e-04 1.5133e+00 NaN relerrBSeuCallUI = 2.7459e-05 6.2769 e-05 NaN ans = 2.6464e-04 octave:2> ans ans = 2.6464e-04
  • 系统参数总是字符串。如果你需要整数输入,你应该首先将它们解析为整数

标签: python octave oct2py


【解决方案1】:

八度码:

function result = test(problem,method)    
Methods={'MC','COS','RBF-AD','RBF-MLT'};    
if problem == 1    
    S=[90,100,110]; K=100; T=1.0; r=0.03; sig=0.15;    
    U=[2.758443856146076 7.485087593912603 14.702019669720769];    
    rootpath=pwd;    
    filepathsBSeuCallUI=getfilenames('./','BSeuCallUI_*.m');    
    par={S,K,T,r,sig};    
    [timeBSeuCallUI,relerrBSeuCallUI] = 
    executor(rootpath,filepathsBSeuCallUI,U,par)    

    tBSeuCallUI=NaN(numel(Methods),1); rBSeuCallUI=tBSeuCallUI;    
    for ii=1:numel(Methods)    
        for jj=1:numel(filepathsBSeuCallUI)    
            a=filepathsBSeuCallUI{jj}(3:3+numel(Methods{ii}));    
            b=[Methods{ii},'/'];    
            if strcmp(a,b)    
            tBSeuCallUI(ii)=timeBSeuCallUI(jj);    
            rBSeuCallUI(ii)=relerrBSeuCallUI(jj);    
        end    
    end    
end    

cd(rootpath);    
for el=1:numel(Methods)    
    if strcmp((Methods{el}),method)    
        result = tBSeuCallUI(el);  
    end
 end    
end    

Python 代码:

import sys    
import subprocess    
import oct2py    
import requests    

def benchop(problem,method):    
    oc = oct2py.Oct2Py()    
    res = oc.test(problem,method)    
    return res    

if __name__ == '__main__':    
    benchop(sys.argv[1],sys.argv[2]) 

八度音程代码中的问题,当检查问题时,它说问题== 1,但是 python 需要一个字符串,所以列表未定义警告没有结果值。将八度代码从问题 == 1 更改为问题 == "1" 可以解决问题。

【讨论】:

  • 有没有办法让我在不使用 oct2py 的情况下调用接受参数和输出值的函数?
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
相关资源
最近更新 更多