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

方法

假设要绘制一个曲面函数,自变量名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仅仅是函数形参不是符号对象。除了名称之外,这两个函数形参和我们之前定义的符号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

匿名函数:匿名函数- MATLAB & Simulink- MathWorks 中国

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值