• python调用matlab函数


    python调用matlab函数

    1、matlab中python外部接口(API)的安装

    第一次使用Matlab需要先安装一下python的API。
    路径为:...Matlab2019aexternenginespythonsetup.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')。

  • 相关阅读:
    Markdown入门
    JavaScript之bind,call,apply
    CentOS7中禁用IPV6
    How to install Shadow•socks in CentOS7
    How to install OpenBazaar Server in CentOS7
    array_map,array_walk的使用以及区别
    phpstudy 升级mysql 及MySQL服务等问题
    YII2 架构文章链接
    nginx 配置详解(新手必看)
    YII2常用笔记
  • 原文地址:https://www.cnblogs.com/zhubincheng/p/14623642.html
Copyright © 2020-2023  润新知