Как вызвать октавную функцию из 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" решает проблему.

Другие вопросы по тегам