如何从python调用倍频程函数?
我有一个问题.m文件的函数如下:如何从python调用倍频程函数?,python,octave,oct2py,Python,Octave,Oct2py,我有一个问题.m文件的函数如下:myfun(p,m) 它进行一些计算并返回结果。为了测试这个函数的执行,我有一个test.m文件,看起来像这样。 myfun(myarg1、myarg2) 如果我以以下方式运行此文件: 倍频程测试.m 然后它返回正确的结果,如下所示:0.38007 现在,问题是在使用python调用这个函数myfun(p,m)时。我尝试使用python库:oct2py python代码如下所示: import sys import subprocess import oct2py
myfun(p,m)
它进行一些计算并返回结果。为了测试这个函数的执行,我有一个test.m文件,看起来像这样。myfun(myarg1、myarg2)
如果我以以下方式运行此文件:
倍频程测试.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不起作用 倍频程码:
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])
倍频程代码中的问题与检查问题时一样,它表示problem==1,但python需要一个字符串,因此list undefined警告没有结果值。将倍频程代码从problem==1更改为problem==“1”可以解决此问题 您的倍频程函数实际上是返回输出还是只是将其打印到命令窗口?请参阅。我的octave函数返回一个输出,因为我可以在octave cli中看到ans,如下所示:octave:1>mytest TimeBSeucalUI=2.6464e-04 1.5133e+00 NaN RelerBSeucalUI=2.7459e-05 6.2769e-05 NaN ans=2.6464e-04 octave:2>ans ans=2.6464e-04系统参数始终是字符串。如果您需要整数输入,您应该首先将它们解析为整数。有没有一种方法可以让我在不使用oct2py的情况下调用接受参数和输出值的函数?