最近嘗試在 Matlab 環境中調用 Python 腳本,這裏總結下碰到的幾個問題。html
在 Matlab 函數中,想要將 Python 文件做爲模塊加載,須要首先修改 Python 環境變量路徑python
P = py.sys.path; if count(P,modpath) == 0 insert(P,int32(0),modpath); end
修改好路徑後,直接使用 import 命令加載 Python 模塊會產生錯誤,需採用如下命令ide
py.importlib.import_module('analytical_subcritical'); % 加載 python 模塊 analytical_subcritical
在調用 Python 模塊中函數時,需將 Matlab 環境中變量轉換爲 Python 類型的變量傳入函數中,部分類型變量能夠直接轉換,可參考 Matlab 官網—將數據傳遞給 Python。函數
在 Matlab 中經常使用的向量和矩陣轉換爲 1$\times$N 大小能夠直接做爲 array.array('d')
類型 Python 變量傳入,所以可將輸入數據大小轉換後直接傳入 Python 函數中進行計算。spa
在得到 Python 函數返回結果後,需將數據從新轉換爲 Matlab 類型變量。不一樣類型變量轉換能夠參考官網—處理從 Python 返回的數據。code
可是這些類型僅爲 Python 中部份內建變量類型,對於經常使用的 Numpy 庫返回的 ndarray
類型變量須要進一步轉化htm
value = Python ndarray with properties: T: [1×1 py.numpy.ndarray] base: [1×1 py.NoneType] ctypes: [1×1 py.numpy.core._internal._ctypes] data: [1×24 py.buffer] dtype: [1×1 py.numpy.dtype] flags: [1×1 py.numpy.flagsobj] flat: [1×1 py.numpy.flatiter] imag: [1×1 py.numpy.ndarray] itemsize: 8 nbytes: 24 ndim: 1 real: [1×1 py.numpy.ndarray] shape: [1×1 py.tuple] size: 3 strides: [1×1 py.tuple] [1 2 3]
對於此類型變量轉換過程,目前有兩種方法。ip
第一種方式是將 ndarray
變量轉換爲 Python 的 array.array
類型,隨後可利用 double 函數直接轉換爲 Matlab 變量。ci
data = double(py.array.array('d',py.numpy.nditer(value))); %d is for double, value is ndarray
第二種是利用 scipy 庫將變量儲存爲 mat 文件,隨後在 Matlab 中加載。get
import numpy as np import scipy.io x = np.linspace(0, 2 * np.pi, 100) y = np.cos(x) scipy.io.savemat('test.mat', dict(x=x, y=y))
相比第二種方法,第一種方法更爲直接。轉換爲 Matlab 變量後利用 reshape 修改向量大小便可。