Python 高效率传参调用 MATLAB 程序

news2024/10/1 21:31:13

Background

  • python调用matlab脚本需要注意前置条件,具体参考官方文档:从 Python 中调用 MATLAB,大致就是两点:一是需要python和matlab版本对应,二是需要matlab运行环境mcr。具体安装配置可以参考:java和python调用matlab程序详细记录
  • 调用方式分两种吧:一是使用matlab engine,二是把matlab程序打成python包。第二种在传递参数上效率高点,所以这里只介绍第二种。
  • 测试用例:一个基于bp神经网络开发的损伤预测matlab程序,输入一组数据,输出一个损伤值,输入多组就会输出多个。我们首先把程序改写,输入是读mat输入文件,输出也是一个mat文件。在python中,接收到参数写入到mat输入文件中,然后调用matlab程序,最后从mat输出文件中获取结果就行了。

1、mat文件

  • mat数据格式是Matlab的数据存储的标准格式。在Matlab中主要使用load()函数导入一个mat文件,使用save()函数保存一个mat文件。
  • load,save函数具体用法请参考官方文档:load函数用法,save函数用法

在这里插入图片描述

2、scipy

  • Scipy 是基于 Numpy 的科学计算库,提供了许多的操作numpy的数组的函数。
  • scipy.io包提供了多种功能来解决不同格式的文件的输入和输出。
  • 在python中可以使用scipy.io中的函数loadmat()读取mat文件,函数savemat保存文件。

3、测试用例matlab源码

  • 下载地址:https://pan.baidu.com/s/13VX1nm6Qj9TdWowLnnj_lw,提取码:king
  • 注意:输入文件必须写全路径,打包的时候这个文件是不存在的,后面python调用前会先生成这个文件放到指定位置。
function predict_damage()
%{
params:截面高度,截面宽度,腹板厚度,翼缘厚度,钢材屈服强度,柱高,轴压比,温度,柱中竖向位移
res:返回损伤值
注意:输入参数按顺序逗号分隔;输出一个数据
%}

clear;
% 关闭告警
warning('off')

%% 输入数据-转置归一化
% 输入文件
load C:\Users\ssyc\sim_input.mat sim_input;
input_params=sim_input';
lines=size(sim_input, 1);
load predict.mat predict;
predict_p=zeros(9, 2398);
fmt_sim_input=zeros(9, lines);
for i=1:9
    predict_p(i,:)=predict(:,i)';
end
for i=1:9
  fmt_sim_input(i,:)=(input_params(i,:)-min(predict_p(i,:)))/(max(predict_p(i,:))-min(predict_p(i,:)));
end

%% BP神经网络
% 创建网络
threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1];
net=newff(threshold,[9,1],{'logsig','logsig'},'trainlm');
% 设置训练参数
net.IW{1,1}=struct2array(load('IW.mat'));
net.LW{2,1}=struct2array(load('LW.mat'));
net.b=struct2array(load('b.mat'));
% 损伤预测
sim_output=sim(net,fmt_sim_input);

%% 保存预测结果到mat文件中
save('sim_output', 'sim_output')

end

4、matlab源码打python包

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 在当前目录进入shell后执行安装命令
python3 setup.py install
  • 然后就可以在python代码中引用这个方法了

5、python中调用方式

from scipy.io import savemat, loadmat
from numpy import array
from com.wlf import predict_damage


def ssyc():
    """损伤预测"""
    matlab_func = predict_damage.initialize()
    matlab_func.predict_damage(nargout=0)
    matlab_func.terminate()


def main():
    """主函数"""
    # 这里测试给了三组数据,每组数据9个
    sp = [
        [0.1500, 0.1500, 0.0070, 0.0100, 235.0000, 3.0000, 0.5000, 225.0000, 2.9403],
        [0.175, 0.175, 0.0075, 0.011, 235, 3.3, 0.2, 400, 7.9905],
        [0.3, 0.3, 0.01, 0.015, 390, 3, 0.1, 100, 1.1919]
    ]
    file_input, file_output = 'sim_input.mat', 'sim_output.mat'
    data_input = {'sim_input': array(sp)}
    savemat(file_input, data_input)
    ssyc()
    data_output = loadmat(file_output)
    sim_output = data_output['sim_output'][0]
    print(list(sim_output))


if __name__ == '__main__':
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128087.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Filebeat和AWS CloudWatch Logs将EC2上的Tomcat的access_log传送到ELK

文章目录背景和方案选择前提注册AWS账号创建EC2实例注意事项在EC2实例上安装aws-cloudwatch-agent注意事项测试aws-cloudwatch-agent是否可用使用Docker Compose部署ELK使用Docker Compose部署Filebeat配置文件说明docker-compose.yml说明filebeat配置文件说明input配置AWS Clo…

华为智能基座实验【计算机组成原理】

华为智能基座实验【计算机组成原理】前言推荐华为智能基座实验【计算机组成原理】1 课程介绍1.1 简介1.2 内容描述1.3 读者知识背景1.4 实验环境说明2 实验 1:hello-world 示例程序2.1 实验介绍2.1.1 关于本实验2.1.2 教学目标2.1.3 实验内容介绍2.2 实验任务操作指…

宝宝多大戒尿不湿?不看年龄看表现,用对方法轻松戒掉尿不湿

宝宝刚出生的时候,大小便次数比较多,宝宝自己也控制不了。这时,使用尿布可以减少父母的大量工作。但使用尿布只是暂时的。当宝宝到了一定年龄,就应该戒掉。宝宝能戒尿多大?既然尿布是用来兜宝宝大小便的,如…

