【滤波专题-第7篇】“类EMD”算法分解后要怎样使用(3)——EMD降噪方法及MATLAB代码实现

news2024/11/27 16:39:09

使用EMD分解(以及其他“类EMD”分解方法,以下为了简便统称EMD)做信号降噪,是EMD的一个比较重要的应用方向。EMD可以将复杂的信号分解为一系列的固有模态函数(IMFs),每一个IMF都包含了信号的一部分频率信息。在信号降噪的过程中,如何选择和筛选IMFs是关键步骤之一。在本文中,我将介绍EMD降噪的基本步骤以及几种常见的IMFs筛选策略。

一、EMD降噪的通用步骤

EMD降噪的过程可以分为三个基本步骤:EMD分解,IMFs筛选和信号重构。

  1. EMD分解:在这一步中,我们使用EMD或者类EMD的方法将复杂的信号分解为一系列的固有模态函数(IMFs)。每一个IMF都包含了信号的一部分频率信息。这就像是将一束光通过棱镜分解为各种颜色一样,每种颜色都代表了一种频率。
  2. IMFs筛选:在这一步中,我们根据某种策略来筛选IMFs。这个策略可以基于频率、相关系数、峭度等。筛选的目的是要去掉那些包含噪声的IMFs,而保留那些包含有用信息的IMFs。这就像是从各种颜色中选择我们想要的颜色,而过滤掉我们不想要的颜色。
  3. 信号重构:在这一步中,我们将筛选后的IMFs进行叠加,得到降噪后的信号。这就像是将选择的颜色混合在一起,得到我们想要的图像。

二、IMFs筛选策略

下边我将详细介绍几种IMFs筛选的策略:

2.1 根据频谱的直接筛选方法

就像之前文章讲到的,EMD方法能将信号分解成若干阶内涵模态分量(IMF分解),并按照频率从高到低进行排列,就像下图(类EMD画图代码可以在这里找到):

所以我们只要参照各个IMF分量的频谱,选取希望保留的频段重构就可以实现滤波,比如上图中,对IMF1和IMF2两个分量进行重构就基本可以实现5Hz和20Hz的主成分的提取和噪声滤除了。(IMF分量重构方法可以参考这里:“类EMD”算法分解后要怎样使用(2)——高频、低频、趋势项分量判别与重构,及MATLAB代码实现)

上述这种滤波方法需要研究者清晰地知道自己所需的信号频段,不过很多时候我们自己也不知道有用信号的频率范围,这样就需要使用一些辅助手段,比如用某些参数对各分量进行评价,通过设置阈值或者人为判断的方式进行筛选。

2.2 根据相关系数的筛选方法

相关系数是一种衡量两个信号相似性的方法,其值在-1到1之间。相关系数的绝对值越大,两个信号的相似性越高。如果相关系数为正,那么两个信号在相同的方向变化;如果相关系数为负,那么两个信号在相反的方向变化。具体可以看下这里:衡量数据“像不像”——协方差与相关系数 - 知乎 (zhihu.com)

当你使用相关系数来选择IMF时,你可以选择与原始信号高度相关的IMF,因为它们往往包含了信号的主要信息。

选择相关系数阈值的方法是一个权衡过程。阈值过高可能会导致滤除过多的信号信息;阈值过低可能会导致滤除的噪声不足。因此,我们需要根据我们的具体应用和数据的特性,适当地选择阈值。有论文认为,阈值设置为0.5较为合适。[1]

然而,需要注意的是,虽然相关系数是一种有用的工具,但它也有一些限制。例如,它只能衡量两个信号的线性相关性,不能衡量它们的非线性相关性。此外,如果你的信号含有噪声,那么相关系数可能会被噪声影响。

2.3 根据峭度的筛选方法

峭度是一种衡量信号极值分布的指标。一般来说,如果一个IMF的峭度值较大,那么这个IMF可能包含了较多的尖峰或者重尾分布,这些通常与噪声有关。因此,我们可以计算每个IMF的峭度,并据此进行筛选。

