python調用matlab函數
1、matlab中python外部接口(API)的安裝
第一次使用Matlab需要先安裝一下python的API。
路徑為:...\Matlab2019a\extern\engines\python\setup.py
需注意matlab版本與其所支持的python版本,如 Matlab2018b支持python 3.4 3.5 3.6,2019a支持到3.7
安裝如下三步:
1、激活需要安裝matlab模塊的環境
2、切換到matlab該文件路徑下路徑
3、調用python setup.py install,進行安裝
2、matlab.egine模塊
使用python調用matlab函數(function):
例子:想使用python調用matlab函數,且函數內嵌套了matlab的CVX包,用於解凸優化問題。
新建一個python腳本:test.py
import matlab.egine
def CVX_Matlab(h,t):
eng = matlab.engine.start_matlab() # 啟動matlab,此時可以調用matlab內置函數
a = eng.CVX_Matlab(h,t)
print(a)
if __name__ == '__main__':
h = [2.1062e-7, 1.8093e-7,1.502e-7]
t = 6.5
CVX_Matlab(h,t)
在matlab中,編寫好你需要使用的函數 CVX.m
function [optValue, Slist] = CVX_Matlab(g,t)
% g的類型為'cell' g=[{2.1062e-7}, {1.8093e-7},{1.502e-7}] % g為python以列表形式傳入的信道增益
Slist = [];
T = [];
optValue = [];
t = t/1000; % NOMA通訊時間 ms級別,換算成s
n = 3; % 邊緣服務器個數
S = 15e3; % 總任務量
y = [10e6, 15e6,20e6]; % 邊緣服務器計算速率
W = 8e6; % 帶寬
uL = 1e6; % 本地計算速率
P = 5; % 本地NOMA發送功率
n0 = 1e-12; % 高斯白噪聲功率譜密度
cvx_begin
cvx_precision best
variable Sm(n)
minimize(max([(S-(Sm(1)+Sm(2)+Sm(3))*S) / uL,t/1 + Sm(1)*S/y(1),t + Sm(2)*S/y(2),t + Sm(3)*S/y(3)] ))
subject to
Sm(1)+Sm(2)+Sm(3) <= 1
Sm(1) >= 0
Sm(2) >= 0
Sm(3) >= 0
SUM = (1/g{1})*power(2,(1/t)*(1/W)*(Sm(1)+Sm(2)+Sm(3))*S)+(1/g{2}-1/g{1})*power(2,(1/t)*(1/W)*(Sm(2)+Sm(3))*S)+(1/g{3}-1/g{2})*power(2,(1/t)*(1/W)*(Sm(3))*S)
P >= W*n0*SUM -W*n0/g{3}
cvx_end
A = (S-(Sm(1)+Sm(2)+Sm(3))*S) / uL;
B = t/1 + Sm(1)*S/y(1);
C = t + Sm(2)*S/y(2);
D = t + Sm(3)*S/y(3);
Slist = [Slist,Sm];
T = [T,t];
optValue = [optValue,cvx_optval*1000]
3、從Python傳遞數值到Matlab
Python 類型到 MATLAB 標量類型的映射
Python 容器到 MATLAB 數組類型的映射
其中元胞數組(cell類型),需使用 {} 進行索引訪問。
cell的操作
-
cell的創建:
1.跟一般創建矩陣一樣,直接使用C = {A B D E}這種形式,不過這里把"[]"改成了"{}"
2.使用cell創建cell,C= {C1 C2}, 是1×2 cell 數組
使用C3 = [C1 C2],是使用C1和C2的內容來創建
3.使用cell函數,A=cell(2,2),創建一個空的2x2的cell矩陣.
-
cell的訪問
1.X= C(s)使用這種"()"形式的返回的是cell類
2.X = C{s}使用這種"{}"形式的返回的是cell中的內容
3.其他的基本上與通常的數組.矩陣訪問一樣了
4.A{1,1}(2,3:end)訪問的是A中的第一個cell里面內容的第2行的第三個元素以后的所有元素
5.A{1,3}.name訪問的是A中的A{1,3}cell里面結構的name值
6.cell的圖形化顯示使用命令cellplot(A)即可如B={[1;2]},這就定義了一個cell型的變量B,里面保存的是一個矩陣[1;2],要引用里面的數據只要在大括號里寫上對應的下標即可,如B{1}。
下面我們給B再加個元素,我們可以這樣定義B(2)={'hello'}。也可以利用引用的方法定義B{2}='hello'。第二種方法比第一種方法更方便所以更常用。
這樣B就有兩個元素了,B(1)是{[1;2]},B(2)是{'hello'},每個元素都是cell型的(注意和B{1}、B{2}的區別,B{1}是[1;2],B{2}是'hello')。