背景

matlab的app designer是目前我见过的所有代码语言里,做app最方便的,GUI界面的设计和代码放在一起,无脑拖动控件进去,然后右键添加回调写功能,可以便捷切换界面视图改界面和切换代码视图改代码。

但是matlab的app文件(.mlapp后缀) 保存是二进制文件(实际是压缩包,见文章末尾的菜单),无法直接用ai来改代码,以及不方便使用git进行版本控制

虽然可以把.mlapp文件导出为.m,但是这种方式是不可逆的,官方没有提供把.m文件再转为.mlapp的功能,目前我把app导出为.m的用途主要有两种

  • 导出为.m纯文本文件,方便进行版本控制。
  • 导出为.m,让ai读取代码,进行修改。

但是让ai改导出后的m文件存在一个问题,由于m文件和mlapp不能互转,ai改完之后的代码,我只能一个个粘贴回mlapp里去,操作很麻烦。

此外,如果让ai从无到有,自己写一个app,虽然用grok、gemini 2.5pro可以把app的功能做的差不多,但是要微调界面,用编程的方式是很麻烦的,

所以我一直期待什么时候可以支持mlapp和m文件可以互转

今天突然看到有人早在2023年就写了m文件转为mlapp的代码,惊喜非常,快速测试了下,果然很好用

.m文件转为.mlapp的方法

项目地址:EricMagalhaesDelgado/m2mlapp: Conversion from .M to .MLAPP (Matlab files)

使用方式

1
mlappFullPath = m2mlapp(mFileFullPath, varargin);

参数:

  • mFileFullPath 必须是 标量文本 (char | string) ,包含 .M 文件的完整路径。

可选的名称-值对参数:

主要是给app添加一些metadata信息的

(参数名称,类型,和默认值)

  • Name scalar text (char | string) = ClassName
  • Author scalar text (char | string) = ''
  • Version scalar text (char | string) = '1.0'
  • Summary scalar text (char | string) = ''
  • Description scalar text (char | string) = 'App code generated by m2mlapp.'
  • Screenshot logical = true
  • OpenApp logical = true

注意事项:

  1. app中引用的图像(图标、uiimageuibutton)在执行 m2mlapp 函数期间必须位于 Matlab 搜索路径中。

  2. 在验证输入参数后,该函数将返回 .MLAPP 文件的名称;如果出现解析器错误,则返回一个空输出。

  3. 在 App Designer 环境中加载的类具有固定的结构,这限制了自定义, .m文件需要注意代码是否符合这个结构。在该结构中,第一部分是组件的声明(根据它们的堆叠顺序);然后是可编辑的部分(属性、方法和回调);最后是用于创建组件以及构建或删除应用的方法。

    这里需要特别注意,组件Properties声明和createComponents(app)声明的顺序需要一致,不然会报错。如果让ai写.m格式的app,需要注意加下提示词。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    >> m2mlapp('CalciumDeltaFCaculator.m');
    Error using tabular/join
    The key variable for the right table must contain all values in the key variable for the left table.

    Error in util.uiPropertiesParser (line 92)
    uiProperties = join(propNames, propCode);

    Error in m2mlapp (line 98)
    uiProperties = util.uiPropertiesParser(matlabCode, treeCode);

    也就是最开始定义的顺序

要和最后createComponent具体定义组件属性的顺序

示例:

.M >> .MLAPP

1
m2mlapp('CalciumDeltaFCaculator.m');

运行结果:

成功将grok给我写的计算钙信号ΔF/F的.m代码转为了mlapp格式

CalciumDeltaFCaculator.m

成功转换后的CalciumDeltaFCaculator.mlapp

.mlapp和.m支持互转后可以有哪些骚操作

过去mlapp文件导出的.m文件只能当成独立的副本,无法互转,而现在实现两个文件格式的相互转换后,就能有如下的工作流:

  1. 让ai从无到有写一个app出来,先让ai写出.m文件,再自己转为.mlapp,根据自己的喜好微调下界面,迅速完成一个app的制作
  2. 让ai完善现有的app:已有的mlapp先导出为m文件,让ai修改,之后再转回去,这样修改app代码速度大大加快
  3. 优化app开发体验:matlab app designer的函数跳转太难受了,跳转了就不能回去,非常讨厌这一点,现在就可以导出为m文件,用vscode查看代码和修改代码,有更好的编辑体验和ai辅助开发体验,之后需要改页面以及加回调,再转为mlapp

彩蛋:mlapp实际上是一个压缩包

mlapp本质上其实是压缩包

直接用7-zip打开文件,里面内容如下

matlab/document.xml文件的内容实际就是代码,理论上改document.xml就能修改代码了,但是我没改成功,可能还有其他文件涉及吧。