具体来说,我们可以设定一个峭度阈值,然后筛选出峭度低于阈值的IMFs。这样,我们就可以将那些可能含有噪声的IMFs去除,从而实现降噪。

正态分布的峭度等于3,峭度小于3时分布的曲线会较“平”,大于3时分布的曲线较“陡”。图片来源:https://www.cnblogs.com/yanshw/p/15963449.html

2.4 一种自适应降噪方法

在论文《基于EEMD的振动信号自适应降噪方法》[2]中,提出了根据白噪声经经验模式分解后其固有模式函数分量的能量密度与其平均周期的乘积为一常量这一特点,设计了自动选择IMF分量重构信号的算法。

具体的步骤可以概括如下:

  1. 执行EEMD分解:对含噪声的信号进行EEMD分解,得到K个IMF分量。当然,此处也可以根据需要换成其他分解算法。
  2. 计算每个IMF的能量密度与平均周期之积:首先,需要计算每个IMF的能量密度和平均周期。然后,将能量密度与平均周期相乘,得到每个IMF的能量密度与平均周期之积。
  3. 计算系数RPi:计算每个IMF的系数RPi,当RPi的值大于等于1时,说明当前IMF的能量密度与平均周期之积相对于前一个IMF的这个值有显著的增加。
  4. 筛选IMF分量:当RPi的值大于等于1时,我们认为前面的IMF分量主要包含噪声,因此将其去除。然后,使用剩下的IMF分量重构信号,以实现对原始噪声信号的降噪。

该方法不需要像前几种方法那样还要人为设置阈值,使用起来相对方便一些,但是同时灵活性就相对较低一些了。

2.5 上述方法各自的特点

下表中是上述4个方法的一些主要特点。在使用这些方法时,研究者需要考虑其优势和局限性,以确定是否适合研究的需求。

方法特点
根据频谱的直接筛选方法直观而简单:这种筛选方法直接依赖于信号的频谱信息(比如信号的频率分布和频率强度),对于频段的筛选一目了然。
需要频率信息:对于这种筛选方法,研究者需要清楚地知道他们所需要的信号频段。如果研究者不确定有用信号的频率范围,这种方法可能就不适用。
灵活性高:这种筛选方法允许研究者根据他们的需求选择任何特定的频段。
根据相关系数的筛选方法关注相似性:通过比较IMFs与原始信号的相关系数,识别出包含主要信息的IMFs。
需要设置阈值:在使用相关系数进行筛选时,我们需要设置一个阈值,只有当IMF与原始信号的相关系数超过这个阈值时,我们才认为该IMF包含有用的信息。
只能衡量线性相关性:相关系数只能衡量两个信号的线性相关性,不能衡量他们的非线性相关性。如果信号的相关性是非线性的,那么使用相关系数可能会导致一些信息的丢失。
根据峭度的筛选方法关注峭度:较大的峭度值通常表示信号有更多的尖峰或重尾分布,这些通常与噪声有关。通过计算每个IMF的峭度,我们可以识别出可能包含噪声的IMFs。
需要设置阈值:在使用峭度进行筛选时,我们需要设置一个峭度阈值,只有当IMF的峭度低于这个阈值时,我们才认为该IMF包含有用的信息。
对高频噪声敏感:峭度在某种程度上对高频噪声较为敏感,因此这种筛选方法在处理含有高频噪声的信号时可能更为有效。
一种自适应降噪方法自动化筛选:与需要人为设定阈值的筛选方法相比,自适应降噪方法可以自动地选择IMFs分量,这减少了人为干预的需求,使得处理过程更加便捷。
灵活性较低:虽然自适应降噪方法可以自动地进行IMFs筛选,但是它的灵活性较低,可能会得到不理想的效果并无法介入干预。

三、MATLAB案例实现

