【C++/Qt 】使用QCustomplot类打造一款数学函数图像生成工具(支持latex公式渲染+Python连接AI大模型)
✨✨ Rqtz 个人主页 : 点击✨✨
🌈Qt系列专栏:点击
软件介绍
基于Qt的开源项目QCustomplot类的一款在线的数学函数图像生成工具,涉及到了数学的latex公式渲染,如何将latex语法转换为Python的函数,和如何在Qt中使用QCustomplot类进行画图。
目前已经开发了数学函数图像生成的部分, 后面还有的是串口数据图像可视化和网口数据图像可视化功能。
数学函数图像生成主要涉及的功能:
实用性功能
- 支持三角函数,幂函数,对数函数,分式函数,组成的单项式,多项式函数图像生成。
- 支持三角函数,幂函数,对数函数,微积分,曲线积分,二重积分,极限的Latex语法渲染
个性化功能
- 支持最多同时显示14条曲线,也支持每次只显示一条曲线。
- 支持设置每一条曲线的颜色,粗细,填充的设置
- 删除指定曲线和删除所有曲线。
- 支持鼠标的拖动,放大,图像中坐标的实时显示。
图片展示
QCustomplot类介绍使用及部分函数介绍
QCustomPlot
是一个功能强大的 C++ 绘图库,专门用于在 Qt 应用程序中创建高质量的二维图表和绘图。它提供了丰富的功能来绘制各种类型的图表,包括但不限于折线图、散点图、柱状图、极坐标图等,并且支持高度的定制化,能够满足复杂的绘图需求。
Qt中嵌入QCustomplot控件
QCustomplot官网地址:Qt Plotting Widget QCustomPlot - Introduction
首先需要在Qt的项目中的.pro文件中加入printsupport
然后将在官网下载的两个文件,分别是qcustomplot.cpp和qcustomplot.h加入到项目中
通过“添加现有文件”,接着需要在ui的控件中添加一个Qcustomplot控件,但是qt的空间中并没有提供,所以我们新建一个QFrame控件,右键点击"提升为",然后将QCustomplot类填入即可。
QCustomplot相关函数介绍
设置标题为“function Example”
ui->customplot->plotLayout()->insertRow(0);QCPTextElement *title = new QCPTextElement(ui->customplot, "Function Example", QFont("sans", 17, QFont::Bold));ui->plot2->plotLayout()->addElement(0, 0, title);
添加图例
ui->customplot->addGraph();
清除图像
ui->customplot->clearGraphs();
所选的曲线
ui->customplot->selectedGraphs();
所选的曲线的大小(几条)
ui->customplot->selectedGraphs().size()
移除所选的第一个曲线
ui->customplot->removeGraph(ui->customplot->selectedGraphs().first());
添加x,y数据,其中x_list和y_list是Qvector类型
ui->customplot->graph(0)->setData(x_list,y_list);
设置曲线的图表名称
ui->customplot->graph(0)->setName("New Graph");
设置曲线的画笔
QPen pen;
//画笔颜色
pen.setColor(Qt::red);
//画笔宽度
pen.setWidth(1);
//设置曲线画笔
ui->customplot->graph(0)->setPen(pen);
设置曲线的填充区域颜色
ui->customplot->graph(0)->setBrush(QBrush(QColor(0,0,255,20));
设置曲线的无填充区域
ui->customplot->graph(0)->setBrush(Qt::NoBrush);
设置曲线x,y轴的标签
ui->customplot->xAxis->setLabel("x");
ui->customplot->yAxis->setLabel("y");
设置曲线的图表可见
ui->customplot->legend->setVisible(true);
设置线条样式为直线
ui->customplot->graph(count)->setLineStyle((QCPGraph::LineStyle)QCPGraph::lsLine);
设置线条散点为大小为2的圆形
ui->customplot->graph(count)>setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 2));
ssDisc:圆形
ssPlus:十字
ssSquare:正方形
ssDiamond:菱形
ssStar:五角星
ssTriangle:三角形
开启曲线交互
ui->customplot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables);
QCP::iRangeDrag
:允许用户通过鼠标拖动来改变坐标轴的范围。例如,在一个二维坐标图中,用户可以按住鼠标左键并拖动来改变 x
轴或 y
轴所显示的数据范围。
QCP::iRangeZoom
:启用通过鼠标滚轮或其他指定方式对绘图区域进行缩放操作,以便用户能够更仔细地查看图表的特定区域或者获取更宏观的视图。
QCP::iSelectAxes
:使得用户可以通过鼠标点击等操作选中坐标轴,可能用于后续对选中坐标轴进行属性修改(如改变坐标轴的颜色、标签格式等)。
QCP::iSelectLegend
:允许用户选中图例(通常用于标识不同数据系列的标记、颜色等信息的说明区域),以便进行诸如隐藏 / 显示特定数据系列、修改图例文本等操作。
QCP::iSelectPlottables
:使 用 户 能 够 选 中 具 体 的 绘 图 元 素(如 折 线、柱 状 图 的 柱 子、散 点 等),同样可用于进一步的操作,比如删除某个数据系列、修改其样式等。
重新绘制图像
ui->customplot->replot();
QcustomPlot实时显示鼠标在图像位置
在构造函数连接信号和槽函数mouse_move
connect(ui->customplot,&QCustomPlot::mouseMove,this,&MainWindow::mouse_move);
槽函数mouse_move,可以用label标签显示
//显示鼠标位置
void MainWindow::mouse_move(QMouseEvent *event)
{int xx = int(ui->plot2->xAxis->pixelToCoord(event->x()));int yy = int(ui->plot2->yAxis->pixelToCoord(event->y()));QString coordx("X: %1");QString coordy("Y: %1");coordx = coordx.arg(xx);coordy = coordy.arg(yy);ui->label->setText(coordy);ui->label_2->setText(coordx);
}
Latex语法介绍和开源项目cLaTeXMath库渲染的使用及qt项目嵌入
LaTeX 是一种基于 TeX 的排版系统,主要用于高质量的科技和数学文献排版。本文主要介绍LaTex语法在数学公式渲染的内容。(其中CSDN官方的文章创作中心的数学公式输入就是采用的LaTex语法)。
名称 | LaTex语法 | 函数 |
幂函数 | x^{2} | |
分式 | \frac{1}{2} | |
根号 | \sqrt{2} | |
根号 | \sqrt[2]{4} | |
不定积分 | \int | |
定积分 | \int_{1}^{6} | |
二重积分 | \iint_{1}^{6} | |
曲线积分 | \oint | |
定曲线积分 | \oint_{1}^{6} | |
微分 | \frac{d}{dx} | |
偏微分 | \frac{\partial }{\partial x} | |
对数 | \log_{10}{2} | |
对数 | \ln{2} | |
极限 | \lim_{x\to 0} | |
乘 | \times | |
无穷 | \infty | |
圆周率 | \pi |
Qt项目嵌入
相关函数及运算符(可点击)
公式渲染
嵌入方法:开源项目cLaTeXMath库渲染
平台:ubuntu 20.04
项目连接:GitCode - 全球开发者的开源社区,开源代码托管平台
下载后,将MicroTeX-master放入主目录
安装GTKMM
sudo apt-get install libgtkmm-3.0-dev
安装GSVMM
sudo apt-get install libglibmm-2.4-dev
cd MicroTeX-master
mkdir build
cd build
cmake ..
make
编译完成后
cd build
./LaTex
打开之后是一个图形化界面,可以在右侧输入latex语法,单击rending选然后,左侧可输出
该项目有提供在Qt中的嵌入,但是自己没搞明白怎么弄的。
不过没关系,可以写一个脚本来解决。
该库支持在 Linux 操作系统上的无头模式(没有图形用户界面)
批处理模式:
./LaTeX -headless \-samples=res/SAMPLES.tex \-outputdir=samples \-prefix=sample_ \# 公共选项-textsize=14 \-foreground=black \-background=white \-padding=0 \-maxwidth=720
单个模式:
./LaTeX -headless \"-input=\sqrt[3]{(x-y)^3}=x-y" \-output=an_example.svg# 其他选项...
公共选项
-
-h
: 显示用法并退出 -
-headless
: 告诉应用以无头模式运行,将输入的 LaTeX 代码转换为 SVG 图像 -
-textsize
: 配置显示公式的字体大小(以点为单位),默认为 20 -
-foreground
: 配置公式显示的前景色;值可以是颜色名称或形式为 #AARRGGBB 的十六进制颜色;默认为黑色 -
-background
: 配置公式显示的背景色;值可以是颜色名称或形式为 #AARRGGBB 的十六进制颜色;默认为透明 -
-padding
: 配置添加到 SVG 图像的间距,默认为 10 -
-maxwidth
: 配置图形上下文的最大宽度,默认为 720 像素;此选项对 SVG 图像的宽度限制较弱,因此 SVG 图像的宽度可能大于由此选项定义的值
批处理模式选项
程序会从指定文件(通过 -samples
选项提供)解析出的 LaTeX 代码保存生成的 SVG 图像到指定目录。
-
-outputdir
: 指定保存 SVG 图像的目录 -
-samples
: 指定包含多个由仅包含字符%
的单独行分隔的 LaTeX 代码的文件,默认为 './res/SAMPLES.tex';详情参见 这个文件 -
-prefix
: 指定 SVG 图像文件名前缀,默认为空;例如,如果使用-prefix=a_
提供了两段代码,SVG 图像文件名为 'a_0.svg' 和 'a_1.svg'
单个模式选项
-
-input
: 写在 LaTeX 中的源代码 -
-output
: 指定保存生成的 SVG 图像的位置,只有当指定了-input
时才有效
latex脚本(用于生成latex渲染后的svg格式图片)
#!/bin/bashpath=/home/$USER/MicroTeX-master/build/cd $pathif [ "$#" -ne 1 ];thenecho "Usage: $0 <Latex_code> "exit 1
fi
Latex_code="$1"$path/LaTeX -headless -input="$Latex_code" -output=/home/$USER/output.svg/usr/bin/python3 $path/svgtopng.py
svg转png的python程序svgtopng.py
用到的库是cairosvg,没有的pip安装
#!/usr/bin/python3
import cairosvg
def svg_to_png(svg_path, png_path):try:cairosvg.svg2png(url=svg_path, write_to=png_path)print("转换成功")except Exception as e:print("转换失败,原因:", e)svg_file = "/home/user/output.svg"
png_file = "/home/user/output.png"
svg_to_png(svg_file, png_file)
将上述的sh脚本和python脚本放入路径/home/$USER/MicroTeX-master/build/
执行方法(其后跟上任何latex语法即可)
/home/$USER/MicroTeX-master/build/latex.sh "\frac{x^{2}+1}{x^{3}-1}"
执行成功后会在主目录生成两个文件
我们将输出的png文件直接在qt中用一个label通过其setpixmap方法设置即可。
Python调用Ai大模型转换latex语法转换为Python函数,来绘图
由于软件的最终目的是将输入的latex语法转换为函数图像
但是输入的公式千变万化,而且不仅仅是单项式的函数,包含多种函数组成的多项式,其中自己也尝试通过解析latex语法的字符串形式来进行函数的提取,但是后续发现复杂程度过大。于是根据最终目的时要得到一个函数的x,y轴的数据,因此,想要借助AI大模型的方法来帮助我解析latex语法,并将其转换为python的函数。
下面介绍讯飞AI大模型的调用方法。
在 讯飞的官网注册之后,会得到一个有关于api调用的websocket的三个数据
API通信的python程序
# coding: utf-8
import _thread as thread
import os
import time
import base64import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
import math
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_time
from optparse import OptionParser
import websocket
import openpyxl
from concurrent.futures import ThreadPoolExecutor, as_completed
import os
import numpy as np
aim_content = ''
x = []
y = []
class Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, gpt_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(gpt_url).netlocself.path = urlparse(gpt_url).pathself.gpt_url = gpt_url# 生成urldef create_url(self):# 生成RFC1123格式的时间戳now = datetime.now()date = format_date_time(mktime(now.timetuple()))# 拼接字符串signature_origin = "host: " + self.host + "\n"signature_origin += "date: " + date + "\n"signature_origin += "GET " + self.path + " HTTP/1.1"# 进行hmac-sha256进行加密signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),digestmod=hashlib.sha256).digest()signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')# 将请求的鉴权参数组合为字典v = {"authorization": authorization,"date": date,"host": self.host}# 拼接鉴权参数,生成urlurl = self.gpt_url + '?' + urlencode(v)# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致return url# 收到websocket错误的处理
def on_error(ws, error):print("### error:", error)# 收到websocket关闭的处理
def on_close(ws):print("### closed ###")# 收到websocket连接建立的处理
def on_open(ws):thread.start_new_thread(run, (ws,))def run(ws, *args):data = json.dumps(gen_params(appid=ws.appid, query=ws.query, domain=ws.domain))ws.send(data)# 收到websocket消息的处理
def on_message(ws, message):# print(message)data = json.loads(message)code = data['header']['code']if code != 0:print(f'请求错误: {code}, {data}')ws.close()else:choices = data["payload"]["choices"]status = choices["status"]content = choices["text"][0]["content"]global aim_contentaim_content += str(content)if status == 2:print("关闭会话")ws.close()for k in aim_content.split('\n'):if k.find("return") !=-1:func = k.split('return ')[1]print(func)global x,yfilex = open("/home/qtz-robot/桌面/qt 项目/plot_2/plot/x.txt","w")filey = open("/home/qtz-robot/桌面/qt 项目/plot_2/plot/y.txt","w")for i in np.arange(-10,10,0.1):formula_str = func.replace('x',str(i))result = eval(formula_str)filex.write(str(i)+"\n")filey.write(str(result)+"\n")# print(result)filex.close()filey.close()def gen_params(appid, query, domain):"""通过appid和用户的提问来生成请参数"""data = {"header": {"app_id": appid,"uid": "1234", # "patch_id": [] #接入微调模型,对应服务发布后的resourceid },"parameter": {"chat": {"domain": domain,"temperature": 0.5,"max_tokens": 4096,"auditing": "default",}},"payload": {"message": {"text": [{"role": "user", "content": query}]}}}return datadef main(appid, api_secret, api_key, Spark_url, domain, query):wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)websocket.enableTrace(False)wsUrl = wsParam.create_url()ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)parser = OptionParser()parser.add_option("-i","--question",dest = "question",help = "input your question",default = "")(options,args) = parser.parse_args()if options.question:ws.query = options.questionws.appid = appid# ws.query = queryws.domain = domainws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})if __name__ == "__main__":main(appid="xxx",api_secret="xxx",api_key="xxx",#appid、api_secret、api_key三个服务认证信息请前往开放平台控制台查看(https://console.xfyun.cn/services/bm35)# Spark_url="wss://spark-api.xf-yun.com/v3.5/chat", # Max环境的地址 Spark_url = "wss://spark-api.xf-yun.com/v4.0/chat", # 4.0Ultra环境的地址# Spark_url = "wss://spark-api.xf-yun.com/v3.1/chat" # Pro环境的地址# Spark_url = "wss://spark-api.xf-yun.com/v1.1/chat" # Lite环境的地址# domain="generalv3.5", # Max版本domain = "4.0Ultra" , # 4.0Ultra 版本# domain = "generalv3" # Pro版本# domain = "lite" # Lite版本址query="")
这个程序可以直接在讯飞官方下载。通过修改主函数的appid,api_secret,api_key为自己注册时生成的即可,然后模型的话我的是4.0Ultra。
但是该程序有三处被我修改的地方,以适配我的项目。
1.在main函数中
parser = OptionParser()parser.add_option("-i","--question",dest = "question",help = "input your question",default = "")(options,args) = parser.parse_args()if options.question:ws.query = options.question
使用optparse 的 OptionParser来读取命令行参数。参数为给ai大模型输入的问题。
2.在onmessage函数中
global aim_content
aim_content += str(content)
if status == 2:print("关闭会话")ws.close()for k in aim_content.split('\n'):if k.find("return") !=-1:func = k.split('return ')[1]print(func)global x,yfilex = open("/home/user/桌面/qt 项目/plot_2/plot/x.txt","w")filey = open("/home/user/桌面/qt 项目/plot_2/plot/y.txt","w")for i in np.arange(1,10,0.1):formula_str = func.replace('x',str(i))result = eval(formula_str)filex.write(str(i)+"\n")filey.write(str(result)+"\n") # print(result)filex.close()filey.close()
这里改动的是在模型通过websocket返回给我们问题的回答时,由于回答时候会多次调用omessage函数,所以就用aim_content拼接所有回答的字符串。
然后进行对字符串的处理,只截取到返回的程序中return后的语句。
最后使用一个1-10的浮点型数据,将返回的python函数中含有x的字符都替换成1-10的浮点型数据,从而得到一个字符串形式的数学表达式.
再使用eval函数将用字符串组成的数学公式进行转换,得到1-10中每个浮点型数据x下函数的函数值y。
其中向ai大模型询问的格式是
"latex语法+将这个latex语法格式的数据转换为python函数,用math库,不要回答文字语言"
最后将循环中的x,y数据,也就是生成的数学表达式在1-10,步幅0.1的所有x,y数据保存到x.txt和y.txt.
获取函数x,y轴数据进行函数图像生成并嵌入Qt的Qcustomplot控件
在生成x,y的文件后,我们就得到的函数的数据。
在qt中可以通过读取这两个文件,并将读到的数据加入QVecor容器中。
painting按钮点击后的代码:
//显示函数图像
void MainWindow::on_painting_clicked()
{x_list.clear();y_list.clear();std::stringstream str;str<<"/home/user/桌面/'qt 项目'/plot_2/plot/spark.sh "<<ui->funtextEdit->toPlainText().toStdString()<<"将这个latex语法格式的数据转换为python函数,用math库,不要回答文字语言";system(str.str().c_str());std::cout<<str.str()<<std::endl;//读取x轴数据std::ifstream filex("/home/user/桌面/qt 项目/plot_2/plot/x.txt");if(!filex)QMessageBox::warning(this,"警告","函数x轴数据不存在");else {std::string line;while(std::getline(filex,line)){x_list.push_back(std::stod(line));}filex.close();}std::ifstream filey("/home/user/桌面/qt 项目/plot_2/plot/y.txt");if(!filey)QMessageBox::warning(this,"警告","函数y轴数据不存在");else {std::string line;while(std::getline(filey,line)){y_list.push_back(std::stod(line));}filey.close();}//清除绘图if(ui->ifadd->isChecked()==0){ui->plot2->clearGraphs();count = -1;}count++;ui->plot2->addGraph();//设置数据ui->plot2->graph(count)->setData(x_list,y_list);QString str1 = ui->funtextEdit->toPlainText()+" %1";//设置名称ui->plot2->graph(count)->setName(str1.arg(count));QPen pen;//画笔颜色pen.setColor(Qt::red);//画笔宽度pen.setWidth(1);//设置曲线画笔ui->plot2->graph(count)->setPen(pen);//设置标签ui->plot2->xAxis->setLabel("x");ui->plot2->yAxis->setLabel("y");//设置曲线可见ui->plot2->legend->setVisible(true);//设置线条样式为直线ui->plot2->graph(count)->setLineStyle((QCPGraph::LineStyle)QCPGraph::lsLine);//设置线条散点为大小为2的圆形ui->plot2->graph(count)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 2));//开启曲线交互ui->plot2->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectAxes | QCP::iSelectLegend | QCP::iSelectPlottables);//重新绘制图像ui->plot2->replot();
}
如有错误,请大佬指正批评!
相关文章:
【C++/Qt 】使用QCustomplot类打造一款数学函数图像生成工具(支持latex公式渲染+Python连接AI大模型)
✨✨ Rqtz 个人主页 : 点击✨✨ 🌈Qt系列专栏:点击 软件介绍 基于Qt的开源项目QCustomplot类的一款在线的数学函数图像生成工具,涉及到了数学的latex公式渲染,如何将latex语法转换为Python的函数,和如何在Qt中使用QCustomplot类进…...
Hackathon靶机系列Hackathon2
扫描ip: 获得靶机的ip:192.168.108.134 扫描端口: 获得80端口,7223的ssh和一个ftp服务器服务器中存在两个文件: 先看ftp: 默认用户名为ftp: 下载两个文件: 和 打开flag1.txt: 获得…...
Mybatis 复习
1 什么是MyBatis MyBatis是一个优秀的持久层框架,它对JDBC操作数据库的过程进行封装,使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、 结果集检索等JDBC繁杂的过程代码 。…...
BurpSuite安装教程(详细!!附带下载链接)
声明 学习内容来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
Istio_05_Istio架构
Istio_05_Istio架构 ArchitectureControl PlanePilotCitadelGalley Data PlaneSidecarIstio-proxyPilot-agentMetadta Exchange Ambient Architecture 如: Istio的架构(控制面、数据面) Gateway: Istio数据面的出/入口网关 Gateway分为: Ingress-gateway、Egress-gateway外部访…...
R语言结构方程模型(SEM)在生态学领域中的应用
目录 专题一、R/Rstudio简介及入门 专题二、结构方程模型(SEM)介绍 专题三:R语言SEM分析入门:lavaan VS piecewiseSEM 专题四:SEM全局估计(lavaan)在生态学领域高阶应用 专题五࿱…...
node.js基础学习-fs模块-文件操作(六)
一、前言 fs模块是 Node.js 内置的文件系统(File System)模块,它提供了一系列用于与文件系统进行交互的方法。通过fs模块,可以对文件或目录进行读取、写入、删除、重命名、查询状态等操作,这使得 Node.js 能够很好地处…...
EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列
使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码,我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格,按“CTRLD”向下填充,就可以得出其它几行“-”之前的…...
JVM的垃圾回收算法有哪些
标记清除算法 标记清除算法,是将垃圾回收分为2个阶段,分别是标记和清除 根据可达性分析算法得出的垃圾进行标记对这些标记为可回收的内容进行垃圾回收 优点:标记和清除速度较快缺点:碎片化较为严重,内存不连贯的 标记整理算法 优缺点同标记…...
看华为,引入IPD的正确路径
目录 前言 引发重视 作者简介 前言 华为将 IPD 的引入过程归结为三步: 先僵化、后优化、再固化。 如果只是单纯模仿,在不清楚底层逻辑的情况下, 就开始走先僵化的流程,去搞削足适履式的引入。 开始执行后,你就…...
2024142读书笔记|《别无归处是归处》——一壶酒,一竿身,世上如侬有几人
2024142读书笔记|《别无归处是归处》——一壶酒,一竿身,世上如侬有几人 《别无归处是归处:吴镇的“渔父”画题(文人画的真性)》作者朱良志。诗词与古画并存的一本书,古画是比较偏复古黯淡微黄及墨色的&…...
think php处理 异步 url 请求 记录
1、需求 某网站 需要 AI生成音乐,生成mp3文件的时候需要等待,需要程序中实时监听mp3文件是否生成 2、用的开发框架 为php 3、文件结构 配置路由设置 Route::group(/music, function () {Route::post(/musicLyrics, AiMusic/musicLyrics);//Ai生成歌词流式…...
PostgreSQL详细安装教程
#安装PostgreSQL的yum仓库 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm#安装PostgreSQL 15版本 sudo yum install -y postgresql15-server#初始化数据库(若要自定义数据库存储目录…...
电子电气架构 --- 车载网关GW连接外部IP Tester
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…...
开发一套ERP 第八弹 RUst 插入数据
更全面的报错,方便检查错误在哪里,现代高级语言越来越智能 还是得看下原文档怎么操作的 src 目录为crate 的根目录 想在crate 中模块相互引入需要在 main 中声明,各个模块,然后才能在各个模块中相互引入和使用 原始工程引入,避免直接使用 lib.rs 回合cargo 中的一些 工程管理出…...
RFdiffusion Diffuser类解读
Diffuser 类是一个封装类,调用EuclideanDiffuser和IGSO3类,用于执行扩散模型的核心功能,主要针对分子或蛋白质结构的旋转(SO(3) 群上的扩散)和位移(欧几里得空间中的扩散)。 源代码: class Diffuser:# wrapper for yielding diffused coordinatesdef __init__(self,T…...
【pdf密码】为什么我的PDF文件不能复制文字?
大家现在接触PDF文件越来越多,有的时候在网上下载的PDF文件打开之后,发现选中文字之后无法复制。甚至其他功能也都无法使用,这是怎么回事?该怎么办? 当我们发现文件打开之后,编辑功能无法使用,很…...
C#学写了一个程序记录日志的方法(Log类)
1.错误和警告信息单独生产文本进行记录; 2.日志到一定内存阈值可以打包压缩,单独存储起来,修改字段MaxLogFileSizeForCompress的值即可; 3.Log类调用举例:Log.Txt(JB.信息,“日志记录内容”,"通道1"); usi…...
Android Framework禁止弹出当前VOLTE不可用的提示窗口
文章目录 VoLTE简介VoLTE 的优势 当前VOLTE不可用的弹窗弹窗代码定位屏蔽弹出窗口 VoLTE简介 VoLTE(Voice over LTE)是一种基于4G LTE网络的语音通话技术。它允许用户在4G网络上进行高质量的语音通话和视频通话,而不需要回落到2G或3G网络。V…...
Maven Surefire 插件简介
Maven Surefire 插件是 Maven 构建系统中的一个关键组件,专门用于在构建生命周期中执行单元测试。 它通常与 Maven 构建生命周期的测试阶段绑定,确保所有单元测试在项目编译后和打包前被执行。 最新版本 Maven Surefire 插件的最新版本为 3.5.2。 使…...
vue3-新增API组件
shallowRef 创建一个响应式数据,但只对顶层属性进行响应式处理,只跟踪引用值的变化,不关心值内部的属性变化 import {shallowRef} from "vue" import UserInfo from "/components/UserInfo.vue";let name shallowRef("vue&quo…...
Linux随记(十三)
一、jstack随记 运行cmd cd C:\icp-agent\jdk_min\bin 执行 jstack PID > thread_dump.txt (查看PID:tasklist |findstr javaw 查看第二列) thread_dump.txt 取给研发二、让普通用户test,有权限使用docker指令 1、 查看当前用…...
AI数据分析工具(一)
Looker Studio(谷歌)-免费 优点 免费使用:对于中小型企业和个人用户来说,没有任何费用压力,可以免费享受到数据可视化和报表创建的功能。与Google服务集成:特别适合使用Google产品生态的企业,…...
dhcp服务
安装dhcp-libs和dhcp-common软件包是配置DHCP服务器的前提,但仅仅安装这两个软件包并不能直接开启DHCP服务器。您还需要进行以下步骤来完整配置和启动DHCP服务器: 安装DHCP服务器软件包: 除了dhcp-libs和dhcp-common,您还需要安装…...
RSA算法和AES算法,哪种更安全
目录 一、RSA (非对称加密算法) 二、AES (对称加密算法) 三、对比总结 四、更安全的选择 五、结合使用:RSA AES RSA 和 AES 是两种不同类型的加密算法,适用于不同的场景,因此它们的安全性不能直接比较,而是取决于具体的应用…...
反向代理模块开发
1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求,然后将请求转发给内部网络上的服务器,将从服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说,反向代理就相当于…...
(微信小程序)基于Spring Boot的校园失物招领平台的设计与实现(vue3+uniapp+mysql)
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...
1-7 GD32函数指针应用
前言: 本博客仅在应用函数指针与回调函数相关的知识,通过实践巩固所学知识,也是对相关知识点的回顾。 函数指针与回调函数:1-6 GD32函数指针与回调函数-CSDN博客 目录 前言: 1.0 程序架构思想 2.0 构建串口结构体 …...
前端js面试知识点思维导图(脑图)
如果看着不清晰可以去https://download.csdn.net/download/m0_73761441/90058523访问下载,无需积分 使用百度脑图制作,可以一键导入下面的文本生成自己的脑图 js相关面试题、知识点 数据类型 1. 数据类型分类?分别包含ÿ…...
使用 F5 TTS 文字转音频
F5 TTS 支持 ZeroShot 音频克隆,只有将需要音频传给模型,模型既可以生成以对应声音生成的音频,F5 最强大的地方就是可以使用定制的人声。F5 使用了 DIT 架构进行训练,结构如下: 本地使用 F5 TTS F5 使用很简单&#x…...
【笔记】自动驾驶预测与决策规划_Part8_数据驱动的规划方法
文章目录 0. 前言1.生成模型1.1 Diffusion-ES1. Diffusion-ES算法介绍2. Diffusion-ES算法具体流程Diffusion Model 是什么?Diffusion-ES: Evolutionary StrategiesDiffusion-ES MethodDiffusion-ES Mapping Language instructions to reward functions with LLM pr…...
多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG
Title: 多视图几何中向量叉乘的矩阵转换 Matrix Transformation for Cross Product in MVG 文章目录 I. 向量叉乘的矩阵转换恒等式II. 符号计算 Maxima 程序推导III. 推论和关联公式的说明1. 推论2. 应用于对极几何中基本矩阵推导3. 应用于基本矩阵与单应矩阵关系4. 与刚体运动…...
面向多用户场景的恢复机制驱动的无线组密钥生成协议
中文标题:面向多用户场景的恢复机制驱动的无线组密钥生成协议 英文标题:A Recovery Mechanism-driven Wireless Group Key Generation Protocol for Multi-User Scenarios 作者信息: Huaicong Zhang, Yawen Huang, Jiabao Yu, Boqian Liu, …...
ROS2教程 - 2 环境安装
更好的阅读体验:https://www.foooor.com 2 环境安装 下面以 ROS2 的 humble 版本为例,介绍 ROS2 的安装。 ROS1 只能在 ubuntu 系统上安装,ROS2全面支持三种平台:Ubuntu、MAC OS X、Windows10,下面在 Ubuntu22.04 …...
力扣200 岛屿数量 Java版本
文章目录 题目描述代码 题目描述 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 …...
每日速记10道java面试题03
其他资料 每日速记10道java面试题01-CSDN博客 每日速记10道java面试题02-CSDN博客 目录 一、你使用过java的反射机制吗?如何应用反射? 二、什么是泛型?泛型的作用是什么? 三、java的泛型擦除是什么? 四、Java 中…...
力扣刷题TOP101:6.BM7 链表中环的入口结点
目录: 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑(Floyd 判圈算法)的延续版:乌龟愤愤不平地举报兔子跑得太快,偷偷…...
智慧防汛平台在城市生命线安全建设中的应用
随着城市化进程的加快,城市基础设施的复杂性和互联性不断增强,城市生命线的安全管理面临前所未有的挑战。智慧防汛平台作为城市生命线安全建设的重要组成部分,通过现代信息技术提升城市防汛应急管理的智能化水平,保障城市安全。 …...
高德应用OceanBase云数据库的升级选型与迁移干货
业务背景 高德,DAU已在亿级,时时刻刻都持续不断地产生着庞大的数据。随着数据量的迅猛增长,对现有的业务数据存储能力构成日益严峻的挑战。 以我所在部门中的某一大型服务为例,其存储在XDB中的数据量往往达到数百TB之巨…...
Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!
问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语,flink ,cdc,debezium时区都设置了,没有任何效果! 分析 问题出现在mysql binlog身上!!! 因为默认mysql会使用UTC来…...
用shell脚本写一个通用的监听程序异常并重启脚本
进来服务器的程序php-fpm时常在并发下时常挂掉,而且时常在凌晨2点以后,通过排查是因为php配置需要调整并发,同时,为了不影响我休息(以前老师说:能用机器和程序解决问题的坚决不用人去操作,这样才…...
使用 Go 语言中的 Context 取消协程执行
使用 Go 语言中的 Context 取消协程执行 在 Go 语言中,协程(goroutine)是一种轻量级的线程,非常适合处理并发任务。然而,如何优雅地取消正在运行的协程是一个常见的问题。本文将通过一个具体的例子来展示如何使用 con…...
使用经典的Java,还是拥抱新兴的Rust?
在当代互联网时代的企业级开发中,技术栈的选择往往牵动着每个团队的神经。随着Rust语言的崛起,许多开发团队开始重新思考:是继续坚持使用经典的Java,还是拥抱新兴的Rust?这个问题背后,折射出的是对技术演进…...
《算法导论》英文版前言To the teacher第3段研习录:题海战术有没有?
【英文版】 We have included 957 exercises and 158 problems. Each section ends with exercises, and each chapter ends with problems. The exercises are generally short questions that test basic mastery of the material. Some are simple self-check thought exer…...
XELA - uSkin 三轴触觉传感器:为机器人赋予敏锐触感
XELA Robotics 的 uSkin 触觉传感器以其创新性在机器人技术中备受关注。它凭借高密度设计和三轴力测量能力,大幅提升了机器人的触觉感知能力,这种技术不但增强了机器人的智能化和柔性,还为不同行业的应用创造了广泛的可能性。其中在机器人灵巧…...
k8s常用命令总结
以下是 Kubernetes 所有常用命令的详细总结,涵盖了 kubectl 的各个方面,包括基本操作、资源管理、调试、监控等。每个命令都附有简要说明和示例。 1. 基本命令 查看 Kubernetes 版本 kubectl version 查看集群信息 kubectl cluster-info 查看当前上…...
即时通讯| IM+RTC在AI技术加持下的社交体验
即时通讯作为互联网的重要应用之一,见证了中国互联网30年发展的辉煌历程。 它从最初的文字交流,发展到如今的语音、视频通话,甚至是虚拟现实社交,已经渗透到生活的社交、娱乐、商务等方方面面,成为现代社会不可或缺的一…...
评估人工智能生成答案准确性
目录 评估人工智能生成答案准确性 评估人工智能生成答案准确性 在评估人工智能(AI)系统生成的答案准确性时,我们主要关注两个方面:事实相似性和语义相似性。这两个方面的加权平均分数被用来衡量系统回答的准确性。 事实相似性: 事实相似性通过F1分数来计算。F1分数是精确…...
scala的守卫语句格式
import scala.io.StdIn object test49{//从控制台读入一个数字a,使用(StdIn.readInt)//如果a>0并且a<3,打印[0-3]//如果a>4并且a<8,打印[4-8]//否则:打印未匹配 // def main(args: Array[String]): Unit { // val aStdIn.readInt()//等…...
结构型模式-组合模式
组合模式(Composite Pattern)是一种结构型设计模式,它通过将对象组合成树形结构来表示“部分-整体”的层次结构,从而使客户端对单个对象和组合对象的使用具有一致性。 适用场景 需要表示对象的层次结构:如文件系统、组…...