方法
假设要绘制一个曲面函数,自变量名x,y,因变量名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);
接下来要把数值矩阵X,Y分别代入符号对象x,y,以求得曲面函数在第三维度Z轴上的取值。此时有两种方法:
- 传统double(subs())方法。
Z = double(subs(surface_equ,{x,y},{X,Y}));
- 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 函数句柄中的x、y仅仅是函数形参,不是符号对象。除了名称之外,这两个函数形参和我们之前定义的符号x、y没有任何关系。
在大部分场景下,匿名函数和普通matlab函数使用方式一致(当然,仅仅是用起来差不多,内部机制不一定相同):
function z = mf(x, y)
z = -1./sqrt(x.^2+y.^2+0.1);
end
参考
matlabFunction:Convert symbolic expression to function handle or file - MATLAB matlabFunction