上边讲到了四种筛选方法,我们现在逐一使用MATLAB进行实现,并初步对比一下滤波效果。

首先我们仿真生成一段信号,并向其中加入白噪声。x为未加入白噪声的纯净信号,sig为加入白噪声后的信号,代码如下:

%% 1.生成仿真信号,x为无噪声信号,sig为添加噪声后的信号
rng(123); %设置随机种子,保证每次生成噪声的一致性
N = 200;
t = linspace(0,1,N);
x = 4*sin(4*pi*t);
x = x - sign(t-0.3) - sign(0.72-t);
sig = x + 0.2*randn(size(t));
figure('Color','w');subplot(2,1,1);plot(t,x);title('未加入白噪声信号')
subplot(2,1,2);plot(t,sig);title('加入白噪声信号')

3.1 基于频谱分析的筛选方法

按照上边讲到的方法,我们首先对信号进行EMD分解,得到一系列IMF分量及其频谱。在之前的文章中,我们提供了快速绘制该图像的函数。此时只需要下边这行代码,就可以画出想要的图像。

%% 2. 对信号进行EMD分解
imfs = pEMDandFFT(sig,1);

此时绘制的图像如下。

然后,我们对每个IMF分量进行频谱分析,经初步分析认为IMF1主要包含噪声信号,所以对IMF2-IMF5以及res进行重构,即将这些IMF分量叠加,得到滤波后的信号。以下是在MATLAB中实现这种方法的代码:

%% 3. 根据频率的直接筛选方法
indices = [2, 3, 4 , 5 , 6];  % 假设我们想要保留的是前两个IMF,需要注意res等同于最后一个IMF,在此例子中,res即IMF5,如果要保留第1、2个IMF和res,可以写成:indices = [1, 2 ,5];
filtered_imfs = imfs(indices, :);
filtered_signal1 = sum(filtered_imfs, 1);

这样就可以得到滤波后的数据filtered_signal1。

我们来画图看一下滤波效果:

%% 4.画滤波前后对比图
% 需要注意,只有在知道纯净信号(即未添加噪声信号)时才能进行指标评价
% 对于真实采样信号,无法获取其纯净信号值的,无法进行该步骤,需删除本小节代码
ori = x;  %无噪声信号
fil = filtered_signal1;  %滤波后信号
figure('color','w')
subplot(311);plot(x,'k');title('原始信号(未加入噪声)')
subplot(312);plot(sig,'k');title('原始信号(加入噪声)')
subplot(313);plot(fil,'k');title('滤波后信号')
% 注意,对于不知道纯净信号的情况,无法绘制“未加入噪声”的信号图像
% 此时需要将上述4行代码删除,并使用下述3行代码:
% figure('color','w')
% subplot(211);plot(sig,'k');title('原始信号')
% subplot(212);plot(s,'k');title('滤波后信号')

基于频谱分析的筛选方法

结合我们之前讲过的计算一下滤波效果评价指标。计算SNR、MSE和NCC这三个指标值,计算方法也同样进行了封装,就像这样调用就行:

%% 4.进行滤波指标评价
% 需要注意,只有在知道纯净信号(即未添加噪声信号)时才能进行指标评价
% 对于真实采样信号,无法获取其纯净信号值的,无法进行该步骤,需删除本小节代码
[SNR,MSE,NCC] = FilterEffectEvaluation(ori,fil);
% 对滤波效果进行评估
% 目前包含的评估指标有:信噪比SNR,均方差MSE,波形相似系数NCC
% 输入:
% ori:无噪声的原始数据,一维序列
% fil:滤波后的数据,一维序列
disp(['滤波后的SNR、MSE和NCC值分别为:',num2str(SNR),'、',num2str(MSE),'、',num2str(NCC)]);

计算得出滤波后的SNR、MSE和NCC值分别为:25.2919、0.028059、0.99852

这个效果还是可以的,下面我们再计算一下另外几种滤波方法的结果。

