python調用matlab函數


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')。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM