matlab使用匿名函数代替符号函数进行计算但仍按照符号函数运行的问题及解决

文章讲述了在Matlab中使用符号函数时遇到的低效率问题,通过分析发现是由于变量类型从double变为sym导致的。解决方法包括避免使用vpa并用roundn函数,或者在使用vpa后强制转换回double类型。
摘要由CSDN通过智能技术生成
省流:输入变量类型为sym导致的,更改变量类型即可

正文:
在使用matlab的符号函数进行计算的过程中遇到了运行效率太低的问题,故欲将符号函数替换为匿名函数

创建匿名函数有两种方法
1.使用“@(变量名) 函数式”进行命名:

mat_fun = @(x,y) x^2+y^2

2.使用matlabFunction函数进行命名:

syms x y
fun = x^2+y^2
mat_fun = matlabFunction(fun)

作者使用第一种笨方法,对矩阵的每一项都定义一个匿名函数:
(这里不方便贴全部程序)

fun = @(a,b,c,d) ((sin(c)*(cos(a)*sin(a) - cos(a)*cos(b)*sin(a))*(cos(d) - 1))......

运行程序,在使用profile viewer观察程序运行情况后,发现matlab仍然在使用符号函数(sym)的计算规则,效率很低:

运行详情

在进行一番控制代码变量之后,发现与for循环有关,for循环的第一次执行效率很高,但第二次就急剧降低,两次相差数十倍:

利用tic/toc输出计算时间:
Elapsed time is 0.001477 seconds.
Elapsed time is 0.037273 seconds.

使用rand随机数替换每轮循环均进行迭代的变量,使其随机刷新,从而与循环无关,结果恢复正常:

利用tic/toc输出计算时间:
Elapsed time is 0.001566 seconds.
Elapsed time is 0.000526 seconds.

至此,发现程序效率低的问题是for循环中的变量引起的。

是不是因为程序中精度太高导致计算比较慢?
在使用vpa限制计算精度后发现计算时间基本没有变化,Pass。

还有什么原因?想不出来了,不如直接看看这个变量在循环内的变化:

v = vpa(v)
class(v)

v就是程序中循环的变量,第一行用来限制v的精度并输出v的值,第二行用来观察变量v的类型,这样就可以实现检测v在每次循环中的变化

程序输出:
v =
   -0.0377   -0.8852   -0.9133   -0.7962
ans =
    'double'

v =
   -0.0987   -0.2619   -0.3354   -0.6797
ans =
    'sym'

这下可算发现了,第一次循环后,变量v的类型从double变成了sym(代码中的vpa函数导致的),这使得在第二次循环中匿名函数被迫使用了符号函数的计算规则。

解决方法:
1.不使用vpa,使用roundn函数作为替代,roundn函数用法如下

x = roundn(x,-1) % 取x至小数点后一位

2.在每次使用vpa后,使用double函数将变量重设为double类型

x = double(x)

参考文献:
matlabFunction函数用法
使用tic或profile记录程序运行时间
roundn函数用法

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值