3.2 基于相关系数的筛选方法

分析的数据保持不变,使用下述代码可以实现滤波:

%% 3.调用filCorrelation实现滤波
threshold_corr = 0.4;  % 设置相关系数阈值
[filtered_signal2,correlation_values] = filCorrelation(sig, imfs, threshold_corr);
% filCorrelation 基于相关系数进行IMF筛选,用以滤波
%
% 输入:
% original_signal - 原始信号,一维行向量
% imfs - EMD分解得到的IMF分量,每一行对应一个IMF分量
% threshold_corr - 相关系数阈值,用于筛选IMF分量
%
% 输出:
% filtered_signal - 滤波后的信号,一维行向量
% correlation_values - 每个IMF分量的相关系数值,一维行向量

其中的filCorrelation为笔者封装的函数,对于该函数只需要输入待滤波信号sig,模态分解后的分量imf以及相关系数阈值threshold_corr即可,运行程序可以计算出每个分量与sig的相关系数,上边的案例中我将阈值设置成了0.4,此时筛选出的IMF分量为IMF3和IMF4。运行结果如下:

程序执行完之后在MATLAB工作区打印的结果

基于相关系数的筛选方法

选择相关系数阈值是一个平衡的过程,需要根据具体的应用和数据特性来选择。如果阈值设置得过高,可能会滤掉太多的有效信号信息;而阈值设置得过低,则可能无法充分滤除噪声。有研究建议,设置0.5作为一个初始的相关系数阈值,但最终的决定应根据具体情况来调整。

3.3 基于峭度的筛选方法

基于峭度的筛选方法使用下述代码可以实现滤波:

%% 3.调用filKurtosis实现滤波
threshold_kurtosis = 4;  % 设置峭度阈值
[filtered_signal3, kurtosis_values] = filKurtosis(imfs, threshold_kurtosis);
% filKurtosis 基于峭度进行IMF筛选,用以滤波
%
% 输入:
% imfs - EMD分解得到的IMF分量,每一行对应一个IMF分量
% threshold_kurtosis - 峭度阈值,用于筛选IMF分量
%
% 输出:
% filtered_signal - 滤波后的信号,一维行向量
% kurtosis_values - 每个IMF分量的峭度值,一维行向量

其中的filKurtosis为笔者封装的函数,对于该函数只需要输入模态分解后的分量imf以及峭度阈值threshold_kurtosis即可,运行程序可以计算出每个分量的峭度值,上边的案例中我将阈值设置成了4,此时筛选出的IMF分量为IMF3-IMF5以及res。运行结果如下:

程序执行完之后在MATLAB工作区打印的结果

基于峭度的筛选方法

选择峭度阈值时,通常需要参考你的数据特性和具体应用。峭度值较大的IMF一般对应的是含有尖峰或者重尾分布的信号,这样的信号通常与噪声有关。因此,我们通常希望筛选掉这些高峭度的IMF,从而实现对信号的降噪。具体阈值的设定需要对数据进行多次试验观察。可以先设定一个初始值,然后逐步微调,观察滤波效果的变化。通常可以从峭度值的平均值或者中位数作为参考起点。

需要注意的是,峭度阈值的选择需要综合考虑信号的特性和噪声的特性。例如,如果噪声的峭度特别高,可能需要设定较高的阈值才能有效地去除噪声。同时,如果你的信号本身的峭度就较高,那么过低的阈值可能会把有用的信号误删。

3.4 基于自适应降噪方法

上边三种方法都涉及到某些参数的调试,有些同学可能不知道该怎么入手,此时就可以使用基于自适应降噪方法了,基于自适应降噪方法可以使用下述代码可以实现滤波:

