MATLAB编写的读取.mat文件数据并画曲线图的gui程序

2023-05-16

matlab编写的读取sd卡数据的gui程序

界面截图:

在这里插入图片描述

打开文件界面:

在这里插入图片描述

导入数据后截图:

在这里插入图片描述
是不是高端大气上档次,不要急,慢慢往下看,后面更精彩,代码会贴出来的。

显示曲线图的同时显示各种数据表

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

其他额外功能:

两个或以上通道数据做算术运算,借助matlab强大的矩阵计算能力,几行代码搞定。

代码:

打开文件:

function opendata_1_Callback(hObject, eventdata, handles)
global datadata data_gtime
global pathname filename
[filename,pathname,filterindex]=uigetfile('*.mat','打开数据');
if(filterindex==1)
	location=strcat(pathname,filename);
	datadata=importdata(location);
	data_gtime=0:(length(datadata(:,1))-1);
	set(handles.gtime,'String',data_gtime(1));
	refresh_Callback(hObject, eventdata, handles);
	updatepic_Callback(hObject, eventdata, handles);
end
set(handles.set,'enable','on');

这几行代码读入的mat文件需要一定的格式,本篇只讲matlab程序。如果读者想要读取自己的mat文件,可以重写这段代码。

保存文件

function savedata_Callback(hObject, eventdata, handles)
global datadata
global pathname filename
[filename,pathname,filterindex]=uiputfile('*.mat','存储数据','数据.mat');
% msgbox(['You selected ', fullfile(pathname, filename)]);
if(filterindex==1)
	save([pathname,filename],'datadata');
end
set(handles.set,'enable','off');

因为我的程序设定要从sd卡读数据,当数据读到后sd卡可能再去采集数据,所以读入sd卡数据后需要保存下来。这里注意保存的数据格式和打开的数据格式原则上应当是一致的,以免给自己带来不必要的麻烦。

关于读取sd卡数据的问题,由于内容较多,考虑另写一篇单独介绍。写好后会把链接贴进来。

显示某一通道

以1通道为例,首先更改显示状态:

function Channel1_Callback(hObject, eventdata, handles)
global isdatashow
if(strcmp(get(handles.Channel1,'Check'),'on'))
	set(handles.Channel1,'Check','off')
	isdatashow(1)=0;
else
	set(handles.Channel1,'Check','on')
	isdatashow(1)=1;
end
updatepic_Callback(hObject, eventdata, handles);
%isdatashow(1)=1代表显示1通道,=0代表隐藏1通道。

然后在画图函数中判断是否需要显示:

% 画图
for i=1:ltable(1)  
    if (isdatashow(i))
        plot(handles.pic,data_gtime,datatable_data(i,:));
        hold on;
        grid on;

        if (ymax<max(datatable_data(i,picstart:picend)))
            ymax=max(datatable_data(i,picstart:picend));
        end
        if (ymin>min(datatable_data(i,picstart:picend)))
            ymin=min(datatable_data(i,picstart:picend));
        end
    end
end
%ymax和ymin代表当前显示的数据的上下限,用以确定画图界限。

显示3条场次指示竖线:

if (isempty(get(handles.pic,'Children'))~=1)
    set(get(handles.pic,'children'),'LineWidth',1.5);
    y=get(handles.pic,'Ylim');
    x=data_gtime(linenumt);
    plot(handles.pic,[x x],y,':m*');
    plot(handles.pic,[(x-10) (x-10)],y,':m*');
    plot(handles.pic,[(x+10) (x+10)],y,':m*');
end

键盘按键操作

function figure1_WindowKeyPressFcn(hObject, eventdata, handles)
global data_gtime
global linenumt xlength
%xlength代表显示区域长度,其大小变化表现在图像缩放。data_gtime是显示区域中间横坐标,其大小变化表现在图像平移。
if (isempty(get(handles.gtime,'String'))==0)%非空执行
    if (get(gcf,'CurrentCharacter')=='D')|(get(gcf,'CurrentCharacter')=='d') %d&D 
        temp=str2double(get(handles.gtime,'String'));
        if(temp<length(data_gtime)-20)
            set(handles.gtime,'String',temp+xlength/50);
        else
            set(handles.gtime,'String',temp);
        end
        updatepic_Callback(hObject, eventdata, handles);
    end
    if (get(gcf,'CurrentCharacter')=='A')|(get(gcf,'CurrentCharacter')=='a') %a&A
        temp=str2double(get(handles.gtime,'String'));
        if(temp>20)
            set(handles.gtime,'String',temp-xlength/50);
        else
            set(handles.gtime,'String',temp);
        end
        updatepic_Callback(hObject, eventdata, handles);
    end
    if (get(gcf,'CurrentCharacter')=='S')|(get(gcf,'CurrentCharacter')=='s')
        if ((linenumt+xlength+200)<length(data_gtime))
            xlength=xlength+200;
            updatepic_Callback(hObject, eventdata, handles);
        end
    end
    if (get(gcf,'CurrentCharacter')=='W')|(get(gcf,'CurrentCharacter')=='w')
        if ((xlength-200)>0)
            xlength=xlength-200;
            updatepic_Callback(hObject, eventdata, handles)
        end
    end
