多符号表达式的共同子表达式提取教程

生成的符号表达式,可能会存在过于冗长的问题,且多个符号表达式中,有可能存在相同的计算部分,如果不进行处理,计算过程中会导致某些算式计算多次,从而影响计算效率。

那么多个符号表达式生成函数时,如何将多个符号表达式中相同算子提取出来,以便实现计算效率的提升?

一种方案是:共同子表达式提取(Common Subexpression Elimination,CSE) ,即找到多个表达式中相同的子表达式,并将其提取出来。这可以通过建立一个表达式树或图的数据结构,然后检测重复的子树来实现。一旦发现相同的子表达式,你可以将其计算结果保存起来,而不是多次计算。这通常需要对表达式进行遍历和分析。

1. Python实现(推荐)

在Python中,可以利用sympy中的cse实现,案例如下:

from sympy import symbols, cse, expand# 定义符号变量
x, y, z = symbols('x y z')# 创建一些符号表达式
expr1 = x**2 + y**3 + x**z
expr2 = x**2 - y**2 + 5*x**z
expr1 = expand(expr1)
expr2 = expand(expr2)combined_expr = [expr1, expr2]# 进行共同子表达式提取
common_subexpr, simplified_expr = cse(combined_expr)# 打印提取出的共同子表达式
print("共同子表达式:", common_subexpr)# 打印简化后的表达式
print("简化后的表达式:", simplified_expr)"""
Output:
>> 共同子表达式: [(x0, x**2), (x1, x**z)]
>> 简化后的表达式: [x0 + x1 + y**3, x0 + 5*x1 - y**2]
"""

2. MATLAB实现

  • 法1:利用subexpr,优点:可读性强;缺点:不够简洁,原因是该函数一次只能提取1个变量,为此,可以考虑进行多次迭代提取,可参考MATLAB加速计算:符号表达式——子表达式法,代码传送门
    clear
    A=str2sym('[a b; c d]')
    [V,D]=eig(A)subexpr([V;D])
    

在这里插入图片描述

  • 法2:将符号表达式保存成.m文件,利用MATLAB Coder生成C,生成的C中会自动进行CSE处理。但可读性差

在 MATLAB 中,共同子表达式提取(Common Subexpression Elimination,CSE)通常由 MATLAB 编译器自动处理。MATLAB 的 JIT(Just-In-Time)编译器会尝试优化你的代码,包括检测和消除共同的子表达式以提高执行效率。


MATLAB 中 JIT 编译器的工作原理如下:

  • 解释执行和分析: 初始时,MATLAB 会解释执行你的代码,并进行一些分析以了解哪些表达式是重复计算的。

  • JIT 编译: 一旦 MATLAB 确定了可能的优化机会,它会对代码进行 JIT 编译。这时,MATLAB 将生成优化后的机器代码。

  • 执行优化后的代码: 在 JIT 编译之后,MATLAB 将执行优化后的代码,其中可能包括共同子表达式提取等优化。


    虽然 MATLAB 的 JIT 编译器会尝试进行一些优化,但并不保证在所有情况下都能实现最优的共同子表达式提取。在某些特殊情况下,你可能需要手动考虑一些优化策略,如使用局部变量来存储重复计算的结果。


    总的来说,MATLAB 通常会在后台自动处理共同子表达式提取,而无需显式的用户干预。如果你对具体的代码片段有疑虑,可以使用 MATLAB 的 Profiler 工具来分析代码性能,并查看是否存在潜在的优化机会。

参考链接:

  • https://docs.sympy.org/latest/modules/simplify/simplify.html#sympy.simplify.cse_main.cse
  • https://zhuanlan.zhihu.com/p/673052435

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/437936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

echarts坐标轴文字样式

https://echarts.apache.org/zh/option.html#xAxis.nameTextStyle xAxis. nameTextStyle、 yAxis: {type: value,// max: -0.15,name: 沉降累计值/mm,nameTextStyle: {padding: [0, 0, 0, 10],color: #93B8E2,fontSize: 12,fontFamily: Alibaba-PuHuiTi-R},splitLine: {show:…

如何将mp3转m4a?3种方法帮你轻松转换

如何将mp3转m4a?在日常生活中,将MP3转换为M4A格式可以带来很多便利。M4A是苹果设备常用的音频格式,转换后可以方便地在iPhone、iPad等设备上播放。此外,M4A的音质通常优于MP3,提供更清晰、更丰富的声音。通过使用音频转…

进京证12次不够用怎么办?(北京进京证探头分布,进京证365,进京365)外地车在京如何行驶——躲猫猫外地车在京地图导航

其实想要在北京驾驶外地牌照的车辆主要有两种方式,一种是办理进京证(六环内进京证一年只能办12次,一次有效期7天,所以大多数人是不够用的);另一种就是在非监控区域行驶,可以借助于一些摄像头定位工具,有效躲避摄像头&a…

VirtualBox:安装提示缺少python core和win32 api

最近升级了Ubuntu22.04,查了一下,VirtualBox的增强功能,居然用时5分钟。 5min 18ms vboxadd.service 据说升级VirtualBox的增强功能能解决这个问题,于是先升级VirtualBox,但是安装VirtualBox却报缺少python core及win3…

AHK学习,诡异的早起,舒畅地打篮球——2024 第4周总结

活神仙 引言颓 周六周日理清当前老问题新问题 总结当前之前的老问题 学习的AHKAHK历程AHK作用和适合人群 我帮别人解决的AHK例子我自用的AKH功能结尾 引言 今天才写周总结 是因为这两天有点颓 颓在哪里呢? 请听我细细说来 水文 技术有 AHK的,不想看可以…

前端性能优化——图片压缩和懒加载

图片压缩 使用第三方工具手动压缩图片使用Webpack工具在打包时自动压缩图片 这里主要介绍第二种方法。 (1)将小于某个大小的图片转化成 data URI 形式(Base64 格式),减少请求数量,但是体积变得更大 modu…

IDEA 构建开发环境

本博客主要讲解了如何创建一个Maven构建Java项目。(本文是创建一个用Maven构建项目的方式,所以需要对Maven有一定的了解) IDEA 构建开发环境 一、创建一个空工程二、构建一个普通的Maven模块 一、创建一个空工程 创建一个空的工程 * 设置整…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

进阶-宏观.总体(二)失业、利率,税收、物价、供给侧政策、汇率

32&#xff0e;经济的跷跷板之一&#xff1a;成长与失业 失业是任何一个社会都会发生的现象。从某个观点来说&#xff0c;一定程度内的失业是正常的&#xff0c;也应是社会中被允许发生的现象&#xff1b;它是社会中正常的新陈代谢&#xff0c;也可能是社会进步的必然。 分析四…

《HTML 简易速速上手小册》第6章:HTML 语义与结构(2024 最新版)

文章目录 6.1 语义化标签的重要性6.1.1 基础知识6.1.2 案例 1&#xff1a;使用 <article>, <section>, <aside>, <header>, 和 <footer>6.1.3 案例 2&#xff1a;构建带有嵌套语义化标签的新闻网站6.1.4 案例 3&#xff1a;创建一个带有 <mai…

力扣题目训练(3)

2024年1月27日力扣题目训练 2024年1月27日力扣题目训练290. 单词规律292. Nim 游戏303. 区域和检索 - 数组不可变91. 解码方法92. 反转链表 II41. 缺失的第一个正数 2024年1月27日力扣题目训练 2024年1月27日第三天编程训练&#xff0c;今天主要是进行一些题训练&#xff0c;包…