%% 3.调用filAdaptive实现滤波
[filtered_signal4, RPi_values] = filAdaptive(imfs);
% filAdaptive 自适应降噪方法
% 参考论文:陈仁祥,汤宝平,马婧华.基于EEMD的振动信号自适应降噪方法[J].振动与冲击,2012,31(15):82-86.DOI:10.13465/j.cnki.jvs.2012.15.015.
%
% 输入:
% imfs - EMD分解得到的IMF分量,每一行对应一个IMF分量
%
% 输出:
% filtered_signal - 滤波后的信号,一维行向量
% RPi_values - 每个IMF分量的RPi值,一维行向量

其中的filAdaptive为笔者封装的函数,对于该函数只需要输入模态分解后的分量imf就行,运行程序可以计算出每个分量的PRi值(具体参数含义详见参考论文),此时筛选出的IMF分量为IMF3-IMF5以及res。运行结果如下:

程序执行完之后在MATLAB工作区打印的结果

基于自适应降噪的筛选方法

这个运行结果和峭度方法相同,不过这是对于本例子的巧合,不是所有信号都会这样哦。

这里有两点注意事项提醒大家:

第一。上边代码中涉及到的封装函数的入口参数imfs,在本例子中是使用的emd分解得到的分量,这里是可以替换成其他的“类EMD”分解方法,比如EEMD、VMD等等,关于这些分解方法在本专栏中都有专篇论述,这里有文章目录:Mr.看海:目录——信号处理有关的那些东东

第二。SNR、NCC和MSE指标,都是需要知道“纯净信号”才能计算的,对于只知道真实含噪信号,不知道纯净信号的情况,是没办法计算这三个指标的。我在之前的文章里进行过详细的说明:Mr.看海:【滤波专题-第4篇】滤波器滤波效果的评价指标(信噪比SNR、均方误差MSE、波形相似参数NCC)

四、关于获取上述MATLAB代码

上述的代码提到了三个新封装的滤波函数,分别用于实现基于相关系数筛选、基于峭度筛选、自适应筛选的IMF分量筛选,从而实现滤波。同学们差不多只需要导入自己要分析的数据,然后直接调用函数就可以了,更多的时间精力可以放在写论文和改进算法上。

我将上述提到的所有代码和案例文件都进行了打包,需要的同学可以下边链接获取:

类EMD滤波算法(相关系数、峭度、自适应等方法) | 工具箱文档

【EMD专题】相关文章:

2.1 Mr.看海:这篇文章能让你明白经验模态分解(EMD)——基础理论篇

2.2 Mr.看海:这篇文章能让你明白经验模态分解(EMD)——IMF的物理含义

2.3 Mr.看海:这篇文章能让你明白经验模态分解(EMD)——EMD在MATLAB中的实现方法

2.4 Mr.看海:希尔伯特-黄变换(HHT)的前世今生——一个从瞬时频率讲起的故事

2.5 Mr.看海:希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

2.6 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD

2.7 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD

2.8 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN

2.9 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第四篇)——VMD

2.10 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第五篇)——ICEEMDAN

2.11 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第六篇)——LMD

2.12 Mr.看海:类EMD的“信号分解方法”及MATLAB实现(第七篇)——EWT

2.13 Mr.看海:“类EMD”算法分解后要怎样使用(1)——内涵模态分量IMF的方差贡献率、平均周期、相关系数的计算及MATLAB代码实现

2.14 Mr.看海:“类EMD”算法分解后要怎样使用(2)——高频、低频、趋势项分量判别与重构,及MATLAB代码实现

【滤波降噪专题】相关文章:

4.1 Mr.看海:【滤波专题-第1篇】数字滤波器15分钟入门!——这可能是最简单的FIR有限冲激响应滤波讲解

4.2 Mr.看海:【滤波专题-第2篇】数字滤波器15分钟入门!——这可能是最简单的IIR无限冲激响应滤波讲解

4.3 Mr.看海:【滤波专题-第3篇】IIR无限冲激响应和FIR有限冲激响应数字滤波器有什么区别?

