当前位置: 首页 > news >正文

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风格导出的函数

二、内置函数

下表概述了默认实现支持的函数,它列出了函数名称、参数数量和简短说明

名称参数个数解释
sin1正弦函数
cos1余弦函数
tan1切线函数
asin1反正弦函数
acos1反余弦函数
atan1圆弧正切函数
sinh1双曲正弦函数
cosh1双曲余弦
tanh1双曲正切函数
asinh1双曲弧正弦函数
acosh1双曲圆弧正切函数
atanh1双曲反正切函数
log21以2为底的对数
log101以10为底的对数
log1以e为底的对数为1(2.71828…)
ln1以e为底的1个对数(2.71828…)
exp1e的x次方
sqrt1平方根
sign1如果x<0,则符号1符号函数-1;如果x>0,则为1,阶跃函数
rint1舍入为最接近的整数
abs1绝对值
minvar.最小变量所有参数中的最小值
maxvar.所有参数的最大值
sumvar.和变量所有参数的总和
avgvar.平均变量所有参数的平均值

三、内置二元运算符

下表列出了解析器支持的默认二进制运算符

操作符描述优先级
=分配*0
||逻辑或1
&&逻辑AND2
|按位或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方法之图形的保存

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…...

数据库管理-第142期 DBA?DBA!(20240131)

数据库管理142期 2024-01-31 数据库管理-第142期 DBA&#xff1f;DBA&#xff01;&#xff08;20240131&#xff09;正文总结 数据库管理-第142期 DBA&#xff1f;DBA&#xff01;&#xff08;20240131&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文&#xff09…...

react 之 zustand

zustand可以说是redux的平替 官网地址&#xff1a;https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…...

leetcode-回文链表

234. 回文链表 在此对比的值&#xff0c;不是节点 # 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的使用方法包括以下步骤&#xff1a; 安装Pinia&#xff1a;通过yarn或npm进行安装&#xff1a; yarn命令&#xff1a; yarn add pinianpm命令&#xff1a; npm install pinia创建根存储&#xff1a;在main.ts中引入Pinia插件&#xff0c;并创建一个根存储。这可以通过创建…...

2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救

说起宏编程可能大家并不陌生&#xff0c;但是这对于 Flutter 和 Dart 开发者来说它一直是一个「遗憾」&#xff0c;这个「遗憾」体现在编辑过程的代码修改支持上&#xff0c;其中最典型的莫过于 Dart 的 JSON 序列化。 举个例子&#xff0c;目前 Dart 语言的 JSON 序列化高度依…...

云计算概述(云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次)(二)

云计算概述&#xff08;二&#xff09; &#xff08;云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次&#xff09; 目录 零、00时光宝盒 一、云计算类型&#xff08;以服务的内容或形态来分) 二、云计算的12种技术驱动力 三、云计算的关键技术 四、云计…...

物流平台架构设计与实践

随着电商行业的迅猛发展&#xff0c;物流行业也得到了极大的发展。从最初的传统物流到现在的智慧物流&#xff0c;物流技术和模式也在不断的更新与升级。物流平台作为连接电商和物流的重要媒介&#xff0c;其架构设计和实践显得尤为重要。 一、物流平台架构设计 1. 前端架构设…...

RedHat8.4安装邮件服务器

一、配置发件服务器 1.1 根据现场IP&#xff0c;配置主机名 vim /etc/hosts 192.168.8.120 mail.test.com 将主机名更改为邮件服务器域名mail.test.com 1.2 关闭防火墙&#xff0c;禁止开机启动 systemctl stop firewalld systemctl disable firewalld 1.3 关闭selinux v…...

Linux Shell系列--dirname 去除基本文件名

一、目的 上一篇中我们介绍了basename命令的使用&#xff0c;本篇我们介绍dirname命令&#xff0c;dirname 命令与 basename 互补&#xff0c;它负责删除路径中的基本文件名部分&#xff08;包括扩展名&#xff09;&#xff0c;只保留目录部分。 二、介绍 dirname首先去除字符…...

池化技术的总结

文章目录 1.什么是池化技术2.池化技术的应用一、连接池二、线程池三、内存池 3.池化技术的总结 1.什么是池化技术 池化技术指的是提前准备一些资源&#xff0c;在需要时可以重复使用这些预先准备的资源。 在系统开发过程中&#xff0c;我们经常会用到池化技术。通俗的讲&am…...

H5简约星空旋转引导页源码

H5简约星空旋转引导页源码 源码介绍&#xff1a;一款带有星空旋转背景特效的源码&#xff0c;带有四个按钮 下载地址&#xff1a; https://www.changyouzuhao.cn/11655.html...

前端学习之路(4) vue2和vue3的区别

一. 根节点不同 vue2中必须要有根标签vue3中可以没有根标签&#xff0c;会默认将多个根标签包裹在一个fragement虚拟标签中&#xff0c;有利于减少内存。 二. 组合式API和选项式API 在vue2中采用选项式API&#xff0c;将数据和函数集中起来处理&#xff0c;将功能点切割了当…...

网络原理-TCP/IP(5)

TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…...

Docker 常用命令详细介绍

Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用以及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不会有任何接口。Docker 使用概率最高的命令…...

10G PON演进到50G PON

