实验室项目展示用PyQt系列(3)如何调用MATLAB中的.m脚本文件

本科毕设被研导要求添加可视化界面展示结果功能以填补实验室的需求,同时需要做好来自MatLab与python的接口。由于实验室大量项目工作在演示时需要使用界面,常有同门前来问询,而此工作中有大量踩坑踩雷需要注意,空口说自然不如图文来的明白完整,故写此系列博客,以避免不必要的时间浪费。

文章并非专业的界面设计教程,唯一写作目的为帮助不希望透彻理解PyQt5的人能够制作界面以回应导师/领导等人的期待,满足教学/项目等需求,为避免误导,以入职软件公司为目的请勿借鉴本博客。

上一篇:实验室项目展示用PyQt系列(2)设计基本流程、Qt Designer使用、界面中添加图片等

实验室项目展示用PyQt系列(2)设计基本流程、Qt Designer使用、界面中添加图片等_修雷达的sb的博客-CSDN博客所需图片声明完成后,就可以进入下一步。从固件栏中拖出一个QLabel固件,将其自带的文字删除,在styleSheet栏中点击添加按钮,选择“...”按钮》image,选择所需的图片文件,即可将其添加进固件中。对.qrc文件右键,选择外部工具(External Tools),再选择PYRCC5,则会将所用到的图片编译为..._rc.py文件,在刚刚生成的界面.py中,需要将生成的_rc.py文件声明出来。固件的名称,可以在右边栏的对象查看器中进行定义,建议对每个固件定义,默认名称为类名称+编号,容易混淆。https://blog.csdn.net/pyc0551/article/details/131244379由于实验室众人所使用的编程语言软件不尽相同,有时候可能会出现常用Python的同学需要借用其它同学甚至前人的MATLAB代码的情况,此时为了避免浪费时间,能够直接进行复用,可以通过两种方法进行调用。方法一生成Python库文件进行调用,可扩展性较好,但受限于MATLAB版本,一旦生成此文件,不建议再更新MATLAB。方法二要求调用的.m脚本必须在.py文件同一目录下,脚本文件数量较多时,可能发生冲突。

方法一、MATLAB LIbrary Compiler生成Python库文件

1.库文件如何生成

打开MATLAB LIbrary Compiler插件。由于我们期望通过PyQt调用,因此在TYPE栏中选择Python Package,而我们所需要的函数主程序被写在了ompscatterforsar.m中,因此EXPORTED FUNCTIONS中仅需要选择ompscatterforsar.m这一个文件即可。

至于其他被主程序所调用的文件,则可根据情况加入Files required for your library to run这一栏中。需要注意的是,Samples这一栏中最好加入一个自己写的演示脚本,示范具体调用该软件的方法,以本人的工作为例,其样例代码如下。

close all;
clear all;
clc;
format long;
src = ompreadmat('DEG17_COL2_SCENE1_D7.mat');
[len,wid,or_axis,oa_axis,processedsig,oX,olinel,oxy,oxx2,oyy2,oxx2_o,oyy2_o] = ompscatterforsar('DEG17_COL2_SCENE1_D7.mat',10);
figure(1);
imagesc(abs(src));
xlabel('方位维'),ylabel('距离维');
set(gca,'YDir','normal');
title('原始信号图像');
%figure(2);
%imagesc(oa_axis,or_axis,abs(targsrc));
%set(gca,'YDir','normal');
%xlabel('方位/米');
%ylabel('距离/米');
%title('T72原始图像');
%hold on;
figure(3)      
imagesc(oa_axis,or_axis,abs(processedsig));
set(gca,'YDir','normal');
xlabel('方位/米');
ylabel('距离/米');
title('稀疏重构信号');
hold on;
figure(4);
plot(oX(:,1),oX(:,2),'.');   
axis([-15 15 -15 15]);
hold on;
plot(oxy,olinel,'y');
plot(oxx2,oyy2,'ro');
plot(oxx2_o,oyy2_o,'ro');
print(len);
print(wid);

添加完成之后,就可以进行编译了,点击右上角的绿色√(Package)等待其编译完成。

2.库文件如何进行安装

首先,需要在环境中安装matlab库。

conda install matlab

MATLAB COMPILER跳出的输出的文件夹中有如上三个文件夹,这里我们只用for_redistribution_files_only中的文件。具体方式如下。在ananconda激活虚拟环境后,进行如下操作。

cd 生成的库文件所在的文件夹\for_redistribution_files_only
python setup.py install

至此,MATLAB生成的库文件就已经完成了安装。

3.如何通过python进行调用

import ompscatterforsar#将生成的库调用

oss = ompscatterforsar.initialize()#初始化,将函数送入matlab runtime

src = self.oss.ompreadmat(str(self.fname), nargout=1)#读取数据

[len, wid, or_axis, oa_axis, processedsig, oX, olinel, oxy, oxx2, oyy2, oxx2_o, oyy2_o] = self.oss.ompscatterforsar(
            str(fname), nargout=12)#执行脚本

需要注意的是,第一二行必须运行,第三四行根据具体情况,可能只有一行,也可能有很多行。但是必须注意的是,nargout参数指的是matlab runtime返回的值的数量,必须指定为正确大小,否则将会报错。

考虑到MATLAB Runtime可能会由于重复调用某些模块导致其内核爆炸,建议在开始运行前,即初始化后增加一个对环境变量的更改,如下代码。

import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

博主本人在手贱更新MATLAB后,使用此种方法调用文件产生了报错。因此,不建议随意更新MATLAB。

方法二、matlab.engine

同样的,需要在Python环境中安装MATLAB engine库。

conda install matlab

再次提醒,该方法要求调用的.m脚本文件与当前.py文件在同一文件夹中。

在Python中调用,仅需以下几行代码

import matlab.engine

engine = matlab.engine.start_matlab()#初始化引擎

engine.tf_extract(A, B)
'''调用.m文件,这里的tf_extract就是我调用的文件tf_extract.m,A B为matlab中所定义的参数'''

运行上述程序之后,tf_extract.m文件即完成了一次运行。博主所用的.m文件无返回值,而是将生成的结果储存在当前目录中,因此后面的程序需要通过Python的API将其读取,以完成后续任务。该方法调用的参数输入与结果输出都完全遵循于.m文件中对函数的定义。倘若你的.m文件有返回值,则需一一对应的Python变量将其读取。

总结

需要注意的是,两种调用方法都是在Python与MATLAB引擎之间进行数据传递,效率偏低,方法的最大优点在于,不用重写MATLAB中的脚本成为Python程序,而是直接生成库文件再有Python调用,节省大量的程序开发时间。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值