MATLAB APP开发的一些进阶技巧分享_matlab app设计-程序员宅基地

技术标签: matlab  矩阵  图像处理  有限单元法MATLAB程序设计  开发语言  

目录

前言

正文

1 主APP与子APP的并用

2 模态对话框的使用

3 操作提示的使用

4 利用中间文件传递信息

    4.1 相互关联的APP间的数据传递

    4.2 非“Plot函数”进行图形绘制

后记


前言

本文是专栏《有限单元法MATLAB程序设计》的“APP开发”部分,将从“主APP与子APP的并用”、“模态对话框的使用”、“操作提示的使用”及“利用中间文件传递信息”这四个部分来阐述笔者在个人APP开发过程中的技巧,及对“更友好的人机交互”的理解与应用。

本文的灵感李廉锟教授的《结构力学》中的“基于MATLAB GUI开发的平面刚架静力分析程序”,笔者在对已完成APP进行优化的过程中,参考了其“流程化建模”的思想与“子APP”的调用,进一步丰富了人机交互方式。

本专栏为笔者在进行与“力学”及“有限单元法”相关的MATLAB编程及APP开发时的思考,在练习的同时,笔者也形成了自己的MATLAB APP开发思路,即:
1.理论的学习与手算的实践
2.利用实时编辑器将“理论与手算”转化为编程语言
3.利用编程语言的优势完善程序(如编写通用函数、丰富结果可视化等)
4.利用MATLAB App Designer进行“UI设计”与“功能迁移”

图1 MATLAB APP开发思路

 欢迎各位就这方面问题交流讨论。

正文

1 主APP与子APP的并用

在进行APP编程时,当一个APP功能较为复杂,输入输出较多时,就可以考虑像“主函数”与“子函数”一样,将APP操作流程分类,只在主函数展示主要操作流程,使不同类别的主要流程的操作在子APP下完成,使得APP主界面更清晰整洁,并更容易展示操作逻辑,降低APP学习与使用成本。

以“杆系结构问题分析APP”为例:

该APP主界面仅保留“建模流程”及“可视化结果展示”两个部分,“建模流程中”每个步骤的输入都放在了子APP中去完成。

图2 MATLAB杆系结构APP主界面

图3 “定义单元”子APP 

图2为“MATLAB杆系结构APP”的主界面,其中“流程化建模”中的每一步骤都将在子APP力实现,如图3就是“定义单元”这一步骤在子APP中的实现。这个子APP通过“添加数据”这一按钮组件呼出模态对话框,使用户将信息输入,最终输入信息将展示在左侧列表组件中。这中始安县方式将极大的减轻主APP的显示压力,并使建模流程更加清晰。

2 模态对话框的使用

在MATLAB APP中,常用的数值输入方式有两种,一种是通过“输入框(数值)”组件完成输入,一种是利用“模态对话框”进行输入。从本质上来讲,“输入框(数值)”使简单的,固化在APP界面上的“模态对话框”,其具有使用方便、布局快捷的优势,但也蕴含着自定义性差、占用UI空间等缺陷。为此,合理利用“模态对话框”将极大的提高“人机交互性”。

以“杆系结构问题分析APP”为例:

图4 “施加载荷”子APP 

图5 “施加载荷”子APP 中的Input模态对话框

图4为“施加载荷”子APP的主界面,点击“添加数据”即可呼出如图5所示的“Input模态对话框”,该模态对话框再代码区对其进行了界面的定制,包含“输入提示信息”、“输入数据实例”等。这项“私人定制”功能比“输入框(数值)”将实现更好的交互性。

3 操作提示的使用

在MATLAB APP中,对于MATLAB内置的APP组件可以添加“操作提示信息”,如图6所示。该信息提示功能将给予用户输入格式、输入示例等信息,极大地降低用户的学习成本,对新手用户更加友好。

 图6 “施加载荷”子APP 中的“提示信息”

4 利用中间文件传递信息

再MATLAB APP地开发中,该如何简便地完成“多个相互关联的APP间的传递数据”,以及“非“Plot函数”进行图形绘制”(指地使在figure图窗中从零开始绘制图像)呢?针对第1个问题,B站UP主“我想当你的验证码”提供了一种很好的思路,其在两个相互关联的APP中插入“发射器”与“接收器”,即完成了二者间地信息传递。而对于第二个问题,笔者在网站上并没有找到答案。下面,笔者将介绍自己的实现思路——“利用中间文件传递信息”从而避开复杂的数据传递。

4.1 相互关联的APP间的数据传递

