python调用matlab函数
Posted 克金森沐沐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的访问
- X= C(s)使用这种"()"形式的返回的是cell类
- X = C{s}使用这种"{}"形式的返回的是cell中的内容
- 其他的基本上与通常的数组.矩阵访问一样了
- A{1,1}(2,3:end)访问的是A中的第一个cell里面内容的第2行的第三个元素以后的所有元素
- A{1,3}.name访问的是A中的A{1,3}cell里面结构的name值
- 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’)。
以上是关于python调用matlab函数的主要内容,如果未能解决你的问题,请参考以下文章