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上实现。 ▶美国国家标…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...