1. 程式人生 > >記錄python呼叫matlab編寫的程式中的問題

記錄python呼叫matlab編寫的程式中的問題

我是要給matlab程式,利用python 的 tkinter 包做一個介面化。

遇到的問題:
1,matlab 報錯:引用了已清除的變數 address
程式段:
function y = Test(address)
clc
clear
...
address1 = address
%read.xml
ecg = xmlread(address1);
...
end

經過查詢問題所在:是因為 clear 的問題。
將clear刪掉,放在end前面即可。

2,剛開始想通過在matlab建立一個.dll檔案,然後在Python端呼叫這個.dll檔案,但是
【指令碼M檔案 & 函式M檔案】
在查詢方法的過程中,發現 matlab在編寫程式的時候,有兩個M檔案:指令碼M檔案和函式M檔案。
在使用的過程中,兩個程式的最大區別就是 指令碼檔案沒有傳參和返回值。
函式M檔案,可以傳入引數,返回值。【用python呼叫程式,必須用函式M檔案】
由於開始老師給的檔案是:指令碼M檔案,故需要將指令碼檔案轉換為函式M檔案,然後才能在python端傳“本地地址”,然後在放在.m程式中,返回結果在python段進行其他操作。

【指令碼檔案轉換成函式檔案】
查找了很多資料,發現一種最簡單的方式就是
將指令碼M檔案的頭,加上 
function []=函式名(引數);
在尾部附加 
end ;

例如: Test.m (指令碼檔案)
a = input('please input number\n','s');
b = input('please input number\n','s');
sum = a+b;
disp(sum); %輸出

Test1.m (函式檔案)
function  y = sum(a,b)
c = a+b;
return c ; %直接在命令列 sum(2,3),結果就返回了。

3,【python連線matlab】
在2中提到了,用.dll。由於不太會,所以又發現了新的方法。
用matlab中提供的python引擎就行。
在 python 中的 import matlab.magine 然後在直接呼叫程式。
首先,安裝引擎。在cmd 命令下,
cd  "matlabroot\extern\engines\python"  [matlabroot是根據自己本地的地址找的]
執行 python setup.py install
【注意: 有的人會找不見這個檔案目錄,是因為matlab版本問題,我同學的2014b不可以,另外同學的2016b就可以了,但是最低版本不知道】【matlab 2016b 支援 python 3.5,python 3.6不可以,要用3.6以上要matlab更新】

然後把 .m檔案 放在 .py檔案可以執行的根目錄下,要不然會報錯。錯誤應該是【未找見引數或者函式】這個。
.py檔案:
import matlab  
import matlab.engine
 eng = matlab.engine.start_matlab()
 result = eng.Test1(2,3)    #呼叫matlba中的Test1.m 
print(result) 
就可以在編譯器看見最後的結果。

4,如果matlab程式不止一個檔案,就把檔案均放在 .py檔案所在的目錄下就行了。