end

进行显示区域的缩放和平移。

最重要的函数updatepic_Callback

大家会发现上面所以函数执行完都会调用一个叫updatepic_Callback的函数,就是更新图像函数。做的更改需要刷新图像才能看到效果。

function updatepic_Callback(hObject, eventdata, handles)
global data_gtime datatable_data AD_data flag_data 
global linenumt timeselect xlength
global timeselect_last
global isdatashow isadshow
%%清除上一次图像
cla(handles.pic)
%% 时间值
if (isempty(get(handles.gtime,'String'))==0)%gtime非空执行
    timeselect=str2double(get(handles.gtime,'String'));%获得时间设定值
    if (timeselect>data_gtime(length(data_gtime)))||(timeselect<data_gtime(1))
        set(handles.gtime,'String',timeselect_last);
    else
        linenumt=find(data_gtime==timeselect);%寻找对应时间所在数组位置
    end
    if isempty(linenumt)==1
        set(handles.gtime,'String','');
    end
    if((length(data_gtime)-linenumt)<20)
        count=length(data_gtime)-linenumt;
    else
        count=20;
    end
    ltable = size(datatable_data);
    lAD = size(AD_data);
    lflag = size(flag_data);
%     if (ltable(1)~=0)
        set(handles.tabledata,'Data',datatable_data(:,linenumt:(linenumt+count-1)));
%     end
%     if(lAD(1)~=0)
        set(handles.tablead,'Data',AD_data(:,linenumt:(linenumt+count-1)));
%     end
%     if(lflag~=0)
        set(handles.tableflag,'Data',flag_data(:,linenumt:(linenumt+count-1)));
%     end
    %% 设置图x轴参数
    if (linenumt+xlength)>length(data_gtime)%图显10s的曲线
        picend=length(data_gtime);
    else
        picend=linenumt+xlength;
    end
    if (linenumt-xlength)<0
        picstart=1;
    else
        picstart=linenumt-xlength;
    end
    ymax=-1000000;ymin=1000000;
    
    % 画图
    for i=1:ltable(1)  %ltable(1)
        if (isdatashow(i))
            plot(handles.pic,data_gtime,datatable_data(i,:));
            hold on;
            grid on;

            if (ymax<max(datatable_data(i,picstart:picend)))
                ymax=max(datatable_data(i,picstart:picend));
            end
            if (ymin>min(datatable_data(i,picstart:picend)))
                ymin=min(datatable_data(i,picstart:picend));
            end
        end
    end
    
    for i=1:lAD(1) %lAD(1)
        if (isadshow(i))
            plot(handles.pic,data_gtime,AD_data(i,:),'lineStyle','-.');
            hold on;
            if ymax<max(AD_data(i,picstart:picend))
                ymax=max(AD_data(i,picstart:picend));
            end
            if ymin>min(AD_data(i,picstart:picend))
                ymin=min(AD_data(i,picstart:picend));
            end
        end
    end
    if(isempty(picstart))
        picstart=0;
    end
    if(isempty(picend))
        picend=length(data_gtime);
    end
    if(isempty(ymin))
        ymin=0;
    end
    if(isempty(ymax))
        ymax=5000;
    end
    if ymax==-1000000
        ymax=5000;
    end
    if ymin==1000000;
        ymin=0;
    end
    if(ymax==0&&ymin==0)
        ymax=100;
        ymin=-100;
    end
    
    set(handles.pic,'Xlim',[picstart,picend]);
    set(handles.pic,'Ylim',[ymin,ymax]);

    delete(findall(handles.pic,'LineStyle',':','Marker','*'));
    if (isempty(get(handles.pic,'Children'))~=1)
        set(get(handles.pic,'children'),'LineWidth',1.5);
        y=get(handles.pic,'Ylim');
        x=data_gtime(linenumt);
        plot(handles.pic,[x x],y,':m*');
        plot(handles.pic,[(x-10) (x-10)],y,':m*');
        plot(handles.pic,[(x+10) (x+10)],y,':m*');
    end
    timeselect_last=timeselect;
