Qt扩展-muParser数学公式解析
muParser数学公式解析
- 一、概述
- 1. 针对速度进行了优化
- 2. 支持的运算符
- 3. 支持的函数
- 4. 用户定义的常量
- 5. 用户定义的变量
- 6. 自定义值识别回调
- 7. 其他功能
- 二、内置函数
- 三、内置二元运算符
- 四、三元运算符
- 五、内置常量
- 六、源码引入
- 1. 源码文件
- 2. 编译器开关
- 1. MUP_BASETYPE
- 2.MUP_USE_OPENMP
- 3. MUP_STRING_TYPE
- 七、实例
一、概述
muparser - Fast Math Parser Library
项目地址:https://beltoforion.de/en/muparser/features.php#idStart
muparser是一个高性能的数学计算表达式库,支持常用的函数、常用运算符、数学计算式的计算,这个库也提供了很多内置的功能、同时也开放了很多功能供用户使用。这个库使用的 C++语言、也可以用C语言搭配用、跨平台的支持

1. 针对速度进行了优化
- 高解析性能;批量模式提供了表达式计算的并行化
- 具有延迟计算的 If-Then-Else运算符
- 在一次求值中计算多个逗号分隔子表达式:sin(X),x+y,x*x
2. 支持的运算符
- 14个预定义运算符
- 二元运算符是用户可定义的
- 后缀运算符是用户可定义的
- 中缀运算符是用户可定义的
3. 支持的函数
- 25个预定义函数
- 具有最多五个参数的固定数量
- 具有可变数量的参数
- 使用单个字符串参数(用于数据库查询)
- 可以由用户扩展
4. 用户定义的常量
- 数值常量
- 字符串常量
5. 用户定义的变量
- 在数量上无限
- 可在解析器运行时由解析器定义:abc=123
- 根据其他变量赋值变量是可能的
6. 自定义值识别回调
- 我们可以定义值的外观
- 我们可以让muparser读取十六进制值,如a=0x00ff00或二进制值
- A=0b1000101
- 我们还可以使用此功能从数据库中查询值
7. 其他功能
- 使用后缀运算符作为单位乘数(3M->0.003)
- 内置函数,用于对给定变量进行数值求导
- 参数分隔符、小数分隔符、千位分隔符可以根据我们的区域设置进行调整
- 基于CMake的构建系统
- ISO 14882:符合2017年标准的代码
- 每种语言都可以使用的DLL版本能够使用以C风格导出的函数
二、内置函数
下表概述了默认实现支持的函数,它列出了函数名称、参数数量和简短说明
| 名称 | 参数个数 | 解释 |
|---|---|---|
| sin | 1 | 正弦函数 |
| cos | 1 | 余弦函数 |
| tan | 1 | 切线函数 |
| asin | 1 | 反正弦函数 |
| acos | 1 | 反余弦函数 |
| atan | 1 | 圆弧正切函数 |
| sinh | 1 | 双曲正弦函数 |
| cosh | 1 | 双曲余弦 |
| tanh | 1 | 双曲正切函数 |
| asinh | 1 | 双曲弧正弦函数 |
| acosh | 1 | 双曲圆弧正切函数 |
| atanh | 1 | 双曲反正切函数 |
| log2 | 1 | 以2为底的对数 |
| log10 | 1 | 以10为底的对数 |
| log | 1 | 以e为底的对数为1(2.71828…) |
| ln | 1 | 以e为底的1个对数(2.71828…) |
| exp | 1 | e的x次方 |
| sqrt | 1 | 平方根 |
| sign | 1 | 如果x<0,则符号1符号函数-1;如果x>0,则为1,阶跃函数 |
| rint | 1 | 舍入为最接近的整数 |
| abs | 1 | 绝对值 |
| min | var. | 最小变量所有参数中的最小值 |
| max | var. | 所有参数的最大值 |
| sum | var. | 和变量所有参数的总和 |
| avg | var. | 平均变量所有参数的平均值 |
三、内置二元运算符
下表列出了解析器支持的默认二进制运算符
| 操作符 | 描述 | 优先级 |
|---|---|---|
| = | 分配* | 0 |
| || | 逻辑或 | 1 |
| && | 逻辑AND | 2 |
| | | 按位或 | 3 |
| & | 按位和 | 4 |
| <= | 小于或等于 | 5 |
| >= | 大于或等于 | 5 |
| != | 不等于 | 5 |
| == | 等于 | 5 |
| > | 大于 | 5 |
| < | 小于 | 5 |
| + | 加法 | 6 |
| - | 减去 | 6 |
| * | 乘法 | 7 |
| / | 除法 | 7 |
| ^ | 将x乘以y的幂,幂运算符 | 8 |
- *赋值运算符是特殊的,因为它更改了它的一个参数,并且只能应用于变量
四、三元运算符
Muparser内置了对If Then Else运算符的支持
它使用惰性求值,以确保只计算表达式的必要分支
| 操作符 | 描述 | 备注 |
|---|---|---|
| ?: | If Then Else运算符 | C++样式语法 |
五、内置常量
预定义常量名称的名称以下划线为前缀
解析器有两个预定义的常量:Pi和Eulers Number
常量定义的准确性最终取决于所选值类型(浮点型、双精度型、双精度长整型)的大小
| 常量 | 描述 | 备注 |
|---|---|---|
| _pi | 唯一的圆周率 | 3.141592653589793238462643 |
| _e | 欧拉数 | 2.718281828459045235360287 |
六、源码引入
1. 源码文件
官方建议将muparser直接嵌入到项目中将库源代码直接嵌入到客户端应用程序中是避免链接器冲突的最简单方法,这些冲突源于共享解析器库和项目使用的运行时库的不同版本
为了嵌入muparser,将以下文件包括到我们的项目中:
muParser.cpp
muParserBase.cpp
muParserBytecode.cpp
muParserCallback.cpp
muParserError.cpp
muParserTokenReader.cpp
并确保在我们的项目包含路径中可以找到以下包含文件:
muParser.h
muParserBase.h
muParserBytecode.h
muParserCallback.h
muParserDef.h
muParserError.h
muParserFixes.h
muParserTemplateMagic
muParserToken.h
muParserTokenReader.h
解析器类和所有相关类驻留在命名空间 mu 中,请确保添加一个 using
using namespace mu;
添加到我们的文件中,或使用其完整名称引用所有类
2. 编译器开关
如果我们通过编译自己的版本或直接包含源代码来使用muParser,则可以使用一组预处理器定义来定制其行为
以下定义位于文件muParserDef.h中:
1. MUP_BASETYPE
宏 MUP_BASETYPE 定义muParser使用的底层数据类型这可以是任何浮点值类型(浮点型、双精度型或双精度长整型)宏默认为双精度,如果我们需要更高的精度或希望将muParser Seamless与使用Float作为其数据类型的客户端代码一起使用,请修改此值
#define MUP_BASETYPE double
2.MUP_USE_OPENMP
如果我们使用的是CMake构建系统,则使用-DENABLE_OPENMP=OFF/ON选项激活OpenMP支持
该选项将为我们设置宏MUP_USE_OPENMP,并自动链接到OpenMP,启用OpenMP支持时,批量模式下的表达式求值将在多个CPU上并行执行默认情况下,使用CMake构建时,OpenMP支持处于活动状态
#define MUP_USE_OPENMP
如果不是使用CMake构建,并且已将源代码直接嵌入到项目中,请取消对文件muParserDef.h中宏的注释
根据硬件的不同,并行化可以显著提高解析器的速度(30%-400%)
启用并行化对简短表达式没有显著影响
3. MUP_STRING_TYPE
这个定义决定了muParser使用的字符串类型,它可以是 std::string,也可以是 std::wstring,这个定义不应该直接设置
如果存在预处理器MACRO_UNICODE,则将其定义为 std::wstring
#define MUP_STRING_TYPE std::wstring
七、实例
#include "muParser.h"double fVal;
try
{double result = 0;// 定义对象mu::Parser m_parser;// 定义可能需要的变量double x_value = 7.434, y_value = 4.5, result;paser.DefineVar(L"x", &x_value);paser.DefineVar(L"y", &y_value);// 设置数学表达式m_parser.SetExpr("4.54534*(5.43-0.689*_pi)^2");// 计算result = m_parser.Eval();// 设置数学表达式m_parser.SetExpr(L"x^y+5.654-534.432^y");// 计算result = m_parser.Eval();return result;
}
catch (Parser::exception_type &e)
{std::cout << e.GetMsg() << endl;
}
更多就需要去其官网查看说明、配合着源代码一起使用。
相关文章:
Qt扩展-muParser数学公式解析
muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_…...
【Matplotlib】figure方法之图形的保存
🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:matplotlib 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
数据库管理-第142期 DBA?DBA!(20240131)
数据库管理142期 2024-01-31 数据库管理-第142期 DBA?DBA!(20240131)正文总结 数据库管理-第142期 DBA?DBA!(20240131) 作者:胖头鱼的鱼缸(尹海文)…...
react 之 zustand
zustand可以说是redux的平替 官网地址:https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…...
leetcode-回文链表
234. 回文链表 在此对比的值,不是节点 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[ListNod…...
Pinia:一个Vue的状态管理库
Pinia的使用方法包括以下步骤: 安装Pinia:通过yarn或npm进行安装: yarn命令: yarn add pinianpm命令: npm install pinia创建根存储:在main.ts中引入Pinia插件,并创建一个根存储。这可以通过创建…...
2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救
说起宏编程可能大家并不陌生,但是这对于 Flutter 和 Dart 开发者来说它一直是一个「遗憾」,这个「遗憾」体现在编辑过程的代码修改支持上,其中最典型的莫过于 Dart 的 JSON 序列化。 举个例子,目前 Dart 语言的 JSON 序列化高度依…...
云计算概述(云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次)(二)
云计算概述(二) (云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次) 目录 零、00时光宝盒 一、云计算类型(以服务的内容或形态来分) 二、云计算的12种技术驱动力 三、云计算的关键技术 四、云计…...
物流平台架构设计与实践
随着电商行业的迅猛发展,物流行业也得到了极大的发展。从最初的传统物流到现在的智慧物流,物流技术和模式也在不断的更新与升级。物流平台作为连接电商和物流的重要媒介,其架构设计和实践显得尤为重要。 一、物流平台架构设计 1. 前端架构设…...
RedHat8.4安装邮件服务器
一、配置发件服务器 1.1 根据现场IP,配置主机名 vim /etc/hosts 192.168.8.120 mail.test.com 将主机名更改为邮件服务器域名mail.test.com 1.2 关闭防火墙,禁止开机启动 systemctl stop firewalld systemctl disable firewalld 1.3 关闭selinux v…...
Linux Shell系列--dirname 去除基本文件名
一、目的 上一篇中我们介绍了basename命令的使用,本篇我们介绍dirname命令,dirname 命令与 basename 互补,它负责删除路径中的基本文件名部分(包括扩展名),只保留目录部分。 二、介绍 dirname首先去除字符…...
池化技术的总结
文章目录 1.什么是池化技术2.池化技术的应用一、连接池二、线程池三、内存池 3.池化技术的总结 1.什么是池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 在系统开发过程中,我们经常会用到池化技术。通俗的讲&am…...
H5简约星空旋转引导页源码
H5简约星空旋转引导页源码 源码介绍:一款带有星空旋转背景特效的源码,带有四个按钮 下载地址: https://www.changyouzuhao.cn/11655.html...
前端学习之路(4) vue2和vue3的区别
一. 根节点不同 vue2中必须要有根标签vue3中可以没有根标签,会默认将多个根标签包裹在一个fragement虚拟标签中,有利于减少内存。 二. 组合式API和选项式API 在vue2中采用选项式API,将数据和函数集中起来处理,将功能点切割了当…...
网络原理-TCP/IP(5)
TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…...
Docker 常用命令详细介绍
Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 使用概率最高的命令…...
10G PON演进到50G PON
10G-PON是万兆无源光网络,光纤链路传输速率能够达到10Gbps。根据ZTE的报告称,截至2023年6月,全球10G PON出货量已超过3000万个PON端口,其中中国市场份额约占80%。 10G PON在中国市场的广泛部署,显着推进了10G PON产业链…...
智能指针——浅析
智能指针 本人不才,只能将智能指针介绍一下,无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时,通过栈帧回收进行内存释放,防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initializatio…...
JAVA后端上传图片至企微临时素材
1.使用场景 在使用企业微信API接口中,往往开发者需要使用自定义的资源,比如发送本地图片消息,设置通讯录自定义头像等。 为了实现同一资源文件,一次上传可以多次使用,这里提供了素材管理接口:以media_id来…...
MySQL-----初识
一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