从零学习 InfiniBand-network架构(十一) —— 管理器的介绍

从零学习 InfiniBand-network架构(十一) —— 管理器的介绍 🔈声明: 😃博主主页:王_嘻嘻的CSDN主页 🔑未经作者允许,禁止转载 🚩本专题部分内容源于《InfiniBand-network…

作为QA,我们要如何思考?

随着测试人员陆续开始尝试角色转变,坚守的QA需要找到自己的发展之路。兴趣和性格是客观因素,好奇心和发散性思维则是帮助成为优秀QA的必要因素。我想通过一些小的例子来与大家互动探讨。 测试你做对了吗? 让我们从这样一个现实中的小例子来…

【历史上的今天】12 月 30 日:C++ 之父诞生;Hotmail 创始人出生;Facebook 注册破百万

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2022 年 12 月 30 日,在 1930 年的这一天,“青蒿素之母”屠呦呦出生。2015 年 10 月 5 日,屠呦呦获得诺贝尔生理学或医学奖&#xf…

【Java基础知识】对Object类wait()和notify()方法的理解

wait()/notify()原理 当前线程必须拥有此对象的monitor监视器(锁)。(不获取锁直接用Object对象调用wait和notify,会报错java.lang.IllegalMonitorStateException)当前线程调用wait() 方法,线程就会释放此锁的所有权&a…

动态库和静态库

文章目录感性认识库动态库和静态库从库的设计者来看库制作静态库制作动态库库的使用者的角度静态库的使用使用动态库1.把头文件和库文件拷贝到系统的路径下2.修改对应的环境变量更改文件 ld.so.conf.d在系统的库路径下建立对应的软链接动态库如何加载感性认识库 首先&#xff…

关于GNSS关键性能测试,应该如何选择?

现在,GPS/GNSS信号无处不在,而GNSS接收机芯片的低成本和高性能也让在不同设备中安装GNSS接收机变得更为容易。然而,与此同时又存在一个问题,如果想将这些接收器芯片集成到一个设备或系统中,该如何对其进行全面的GNSS测…

方法注解@Bean与对象注入

1.类注解是添加到某个类上的,⽽⽅法注解是放到某个⽅法上的,如以下代码的实现: 注:方法注解一定要搭配类注解使用,否则会报错 2.重命名Bean 多个重命名,使用多个名称获取的对象都是同一个 3.获取 Bean 对象…

全网惟一面向软件测试人员的Python基础教程-在Python中列表是什么?

全网惟一面向软件测试人员的Python基础教程 起点:《python软件测试实战宝典》介绍 第一章 为什么软件测试人员要学习Python 第二章 学Python之前要搞懂的道理 第三章 你知道Python代码是怎样运行的吗? 第四章 Python数据类型中有那些故事呢?…

TTL(RGB)接口液晶显示屏的调试方法

TTL接口的液晶显示屏一般会使用DE模式驱动它。首先需要CPU带有LCD控制器,能够产生出液晶显示屏所需要的以下几个信号: 1.时钟信号(DOTCLK) 2.行同步信号(HSYNC) 3.场同步信号(VSYNC) 4.DEN(数据允许信号) 6.数据信号(R0-R7;G0-G7;B0-B7)…

第02讲:Git分支操作

一、什么是分支 在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独 分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时 候,不会影响主线分支的运行。对于…

剑指 Offer 17. 打印从1到最大的n位数

题目 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 思路 本题应该考虑的是大数问题,但是返回数组为int[]。。。所以两种方法都做一下 方法一:普通解法&#xff…

天翼云服务器性能评测,4H8G贵阳节点性能跑分

天翼云号称全球运营商云第一、中国公有云用户数第二、政务云公有云第一。那么天翼云服务器用起来到底怎么样呢? 目前,蓝队云这边一共有19个天翼云节点云服务器,覆盖全国多个核心省市及地区,节点选择的话一般就是按照就近原则。 …

权威报告出炉:2022年移动机器人出货量增长53%!2023年移动机器人迎来发展新拐点?

原创/文 BFT机器人 近日,全球权威研究机构Interact Analysis重磅发布移动机器人领域的“风向标”——《2022年移动机器人市场报告》(The Mobile Robot Market 2022),深入探究真实市场数据,对全球移动机器人领域的发展现…

当压力传感器遇到汽车电子系统 智芯传感打造车规级智能感知传感器产品

汽车电子系统是汽车数字化的发端和基础,更是汽车智能化的前提。近年来,伴随着汽车电子技术的快速发展与应用,汽车电子系统在车辆控制精度、范围、适应性和智能化等方面,都实现了大幅优化提升。而压力传感器作为汽车电子系统的主要…

RHCSA 第五天笔记

用户和组管理 用户分为三类: 超级用户 root 普通用户 只能切换到自己有的用户 系统用户(不常用,没办法登录) 组分为两类 定义概念 基本组(私有组) 没指定所属组,系统建立和用户同名的组 附加…

诺依文件上传支持阿里云oss

文章目录描述后端引入依赖application.yml 添加访问oss需要的参数编写oss工具类编写controller前端更改调用接口![在这里插入图片描述](https://img-blog.csdnimg.cn/efc28eb8244e4da482d46327ab29a999.png)去掉baseUrl回调成功后url改成真实urlmain.js中挂在该组件具体调用代码…

华为手表开发:GT3(1)配置调试设备

华为手表开发:GT3(1)配置调试设备初环境与设备获取手表UUID登录 AppGallery Connect 点击用户与访问初 希望能写一些简单的教程和案例分享给需要的人 环境与设备 系统:window 设备:HUAWEI WATCH 3 Pro 开发工具&…