end
grid on;

几点说明

本篇提供的图片有很多关键地方被屏蔽了,是因为实验室规定如此,防止泄密。请读者谅解。

这样大篇粘代码的文章确实不是我想做的,这样做只是为了方便初学者。对于真正想学东西的,我的这点内容肯定不够,如果这篇文章成功指引你找到了解决问题的技术突破方案,那是我的荣幸。我的目的是授之以“渔”,而不是授之以“鱼”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB编写的读取.mat文件数据并画曲线图的gui程序 的相关文章

  • 二叉树的迭代遍历 前序 中序 后序 模板

    作为个人学习笔记 xff0c 原出处讲的很清楚 xff1a 代码随想录 非标记法 使用非标记法写的话 xff0c 中序的代码风格和前后序完全不同 中序 xff1a span class token keyword class span sp
  • (8)requests发起get/post请求

    一 基本概念 1 什么是接口 前后端数据传输的通道 2 http请求的接口 协议 43 域名 ip 43 接口地址 43 请求参数 3 http请求的要素 请求地址 43 请求方法 43 请求数据 二 request请求接口 1 安装 pi
  • 【面试必备】面向Android开发者的复习指南!最全的BAT大厂面试题整理

    近日一好友去阿里面试 xff0c 面试失败了 xff0c 分享了一个他最不擅长的算法面试题 题目是这样的 题目 xff1a 给定一个二叉搜索树 BST xff0c 找到树中第 K 小的节点 出题人 xff1a 阿里巴巴出题专家 xff1a
  • c memcpy 带重叠部分 实现

    主要是要注意当目标地址在源地址后面且存在重叠区域的时候 xff0c 需要从后往前复制 span class token macro property span class token directive hash span span cla
  • 主流PCB画图软件的对比区别(AD、Pads、Allegro)

    国内的EDA软件市场几乎被三家瓜分 xff0c 分别是Altium Mentor Pads Cadence xff0c 也是我们这次主要分析和比较的软件 本人用的多的是 Alitum 也用过allegro xff0c pads目前还没用过
  • 新书推荐 |《Prometheus监控实战》

    新书推荐 Prometheus监控实战 点击上图了解及购买 Docker公司前服务与支持副总裁 Kickstarter前首席技术官 Empatico首席技术官撰写 xff0c 全方位介绍继Kubernetes之后的第二个CNCF毕业项目 P
  • 腾讯大数据总体架构图,对外公开!

    导读 xff1a 腾讯作为国内体量最大的互联网公司之一 xff0c 业务涵盖用户日常生活的方方面面 xff0c 面对如此巨大业务数据量 xff0c 如果不能对数据进行专业化处理并高效有序地存 管 用 xff0c 如果不能使数据产生应有的价值
  • API安全实战

    一提起 信息安全 xff0c 不管是业内专家还是所谓的 吃瓜群众 xff0c 多半都会在脑海中浮现 网络安全 Web安全 软件安全 数据安全 等常见的词汇 市面上绝大多数安全类书籍也多集中在这几个领域 xff0c 而从API视角阐释信息安全
  • 【第115期】世界一流大学计算机专业,都在用哪些书当教材?

    导读 xff1a 转眼间离新学期开学又不远了 清华 北大 MIT CMU 斯坦福的学霸们在新学期里要学什么 xff1f 本文就带你盘点一下那些世界名校计算机专业采用的教材 不用多说 xff0c 每本都是经典的烧脑技术书 xff0c 建议配合
  • 什么是AB实验?能解决什么问题?终于有人讲明白了

    导读 xff1a 走向身边的AB实验 作者 xff1a 木羊同学 来源 xff1a 大数据DT xff08 ID xff1a hzdashuju xff09 AB实验 是一个从统计学中借来的工具 我和大家一样 xff0c 每次只要看到 统计
  • 树莓派3b引脚图

    如上图所示 xff0c 我们可以很清楚的看到各个引脚的功能 例如我们想使用pwm引脚来控制舵机 xff0c 则我们可以考虑使用其中的 BCM18 PWM0 和 BCM13 PWM1 在使用wiringPi库时 xff0c 我们定义的引脚即B
  • 跟踪slab分配堆栈流程的方法(perf、systemtap)

    跟踪slab分配堆栈流程的方法 xff08 perf systemtap xff09 内存泄露是在解决内核故障会遇到的棘手情况 xff0c 根据具体的内存使用情况 xff0c 追踪相应slab cache的分配堆栈流程 xff0c 是追踪泄
  • prometheus+grafana监控mysql、canal服务器

    一 prometheus配置 1 prometheus安装 1 1官网下载安装包 xff1a https prometheus io download 1 2解压安装包 xff1a tar zxvf prometheus 2 6 1 lin
  • mac配置jmeter

    一 步骤 1 安装jdk1 8版本 xff0c 因为jmeter是基于java环境运行的 2 安装jmeter5 x版本 二 安装jdk 1 下载jdk Java Downloads Oracle 2 下载好之后安装 xff0c 全部下一步
  • 操作系统(四):动态链接与静态链接的区别

    在回答这个问题之前希望大家大概了解一个文件编译的过程 xff0c 比如一个C文件在编译成功后文件夹里的文件会有什么变化 xff0c 大家可以先去创建一个helloworld c的文件 xff0c 观察其编译后的变化 那么问题来了 面试官经常
  • 【OpenVINS】(一)ZUPT

    参考 xff1a Measurement Update Derivations Zero Velocity Update 在典型的自主汽车场景中 xff0c 传感器系统将在停止灯处变得静止 xff0c 其中动态物体 xff08 例如交叉路口
  • OpenVINS与MSCKF_VIO RK4积分对比

    VIO系统在使用IMU测量值进行状态预测时 xff0c 需要将连续时间的微分方程离散化为差分方程 xff0c 离散化的本质是积分 xff0c 根据数值积分近似程度不同 xff0c 常用的有欧拉法 中点法和四阶龙格库塔法等 xff0c Ope
  • 全盘拷贝linux系统,转移至另一硬盘

    首先制作ubuntu启动盘 xff0c 选择try ubuntu进入live ubuntu系统 查看需拷贝硬盘盘符 span class token function sudo span span class token function
  • EKF SLAM

    EKF 方法是解决 SLAM 问题的一种经典方法 xff0c 其应用依赖于运动模型和观测模型的高斯噪声假设 在 SLAM 问题首次提出不久后 xff0c Smith 和 Cheesman 及 Durrant Whyte对机器人和路标间的几何
  • 如何将立创EDA中的元器件的原理图/封装和3D模型导入AD的库中

    如何将立创EDA中的元器件的原理图 封装和3D模型导入AD的库中 工具 xff1a AD 立创EDA专业版 fusion360 或其他3D软件 导入原理图 封装 在立创商城复制所需元器件的编号 打开立创EDA标准版或专业版 xff0c 这里

