2017-10-16 102 views
-2

我有一個有這樣的功能的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不起作用。

+0

您的Octave函數是否實際返回一個輸出,還是僅僅將它打印到命令窗口?請參閱[mcve]。 – excaza

+0

我的八度函數返回一個輸出,如我可以看到在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

+0

系統參數總是字符串。如果你需要整數輸入,你應該首先將它們解析爲整數 –

回答

0

倍頻代碼:

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」解決了這個問題。