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上实现。 ▶美国国家标…...
【数据库】《DBA实战手记》- 读书笔记
《DBA实战手记》基本介绍 作者:薛晓刚 等出版时间:2024年6月出版社:机械工业出版社ISBN:9787111757665 本书是一本指导DBA进行数据库开发和运维的实用手册,本书共9章,包括漫谈数据库、如何提升数据库性能…...

RustDesk 搭建自建服务器并设置服务自启动
目录 0. 介绍 1. 事前准备 1.1 有公网 ip 的云服务器一台 1.2 服务端部署包 1.3 客户端安装包 2. 部署 2.1 服务器环境准备 2.2 上传服务端部署包 2.3 运行 pm2 3. 客户端使用 3.1 安装 3.2 配置 3.2.1 解锁网络设置 3.2.2 ID / 中级服务器 3.3 启动效果 > …...

IBM DB2分布式数据库架构
一、什么是分布式数据库架构 分布式数据库架构是现代数据库系统的重要发展方向,特别适合处理大规模数据、高并发访问和高可用性需求的应用场景。下面我们从原理、架构模式、关键技术、实现方式和常见产品几个方面来系统讲 1、分布式数据库的基本概念与原理 1. 什…...
Spring 官方推荐构造函数注入
1. 依赖关系明确 构造函数注入可以清晰地声明类的依赖关系,所有必需的依赖项都通过构造函数参数传递,使得代码的可读性更高。这种方式让类的使用者能够直观地了解类的依赖,而不需要通过注解或反射来猜测。 2. 增强代码健壮性 构造函数注入…...

【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN
【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN 目录 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、…...

Vad-R1:通过从感知到认知的思维链进行视频异常推理
文章目录 速览摘要1 引言2 相关工作视频异常检测与数据集视频多模态大语言模型具备推理能力的多模态大语言模型 3 方法:Vad-R13.1 从感知到认知的思维链(Perception-to-Cognition Chain-of-Thought)3.2 数据集:Vad-Reasoning3.3 A…...
吴恩达:构建自动化评估并不需要大量投入,从一些简单快速的示例入手,然后逐步迭代!
吴恩达老师又来信了。 这次他分享了一个重要观点:构建自动化评估并不需要大量投入。从一些简单快速的示例入手,然后逐步迭代! 以下是我对原文的翻译: 亲爱的朋友们: 我注意到,许多生成式 AI 应用项目在系…...

RAG入门 - Retriever(1)
文章目录 环境准备知识库加载1. Retriever - embeddings 🗂️1.1 将文档拆分为chunks1.2 词嵌入1.3 构建向量数据库Nearest Neighbor search algorithm (最近邻搜索算法)Distances (距离)点积(Dot Product&…...

【irregular swap】An Examination of Fairness of AI Models for Deepfake Detection
文章目录 An Examination of Fairness of AI Models for Deepfake Detection背景points贡献深伪检测深伪检测审计评估检测器主要发现评估方法审计结果训练分布和方法偏差An Examination of Fairness of AI Models for Deepfake Detection 会议/期刊:IJCAI 2021 作者: 背景…...

kafka学习笔记(三、消费者Consumer使用教程——配置参数大全及性能调优)
本章主要介绍kafka consumer的配置参数及性能调优的点,其kafka的从零开始的安装到生产者,消费者的详解介绍、源码及分析及原理解析请到博主kafka专栏 。 1.消费者Consumer配置参数 配置参数默认值含义bootstrap.servers无(必填)…...