4.4 Mr.看海:【滤波专题-第4篇】滤波器滤波效果的评价指标(信噪比SNR、均方误差MSE、波形相似参数NCC)

4.5 Mr.看海:【滤波专题-第5篇】FIR、IIR滤波器设计及MATLAB实现

4.6 Mr.看海:【滤波专题-第6篇】小波阈值去噪方法看这一篇就明白了~(附MATLAB实现)

参考

  1. ^[1]陈仁祥,汤宝平,吕中亮.基于相关系数的EEMD转子振动信号降噪方法[J].振动.测试与诊断,2012,32(04):542-546+685.DOI:10.16450/j.cnki.issn.1004-6801.2012.04.005.
  2. ^[1]陈仁祥,汤宝平,马婧华.基于EEMD的振动信号自适应降噪方法[J].振动与冲击,2012,31(15):82-86.DOI:10.13465/j.cnki.jvs.2012.15.015.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/538013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“源擎”攻破银行核心系统建设痛点

银行业作为操作密集、数据密集、风险密集的行业,在向云转型的过程中面临着诸多独特的挑战,如银行需要具备不间断的业务创新能力,而不被系统开发周期制约;单一系统的开发和升级方式,越来越难以满足日益综合化的业务创新…

chatgpt赋能Python-pycharm关联python

Pycharm关联Python的介绍 Pycharm是一种非常流行的Python集成开发环境,开发人员可以在其中编写、调试和运行Python代码。Pycharm具有许多有用的功能,这些功能可以大大提高代码的效率和质量。其中一个最重要的功能是Pycharm如何关联Python,这…

HTB靶机012-Valentine-WP

