matlab符号代入subs运算慢加速——使用matlabFunction函数

matlab符号代入subs运算慢加速——使用matlabFunction函数_第1张图片

方法

假设要绘制一个曲面函数,自变量名xy,因变量名surface_equ,均为符号表达式。

syms x y
surface_equ = -1./sqrt(x.^2+y.^2+0.1);
axis_range = [-2:0.01:2];
[X,Y] = meshgrid(axis_range, axis_range);

接下来要把数值矩阵XY分别代入符号变量xy,以求得曲面函数在第三维度Z轴上的取值。此时有两种方法:

  1. 传统double(subs())方法。
    Z = double(subs(surface_equ,{x,y},{X,Y}));
  2. matlabFunction()方法。
    mf = matlabFunction(surface_equ);
    Z = mf(X,Y);

在我的七代i5,matlabR2019b上,第一种方法耗时53.646743秒,第二种0.003489秒,相差15000倍。每个元素的结果误差在1e-15数量级。

原理

matlabFunction可以将符号表达式转换为matlab匿名函数,并为该匿名函数生成一个函数句柄。通过以下两种方法定义的 mf 完全等价

syms x y
z = -1./sqrt(x.^2+y.^2+0.1);
mf = matlabFunction(z);
mf = @(x,y) -1./sqrt(x.^2+y.^2+0.1);

在转换后,mf 函数句柄中的xy仅仅是函数形参,不再是符号变量。 

在大部分场景下,匿名函数和普通matlab函数使用方式一致(当然,仅仅是用起来差不多,内部机制不一定相同):

function z = mf(x, y)
    z = -1./sqrt(x.^2+y.^2+0.1);
end

参考 

matlabFunction:https://www.mathworks.com/help/symbolic/matlabfunction.html

匿名函数:https://ww2.mathworks.cn/help/matlab/matlab_prog/anonymous-functions.html

你可能感兴趣的:(matlab)