如何从python调用octave函数?
问题描述:
我有一个有这样的功能的problem.m文件:myfun(p,m)
。如何从python调用octave函数?
它做了一些计算并返回结果。为了测试这个函数的执行情况,我有一个如下所示的test.m文件。 myfun(myarg1,myarg2)
如果我运行此文件为: octave test.m
然后返回我正确的结果看起来像这样:0.38007
现在的问题是调用使用此功能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])
当我运行此代码:蟒蛇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])
在八度代码检查问题的时候因为这个问题,它说的问题== 1,但是Python是期待一个字符串,所以列表未定义的警告没有结果值。从问题== 1改变八度码到问题==“1”解决了这个问题。
您的Octave函数是否实际返回一个输出,还是仅仅将它打印到命令窗口?请参阅[mcve]。 – excaza
我的八度函数返回一个输出,如我可以看到在ANS倍频-CLI这样的:八度:1> mytest的 timeBSeuCallUI = 2.6464e-04 1.5133e + 00 的NaN relerrBSeuCallUI = 2.7459e -05 6.2769e-05 的NaN ANS = 2.6464e-04 八度:2> ANS ANS = 2.6464e-04 – STZ
系统参数总是字符串。如果你需要整数输入,你应该首先将它们解析为整数 –