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

posted @ 2021-04-06 20:41  Jil-Menzerna  阅读(2383)  评论(1编辑  收藏  举报