10G-PON是万兆无源光网络&#xff0c;光纤链路传输速率能够达到10Gbps。根据ZTE的报告称&#xff0c;截至2023年6月&#xff0c;全球10G PON出货量已超过3000万个PON端口&#xff0c;其中中国市场份额约占80%。 10G PON在中国市场的广泛部署&#xff0c;显着推进了10G PON产业链…...

智能指针——浅析

智能指针 本人不才&#xff0c;只能将智能指针介绍一下&#xff0c;无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时&#xff0c;通过栈帧回收进行内存释放&#xff0c;防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initializatio…...

JAVA后端上传图片至企微临时素材

1.使用场景 在使用企业微信API接口中&#xff0c;往往开发者需要使用自定义的资源&#xff0c;比如发送本地图片消息&#xff0c;设置通讯录自定义头像等。 为了实现同一资源文件&#xff0c;一次上传可以多次使用&#xff0c;这里提供了素材管理接口&#xff1a;以media_id来…...

MySQL-----初识

一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…...

Linux内核中的cgroups技术详解

Linux内核中的cgroups技术详解 引言 cgroups&#xff08;Control Groups&#xff09;是Linux内核中用于限制、记录和隔离进程组资源使用的机制。它为容器技术、资源管理和服务质量保证提供了基础。cgroups允许管理员精细地控制系统资源的分配&#xff0c;确保关键任务获得足够的…...

10块钱的PY32F00x单片机,用Keil和HAL库点灯保姆级教程(附资源包下载)

10元级PY32F00x单片机开发实战&#xff1a;从零点亮LED的完整指南 在电子爱好者和嵌入式开发者的世界里&#xff0c;性价比永远是绕不开的话题。当大多数教程还在讨论STM32时&#xff0c;一款国产的32位单片机正在悄然崛起——普冉PY32F00x系列&#xff0c;价格不到10元&#…...

002.计算机视觉与目标检测发展简史:从传统方法到深度学习

上周调一个老项目&#xff0c;客户要求在不升级硬件的前提下提升夜间车辆检测的准确率。打开代码一看&#xff0c;好家伙&#xff0c;全是手工设计的HOG特征SVM分类器&#xff0c;夜间噪点多的时候误检率直接飙到40%以上。我盯着那些精心调参的边缘梯度直方图代码&#xff0c;突…...

[Python3高阶编程] - 阅读 Gunicorn 源代码前的准备工作

1. Gunicorn 官方代码仓库 Gunicorn 的官方 Git 仓库托管在 GitHub 上&#xff1a; GitHub 地址: https://github.com/benoitc/gunicorn 克隆代码: # 克隆主仓库 git clone https://github.com/benoitc/gunicorn.git# 或者使用 SSH git clone gitgithub.com:benoitc/gunico…...

cryptocurrency-icons 的4种样式详解:从黑白到彩色全解析

cryptocurrency-icons 的4种样式详解&#xff1a;从黑白到彩色全解析 【免费下载链接】cryptocurrency-icons A set of icons for all the main cryptocurrencies and altcoins, in a range of styles and sizes. 项目地址: https://gitcode.com/gh_mirrors/cr/cryptocurrenc…...

N_m3u8DL-RE终极指南:跨平台流媒体下载与加密视频处理完全解决方案

N_m3u8DL-RE终极指南&#xff1a;跨平台流媒体下载与加密视频处理完全解决方案 【免费下载链接】N_m3u8DL-RE Cross-Platform, modern and powerful stream downloader for MPD/M3U8/ISM. English/简体中文/繁體中文. 项目地址: https://gitcode.com/GitHub_Trending/nm3/N_…...

AI赋能前端开发:让快马平台智能生成仪表盘页面架构与代码

最近在做一个数据可视化项目时&#xff0c;遇到了一个典型的前端开发需求&#xff1a;需要快速搭建一个专业级的仪表盘页面。这个页面需要包含数据概览卡片、图表展示区和用户留言列表三大核心模块。作为一个独立开发者&#xff0c;既要考虑UI美观度&#xff0c;又要兼顾代码质…...

GEE数据集:全球6400万地点数据免费开放(世界实体的点):商家、学校、医院、宗教组织、地标、山峰等

数据描述 Overture Maps Places 主题包含超过 6,400 万个现实世界实体的点表示形式&#xff1a;商家、学校、医院、宗教组织、地标、山峰等等。 每个地点记录都包含位置坐标、名称、类别、联系信息&#xff08;网站、社交媒体、电子邮件地址、电话号码&#xff09;、品牌信息、…...

用Python+OpenCV重构九点标定:抛弃Halcon的轻量化视觉方案

PythonOpenCV九点标定实战&#xff1a;从原理到嵌入式部署的全栈指南 引言&#xff1a;为什么选择开源方案替代Halcon&#xff1f; 在工业视觉领域&#xff0c;九点标定作为连接像素坐标与物理坐标的桥梁&#xff0c;直接影响着定位精度和系统稳定性。传统方案多依赖Halcon等商…...

Path of Building:流放之路玩家的终极Build规划指南

Path of Building&#xff1a;流放之路玩家的终极Build规划指南 【免费下载链接】PathOfBuilding Offline build planner for Path of Exile. 项目地址: https://gitcode.com/GitHub_Trending/pa/PathOfBuilding 还在为《流放之路》复杂的天赋树和装备搭配头疼吗&#x…...