Как вызвать октавную функцию из python?
У меня есть файл problem.m, который имеет такую функцию: myfun(p,m)
,
Это делает некоторые вычисления и возвращает результат. Для проверки выполнения этой функции у меня есть файл test.m, который выглядит следующим образом.myfun(myarg1,myarg2)
Если я запускаю этот файл как: octave test.m
Затем он возвращает мне правильный результат, который выглядит следующим образом: 0.38007
Теперь проблема в том, что при вызове этой функции myfun(p,m) используется python. Я пытался использовать библиотеку 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 не работает.
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" решает проблему.