随机推荐

  • Xshell 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本“的解决方案

    要想解决Xshell提示更新最新版问题 有两种方案 方案一 手动修改系统时间 步骤如下 右键右下角时间 弹出如下窗口 2 选中 调整日期 时间 A 并点击 弹出如下页面 更改时间 更改成之前的年份 如下图 更改成功后 再打开相应的应用 Xs
  • 2020.2.22 排位赛 G - Bucket Brigade(BFS)

    Bucket Brigade 题面 题目分析 BFS模板题 代码 span class token macro property span class token directive keyword include span span cl
  • Canal入门(二)

    Canal入门 xff08 二 xff09 canal kafka quickStart 1 基本说明 canal 1 1 1版本之后 默认支持将canal server接收到的binlog数据直接投递到MQ 目前默认支持的MQ系统有 ka
  • PID调节三个参数的作用

    1 比例调节作用 xff1a 按比例反应系统的偏差 系统一旦出现了偏差 比例调节立即产生调节作用用以减少偏差 比例作用大 可 以加快调节 能迅速反应误差 xff0c 从而减小稳态误差 但是 xff0c 比例控制不能消除稳态误差 过大的比例
  • (centos7)docker+jenkins运行python自动化

    目录 一 实现思路 二 环境准备 1 在liunx上安装docker 2 docker安装jenkins 三 访问前设置 四 配置jenkins容器 五 jenkins插件安装 1 安装git 2 安装docker 3 html Publi
  • OJ在线编程常见输入输出练习

    OJ在线编程常见输入输出练习 4 a 43 b 4 输入描述 xff1a 输入数据包括多组 每组数据一行 每行的第一个整数为整数的个数n 1 lt 61 n lt 61 100 n为0的时候结束输入 接下来n个正整数 即需要求和的每个正整数
  • js中数组与集合的相互转化

    数组 gt 集合 var a 61 1 2 3 4 5 5 var set 61 new Set a console log set 1 2 3 4 5 集合 gt 数组 var set 61 new Set set add 1 set a
  • Linux make/Makefile详解

    会不会写makefile xff0c 从侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c makefile定义了一系列的 规则来指定 xff0c 哪些文件
  • 大疆H20系列吊舱,录制的视频含义

  • 写算法的方法

    写算法步骤 xff1a xff08 以下方法 xff0c 都是老生常谈 但是非常简单有用 xff09 数据结构 xff08 所有的算法都是基于数据结构的操作 所有算法都是针对数据结构的属性进行操作 列出所有的属性 xff0c 写算法逐项修改
  • Windows系统下QT+OpenCasCAD仿真开发

    背景 最近开发了一个六自由度机械臂调姿平台的控制软件 xff0c 集成了API激光跟踪仪和KUKA机器人 xff0c 实现了根据产品的测量位姿驱动仿真环境中模型并且实现模型间的碰撞检测 其中KUKA机器人的控制可以参考笔者以前的博客 xff
  • 飞控IMU姿态估计流程

    飞控中使用加速度计 xff0c 陀螺仪 xff0c 磁罗盘进行姿态估计算法流程 step1 xff1a 获取陀螺仪 xff0c 加速度计 xff0c 磁罗盘的原始数值 step2 xff1a 陀螺仪 xff0c 加速度计减去固定的偏移后得到
  • 图拓扑关系可视化的qt实现

    前言 最近在做数据可视化的相关工作 xff0c 包括曲线图 xff0c 航迹图 xff0c 图结构 xff0c 树结构等 其中树结构相关的工作笔者以前曾经做过 xff0c 可以参考笔者以前的博客 qt自定义树形控件之一和qt自定义树形控件之
  • 基于qwt3D 的3D航迹图的实现

    前言 使用qt实现三维空间直角坐标系中的航迹实时绘制网上很难查到资料 在qt下实现3D绘图通常实现方式有OpenGL VTK qwt3d QtDataVisualization等 Qcharts QCustomPlot只支持2D绘图 这里给
  • 树莓派4b连接RealSense T265

    使用的是树莓派4 8G版本 准备连接RealSense T265的双目相机 T265目前官方编译好的的只有Ubuntu16和18 其他的系统版本需要自己编译realsense驱动 安装ubuntu20 10 https ubuntu com
  • Dockerfile文件解释

    一 先来看一个简单的 Dockerfile 这个Dockerfile作用是打一个python3项目环境 FROM python 3 alpine WORKDIR app ADD app RUN pip3 install r requirem
  • 一文读懂BLOB算法

    算法执行效果 相关参考资料 看着玩的 BLOB算法简述 https blog csdn net icyrat article details 6594574 话说这老哥写的也太 简 了吧 完全口水话 把blob算法说的很神秘 说什么把blo
  • Sobel算法优化 AVX2与GPU

    国庆假期 一口气肝了10篇博客 基本上把最近的成果都做了遍总结 假期最后一天 以一个比较轻松的博客主题结束吧 这次是Sobel算法的AVX2优化 执行效果 sobel算法的原理 使用如下的卷积核 c 硬写 span class token
  • 随机Hough直线算法的改进

    背景介绍 随机Hough直线算法相比Hough直线算法 xff0c 算法效率会有提高 xff0c 但仍不能满足工程需求 因此提出使用生长的随机Hough直线算法 该算法对随机Hough直线算法进行改造 xff0c 在随机选点转到Hough空
  • MATLAB编写的读取.mat文件数据并画曲线图的gui程序

    matlab编写的读取sd卡数据的gui程序 界面截图 xff1a 打开文件界面 xff1a 导入数据后截图 xff1a 是不是高端大气上档次 xff0c 不要急 xff0c 慢慢往下看 xff0c 后面更精彩 xff0c 代码会贴出来的