012-Valentine 靶机IP:10.10.10.79 Scan nmap端口扫描: ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.79 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-29 00:47 CST Nmap scan report for 10.10.10.79 Host is up (0.30s…

chatgpt赋能Python-pycharm和python关联

PyCharm与Python:超越代码编写的完美结合 如果你是一位Python开发者,那么你肯定需要一个好用的开发环境,以便快速且高效地完成代码任务。而PyCharm就是这样一个优秀的Python开发IDE。它专注于提高Python开发速度和质量,让Python编…

Flowable 生成的表都是干嘛的?(一)

一.简介 Flowable 默认一共生成了 79 张数据表,了解这些数据表,有助于我们更好的理解 Flowable 中的各种 API。 接下来我们就对这 79 张表进行一个简单的分类整理。 ACT_APP_*(5)ACT_CMMN_*(12)ACT_CO_*…

chatgpt赋能Python-pycharm取消所有断点

Pycharm取消所有断点:提高编程效率的必备技巧 Pycharm作为Python程序员必备的开发工具之一,其强大的调试功能广受好评。但是,在开发过程中,我们可能会设置过多的断点或者设置了错误的断点,这样会让程序的运行速度变慢…

Java面向对象程序设计实验报告(实验四 抽象类的练习)

✨作者:命运之光 ✨专栏:Java面向对象程序设计实验报告 ​ 目录 ✨一、需求设计 ✨二、概要设计 ✨三、详细设计 ✨四、调试结果 ✨五、测试结果 ✨附录:源程序代码(带注释) demo4类 Car类 Circle类 Shape…

谷歌chrome浏览器无法自动播放video标签视频的问题

问题根源详见:Chrome中的自动播放政策>> https://developer.chrome.com/blog/autoplay/ The Autoplay Policy launched in Chrome 66 for audio and video elements and is effectively blocking roughly half of unwanted media autoplays in Chrome. For t…

基于数组实现的顺序表(SeqList)

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。 它的详细定义如下: 顺序表是一种数据结构,用于存储一组具有相同数据类型的元素,并按照元素在内存中的…

数据库【库,表操作】

目录 简单了解1.连接数据库服务器2.创建数据库3.创建表4.使用数据库5.数据库框架6.SQL的分类7.存储引擎 库操作1.创建数据库2.查看系统默认字符集以及校验规则3.查看数据库支持的字符集和校验规则4.查看数据库5.显示数据库语句6.删除数据库7.修改数据库8.备份和恢复9.查看连接情…

20 SQL——多表查询 (消除无效笛卡尔积)

create table dept(id int primary key auto_increment,name varchar(15))comment 部门;insert into dept(id, name) values (1,研发部),(2,市场部),(3,财务部),(4,销售部),(5,总经办),(6,人事部);create table staff (id int primary key auto_increment commentID,name …

【面试篇】Redis持久化面试题

文章目录 Redis持久化🙎‍♂️面试官:什么是Redis持久化? AOF日志AOF日志原理🙎‍♂️面试官:AOF日志是怎么工作的/AOF写入磁盘的流程?🙎‍♂️面试官: 刚刚说到了Redis先执行写入的…

Discourse Math 插件

概述Discourse Math 使用 MathJax (默认) 或者 KaTeX 来让你在你的 Discourse 中使用数学公式。 仓库链接GitHub - discourse/discourse-math: Official MathJax support for Discourse Install Guide如何在 Discourse 中安装插件 这个插件是 Discourse 官方提供的插件&#x…

javascript基础一:Javscript数组的常用方法有哪些?

在日常开发中,我们对数组可以说操作最多,这里我们来整理下数组的一下最常用的方法 数组基本操作可以归纳为 增、删、改、查,需要留意的是哪些方法会对原数组产生影响,哪些方法不会 下面对数组常用的操作方法做一个归纳 一、基本…

ChatGPT国内免费使用的方法有哪些?

目录 一、ChatGpt是什么? 二、ChatGPT国内免费使用的方法: 第一点:电脑端 第二点:手机端 三、结语: 一、ChatGpt是什么? ChatGPt是美国OpenAI [1] 研发的聊天机器人程序 。更是人工智能技术驱动的自然语…

【C++数据结构】二叉搜索树的使用和模拟实现及其应用--K模型和KV模型

文章目录 一、二叉搜索树的概念二、二叉搜索树的操作及其实现(非递归)1.二叉搜索树节点和类的定义2.二叉搜索树的构造函数3.二叉搜索树的拷贝构造4.二叉树搜索树的赋值重载5.二叉搜索树的析构函数6.二叉搜索树的中序遍历7.二叉搜索树的查找8.二叉搜索树的插入9.二叉搜索树的删除…

瑞吉外卖 - 分页查询分类功能(12)

某马瑞吉外卖单体架构项目完整开发文档,基于 Spring Boot 2.7.11 JDK 11。预计 5 月 20 日前更新完成,有需要的胖友记得一键三连,关注主页 “瑞吉外卖” 专栏获取最新文章。 相关资料:https://pan.baidu.com/s/1rO1Vytcp67mcw-PD…

【Android 面经分享】阿里技术专家的 5年 Android 开发的求职之路

作者:yechaoa 来源:https://juejin.cn/post/6996551155220217869 前言 前段时间在看机会,本文就是我对求职过程的一个总结。 同时,也作为一个面试官,来说说求职中需要注意的点。 各大厂的面试会考核哪些知识点5年开发应该具备哪些技术要点…

chatgpt赋能Python-pycharm取消venv

PyCharm取消venv:一种更简便的虚拟环境管理方式 虚拟环境是Python开发中的重要组成部分之一。它可以让您在同一台机器上使用不同的Python版本、不同的库以及不同的项目而不会干扰彼此之间的功能独立性。而在Python开发中,venv是创建虚拟环境的常用方式之…

chatgpt赋能Python-pycharm怎么关联

Pycharm怎么关联——提高Python开发效率的关键步骤 作为一名有10年Python编程经验的工程师,我深知在日常开发中如何提高Python的编程效率至关重要。而Pycharm则是Python领域最常用的IDE之一,其强大的代码编辑和调试功能,深受开发者的喜爱。 …