如何有效解决AppDesigner中使用符号工具箱syms后打包发布成exe等可执行文件不兼容的问题?-LMLPHP 

前几天有个小伙伴,找我问了一个问题,他在AppDesigner中使用了syms符号变量,结果就出现上图所示的警告画面。看似已经打包完成,但是不难发现中间出现了警告符号。点击“日志文件”打开一看出现了如下的关键警告信息:警告: 在 "D:\Documents\Matlab\app2.mlapp" 中,根据 MATLAB Compiler 许可证,对 MATLAB Runtime 环境打包时不包含 "syms"。请从代码中删除文件或函数,或者使用 MATLAB 函数 "isdeployed" 确保函数不会在所部署的组件中被调用

那位伙伴讲他搜索了好久也没有找合适的解决方案,故来寻求咱的帮助。很显然这是因为MATLAB没有为符号工具箱提供独立的运行库,因此导致只要在AppDesigner中使用了符号工具箱在发布时就会出现以上警告。即便能成功打包成可执行文件,但计算过程只要运行到与符号工具箱相关内容的地方程序肯定是执行不下去的。那么问题来了,该如何解决以上的问题呢?

凡事换个角度便会豁然开朗,既然你不支持符号工具箱,那咱不用不就OK了嘛。是的,解决这个问题办法就是不用符号工具箱。那有的小伙伴立马就会问了,我的计算过程就是需要用到符号计算怎么办呢?

别急,MATLAB给大家提供一个很贴心的符号公式转matlab函数的一个小工具,它就是matlabFunction函数,通过它可轻松将任何符号公式转换成直接可执行调用的function。示例如下:


示例1:转换成匿名函数
syms x y
r   = sqrt(x^2 + y^2);
fun = matlabFunction(r)
fun =
  包含以下值的 function_handle:
    @(x,y)sqrt(x.^2+y.^2)

示例2:转换成直接可用的function
syms x y
r = sqrt(x^2 + y^2);
matlabFunction(r,'File','fun');
% 执行以上代码,会在当前目录下自动生成一个以fun命名的可调用函数,
% 函数内容如下:
function f = fun(x,y)
%FUN
%    F = FUN(X,Y)

%    This function was generated by the Symbolic Math Toolbox version 9.1.
%    20-Aug-2022 12:03:11

f = x.^3+y.^3;

当然上面只是简单的转换案例,实际应用可能要比这个复杂的得多,比如找咱得那个伙伴问题就是涉及到多参数、多变量、多情况下的符号矩阵计算,还涉及到多重积分。即便是这种问题,初遇时看似棘手,但只要一一拆解,化整为零,逐个击破,问题必然迎刃而解。

除了官方自带的符号公式转函数外,SiamakFile Exchange中分享一个名为sym2fun的小工具,同样可以实现上面的转换,感兴趣的伙伴可以去看看。

Tips:File Exchange是mathworks官方提供matlab源代码共享平台,是查找matlab源代码的不二去处。建议小伙伴如果有想要的matlab源代码,直接去File Exchange搜索

参考资料:

[1] mathworks.com/help/symbolic/matlabfunction.html

[2] mathworks.cn/matlabcentral/fileexchange/65186-sym2fun

封面图片:由 Mote Oo Education 在Pixabay上发布

10-26 08:20