为实现子APP向主APP传递数据(如在子APP中输入数据,在主APP中调用该数据并绘图),需要将子APP中需要传递的数据写入某个中间文件中(如“txt”或“m”文件),然后再用主APP对该文件进行读取,从而实现两个相互关联的APP间的数据传递。

将子APP数据写入中间文件实例如下:

            %子APP数据写入中间文件
            fid =fopen('Data.m','a+');%命名计算结果文件
            for i=1:size(t4,1)
                C='JointLoad';
                for j=1:size(t4,2)
                    C=[C,',',num2str(t4(i,j))];
                end
                C=[C,'\n'];
                fprintf(fid,C);
            end
            fclose(fid);

生成的中间文件如下:

JointLoad,2,3,-10

4.2 非“Plot函数”进行图形绘制

在MATLAB APP开发中,在坐标轴组件中绘图的常用方法是利用plot函数完成,例如

plot(app.UIAxes,x,y);

即可完成在坐标轴组件“app.UIAxes”中进行图形绘制。

但若是图形比较复杂,如在figure中直接绘制这一情形,便无法使用plot在指定坐标区绘制命令。此时,我们可以先将绘制好的figure图窗保存(save函数)为中间文件,再用imread函数读取,并用imshow函数将其展示在坐标区。

保存过程如下:

                astr=strcat('Fig',num2str(i),'.jpg');
                saveas(gcf,astr)

读取过程如下:

        file1='Fig1.jpg';
        im1=imread(file1);
        imshow(im1,'parent',app.UIAxes2_W);

后记

本文是笔者在对丁星等人所著《MATLAB杆系结构分析》一书的学习与应用中所产生的感悟。笔者本想将作者的思路完全理清后,再将其改编为MATLAB APP,但后来觉得如果所有程序都要全部弄懂才能移植成为MATLAB APP岂不是十分麻烦?如何能在掌握大致思想的情况下就能将MATLAB程序移植为APP就成了我所解决的首要目标。最终,笔者通过“流程化建模”、“模态对话框的使用”完成了比原作者直接读取指定格式文件更容易输入(操作)的改进,并引入了提示信息,使用户使用起来更加友好。而“利用中间文件传递信息”这个思想更是解决了不同APP间数据传输不易,源程序因绘图步骤复杂而没有使用plot函数,导致APP无法输出可视化结果这两个关键性的问题。利用这套思路,即可基本实现MATLAB APP“有程序即可移植”的快速移植法。

当然,笔者并不会因为这种所谓的“投机取巧”式的快速移植法而放弃对原书的学习,而是会认真学习原书对于“矩阵拉伸、平移、旋转”等绘图技巧,以及“多点计算绘图”的思想。毕竟只有掌握这些核心技术,才能解决“从无到有”这个关键性问题,而将程序移植为APP,只是“从有到优”的转变。

最后感谢各位的耐心阅读,欢迎交流讨论。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_62236383/article/details/130663444

智能推荐

如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈_dump 直接打开看堆栈用什么工具windbg-程序员宅基地

文章浏览阅读9.6k次。如何根据程序崩溃时的DMP文件使用WinDbg查找调用堆栈 HOW TO: 查找问题的异常堆栈时出现的 UnhandledExceptionFilter 调用堆栈跟踪中http://support.microsoft.com/kb/313109/zh-cn察看本文应用于的产品 本页概要 使用 Windbg.exe 打_dump 直接打开看堆栈用什么工具windbg

学习小组结伴_第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同-程序员宅基地

文章浏览阅读1.2k次。题目内容:为了促进互帮互相,决定成立学习小组。小组结伴的规则是这样的:先将学号按升序排列,排在最前的一个人和排在最后的那个人结成同伴,排在第2个的与排在倒数第2个的结成同伴…依次类推,2个一组成同伴。输入格式:第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同学的学号,学号之间有一个空格,学号是无序输入的。如果输入的学生数是奇数,则输出提示信息:“odd number”输出格式:共n/2行,每行二个整数,表明结伴同学的学号,两个学_第一行是一个整数n,表明n个同学。(2<=n<=50,n为偶数) 。 第二行n个整数表明n个同

条件注解@Conditional_java 不存在才创建 @conditional-程序员宅基地

文章浏览阅读110次。如果没有havingValue,那么会采用prefix+name 或 prefix+value 的值,去和false比较,如果值等于false 那么失败, 如果不等于false 成功。定义:在spring框架中用于根据特定条件决定是否创建或者注册某个bean或配置的注解,他们可以根据运行时环境,配置属性,或其他条件来动态的控制bean的创建或者注册。在上述代码中,表示会去application文件中,读取前缀为:Spring.datasource下,名字为type的key的值,读取到之后,会跟。_java 不存在才创建 @conditional

