python與matlab混編
用於 Python 的 MATLAB 引擎 API 快速入門
安裝用於 Python 的 MATLAB 引擎 API
Matlab的官方文件中介紹了 Matlab 與其餘程式語言之間的引擎介面,其中包括對於 Python 開放的引擎 API,可參考官方教程,其中包括引擎安裝,基本使用,以及Python與Matlab之間的資料型別轉換及互動。
-
在 Windows 系統中:(可能需要管理員許可權執行)
cd "matlabrootexternenginespython" python setup.py install
-
在 Mac 或 Linux 系統中:
cd "matlabroot/extern/engines/python" python setup.py install
基礎用法
下面介紹陣列的基本使用,其基本使用方法與 numpy 類似,但是 reshape()
函式略有不同,
import matlab
int_8 = matlab.int8([1, 2, 3, 4, 5, 6])
print(int_8) # [[1, 2, 3, 4, 5, 6]]
print(int_8.size) # (1, 6)
int_8.reshape((2, 3)) # reshape function is different from numpy
print(int_8) # [[1, 3, 5], [2, 4, 6]]
double = matlab.double([[1, 2, 3], [4, 5, 6]])
print(double) # [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
print(double[0]) # [1.0, 2.0, 3.0]
print(double[1][2]) # 6.0
對於陣列的切片,Matlab 的 array 與 Python 的 list 也有所不同,官網給出的解釋在於,Matlab 陣列切片返回的是一個檢視,而不是像 Python 中返回一個淺拷貝。
# Slice array
py = [[1, 2, 3], [4, 5, 6]]
mt = matlab.int32([[1, 2, 3], [4, 5, 6]])
py[0] = py[0][::-1]
mt[0] = mt[0][::-1]
# Slicing a Matlab array returns a view instead of a shallow copy
print(py) # [[3, 2, 1], [4, 5, 6]]
print(mt) # [[3, 2, 3], [4, 5, 6]]
Python的擴充套件介面 中介紹:
Python 還可以通過引擎完成對 Matlab 的一些基本操作與控制。以下程式碼需要在終端執行:
import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.sqrt(4.)) # 2.0
eng.plot(matlab.int32([1, 2, 3, 4]), matlab.int32([1, 2, 3, 4]))
eng.eval("hold on", nargout=0)
eng.eval("plot([4, 3, 2, 1], [1, 2, 3, 4])", nargout=0)
eng.eval("x = 3", nargout=0)
eng.eval("y = 41", nargout=0)
eng.eval("z = [213, 123]", nargout=0)
print(eng.workspace)
print(eng.workspace[`x`], eng.workspace[`z`])
"""
Name Size Bytes Class Attributes
x 1x1 8 double
y 1x1 8 double
z 1x2 16 double
3.0 [[213.0,123.0]]
"""
input("Press Enter to exit.")
eng.quit()
Python-Matlab呼叫(call) m 檔案
定義入口函式 callentry
,接收兩個引數,隨後對兩個引數分別在內部進行加和乘操作,再呼叫外部另一個 m
檔案的 callsub
函式進行相減操作,將返回的結果儲存在陣列r中返回。
-
callentry.m
程式碼:
function [x, y, z] = callentry(a, b);
x = add(a, b)
y = mul(a, b)
z = callsub(a, b)
end
function l = mul(m, n);
l=m*n;
end
function l = add(m, n);
l=m+n;
end
-
callsub.m
程式碼
function r = callsub(a, b);
r = a-b;
end
在 Python 中,執行如下程式碼
import matlab.engine
eng = matlab.engine.start_matlab()
print(eng.callentry(7.7, 2.1, nargout=3))
eng.quit()
Note: 值得注意的是,此處需要設定 nargout
引數,當未設定時預設為 1
,即預設只返回 1
個引數,當知道 Matlab 返回引數的數量時,通過nargout
進行設定來獲取所有需要的引數。無引數返回時請設為 0
。
在第一次執行生成例項時會較慢,因為需要啟動 Matlab 引擎,最終得到輸出如下,可以看到,Matlab 的 console 介面顯示的結果在 Python 中也會輸出,最後得到的結果是列表形式的 Python 資料。
x =
9.8000
y =
16.1700
z =
5.6000
r =
9.8000 16.1700 5.6000
(9.8, 16.17, 5.6)
MATLAB 中 呼叫 Python
只要正確安裝對應的 matlab 和 python,一般就可以使用了(不需要手動設定路徑)。
matlab 官方教程:從 MATLAB 呼叫 Python
matlab 把所有引數輸出到一個檔案裡,然後用 system
命令調 python 指令碼。python 指令碼讀檔案做計算結果再寫檔案。最後 matlab 再讀檔案得到結果。假設 python 指令碼的用法是:
python xxx.py in.txt out.txt
則 matlab 呼叫的命令:
[status, cmdout] = system(`python xxx.py in.txt out.txt`)
Matlab 的 system
函式用來向作業系統傳送一條指令,並得到控制檯的輸出,可以直接將控制檯的輸出在 Command Window 列印出來,或者儲存在變數中。 與 system
類似的還有 dos
函式和 unix
函式,我覺得它們都是對 system
函式的一種包裝,而 Matlab 的 system
函式也許是對 C 的庫函式system
的包裝。
先編寫一個呼叫 Python 指令碼的 matlab 程式即 python.m
function [result status] = python(varargin)
% call python
%命令字串
cmdString=`python`;
for i = 1:nargin
thisArg = varargin{i};
if isempty(thisArg) | ~ischar(thisArg)
error([`All input arguments must be valid strings.`]);
elseif exist(thisArg)==2
%這是一個在Matlab路徑中的可用的檔案
if isempty(dir(thisArg))
%得到完整路徑
thisArg = which(thisArg);
end
elseif i==1
% 第一個引數是Python檔案 - 必須是一個可用的檔案
error([`Unable to find Python file: `, thisArg]);
end
% 如果thisArg中有空格,就用雙引號把它括起來
if any(thisArg == ` `)
thisArg = [`"``"`, thisArg, `"`];
end
% 將thisArg加在cmdString後面
cmdString = [cmdString, ` `, thisArg]
end
%傳送命令
[status,result]=system(cmdString);
end
就可以用這個函式呼叫 python 指令碼了。 下面就來個呼叫 python 指令碼 matlab_readlines.py
(儲存在 matlab 當前目錄)的例子:
import sys
def readLines(fname):
try:
f=open(fname,`r`)
li=f.read().splitlines()
cell=`{`+repr(li)[1:-1]+`}`
f.close()
print cell
except IOError:
print "Can`t open file "+fname
if `__main__`==__name__:
if len(sys.argv)<2:
print `No file specified.`
sys.exit()
else:
readLines(sys.argv[1])
這個指令碼用來讀取一個文字檔案,並生成 Matlab 風格的 cell 陣列的定義字串,每個單元為文字的一行。 放了一個測試用的文字檔案 test.txt
在Matlab 的 Current Directory 中,內容如下:
This is test.txt
It can help you test python.m
and matlab_readlines.py
測試:
在 Matlab 的 Command Window 中輸入:
str = python(`matlab_readlines.py`,`test.txt`);
eval([`c = ` str])
celldisp(c)
探尋有趣之事!
相關文章
- C++和MATLAB混編的問題集錦C++Matlab
- QML::qml與c++混編C++
- 混編ObjectiveC++ObjectC++
- OC與C++ 混編的檔案互動C++
- OC和Swift混編Swift
- ubuntu16.04下MATLAB和C++混編(基於ROS,不含VS類別的編譯器)UbuntuMatlabC++ROS編譯
- iOS 富文字的應用(圖片與文字混編)iOS
- 與Python多核多執行緒併發,混編有關的一次歷程Python執行緒
- OC和Swift混編經驗Swift
- iOS UMeng OC和Swift混編iOSSwift
- Objective-C和Swift混編ObjectSwift
- OC與Swift混編專案遷移到Swift4.2小記Swift
- python與編碼Python
- [混編] iOS原生專案- 接入FlutteriOSFlutter
- spring boot kotlin java 混編Spring BootKotlinJava
- Swift中橋接標頭檔案建立(Swift 與 OC 的混編)Swift橋接
- 京東App Swift 混編及元件化落地APPSwift元件化
- python呼叫matlabPythonMatlab
- matlab呼叫pythonMatlabPython
- MATLAB VS PYTHONMatlabPython
- Matlab、Julia與Python之間的對比 | Toby DriscollMatlabPython
- iOS Native混編Flutter互動實踐iOSFlutter
- 雲音樂 Swift 混編 Module 化實踐Swift
- iOS混編 模組化、元件化、經驗指北iOS元件化
- Windows下編譯Caffe並編譯Matlab介面Windows編譯Matlab
- vlfeat重編譯以及visual studio與matlab聯調編譯Matlab
- EditView+SpannableString+ImageSpan實現圖文混編View
- iOS-OC、Swift混編之橋接檔案iOSSwift橋接
- QT creator 中c和c++混編問題QTC++
- Python字元與位元組新編Python字元
- python程式碼混淆與編譯Python編譯
- MATLAB程式設計與應用系列-關於MATLAB程式設計入門教程的總體編寫安排Matlab程式設計
- 影像壓縮編碼碼matlab實現——行程編碼Matlab行程
- 影像壓縮編碼碼matlab實現——DM編碼Matlab
- 使用Pyenv拯救Ubuntu混亂的Python版本UbuntuPython
- Matlab & C++ 混合程式設計mex檔案的編寫與除錯MatlabC++程式設計除錯
- 深入小程式系列(三) ReactNative和小程式混編React
- 深入小程式系列之二、Flutter 和小程式混編Flutter