PDF 参照流/交叉引用流对象(cross-reference stream)的解析方法_php无法解析压缩的交叉引用和对象流的pdf-程序员宅基地

文章浏览阅读3.8k次。采用交叉引用流对象有以下几点好处:1) 压缩后存储的信息更紧凑;2) 可以访问存储在对象流中的压缩对象,并允许以后加入新的参照选项类型。_php无法解析压缩的交叉引用和对象流的pdf

面试只会问八股?你应该好好思考怎样做一场面试_如果面试一直问八股-程序员宅基地

文章浏览阅读517次。八股文并不能很好地测试候选人水平,我们应该思考更有效的面试方法。_如果面试一直问八股

英特尔Realsense学习笔记番外篇一:QWindowsContext: OleInitialize() failed_qwindowscontext: oleinitialize() failed: "com erro-程序员宅基地

文章浏览阅读2k次。导入pyrealsense2以后,使用PyQt5,会有以下警告:QWindowsContext: OleInitialize() failed: "COM error 0xffffffff80010106 RPC_E_CHANGED_MODE (Unknown error 0x080010106)"此警告在使用过程中没有影响程序的正常执行,如果不需要看到waring可以导入warnings库过滤warning。参考文献:1.WindowsContext:OleInitialize()失_qwindowscontext: oleinitialize() failed: "com error 0xffffffff80010106 rpc_e

随便推点

技术译文 | How Can ScaleFlux Handle MySQL Workload?-程序员宅基地

文章浏览阅读217次。本文是一篇译文,介绍 Percona 的工程师对 ScaleFlux 的性能压测报告翻译:杨奇龙原文地址:https://www.percona.com/blog/2020/08/06/how-can-scaleflux-handle-mysql-workload/最近作者有一个针对 ScaleFlux 的产品也叫做 CSD 2000 进行压测的机会. 本文中作者将介绍使用 Intel SSD 和 ScaleFlux 存储设备进行压测的对比结果。一 我们为什么需要不一样的 ScaleFlux?._scaleflux

electron vue vite 配置安装_wincodesign-2.5.0-程序员宅基地

文章浏览阅读460次。electon 打包安装_wincodesign-2.5.0

华为nova7可以用鸿蒙,华为鸿蒙系统再次更新7款可适配机型!对比安卓,鸿蒙OS的优势有哪些?...-程序员宅基地

文章浏览阅读6.2k次。原标题:华为鸿蒙系统再次更新7款可适配机型!对比安卓,鸿蒙OS的优势有哪些?自从鸿蒙OS系统全面启动公测以来,不断的在更新更多适配机型,就在前不久华为鸿蒙官网又新增了不少的机型,除了之前的Mate系列和P系列外,这次更新的机型有:华为nova6、nova65G、nova75G、nova7Pro5G、nova8、nova8Pro、MatePad10.8英寸。这些机型都可以体验鸿蒙OS 2.0公测版。..._nova7最好用的系统版本

Python-opencv之目标定位_python cv用于定位-程序员宅基地

文章浏览阅读1.5w次,点赞14次,收藏87次。最近团队准备参加一个无人机比赛,大致的规则是这样的:固定翼飞机从跑道起飞,然后在空中转体360°,通过GPS粗定位飞行至一个高13米左右,宽6米左右八字形框前(距离约50米左右),这时依靠计算机视觉的方法,让飞机准确的穿过去。(之后还有其他的动作,但是第一步大体就是这样)。 初步的方案:①通过机载摄像机获取图像序列 ②选取关键帧进行处_python cv用于定位

高速缓冲存储器cache介绍_c6713的第一级程序高速缓冲和第一级数据高速缓冲容量都是8kb,第一级存储器/高速缓冲的容量为32-程序员宅基地

文章浏览阅读8.4k次。cache介绍一、 Cache- 主存存储结构及其实现 为了解决存储器系统的容量、存取速度及单位成本之间的矛盾,可以采用 Cache- 主存存储结构,即在主存和 CPU 之间设置高速缓冲存储器 Cache ,把正在执行的指令代码单元附近的一部分指令代码或数据从主存装入 Cache 中,供 CPU 在一段时间内使用,由于存储器访问的局部性,在一定容量 Cache 的条件下,我_c6713的第一级程序高速缓冲和第一级数据高速缓冲容量都是8kb,第一级存储器/高速缓冲的容量为32kb。

C语言资料文章目录合集-程序员宅基地

文章浏览阅读512次,点赞12次,收藏8次。C语言资料文章目录合集

推荐文章

热门文章

相关标签