C++ 双峰高斯函数拟合

C++ 双峰高斯函数拟合

    • 一维高斯函数
    • 二维高斯函数
    • 多维高斯函数
    • 一维双峰高斯函数
      • 代码实现
    • 二维双峰高斯函数
      • 代码实现
    • 多维多峰高斯函数

在数据分析与清洗中经常遇到这样的数据:数据不仅仅向单个中心靠拢,而是类似分段的向两个甚至多个中心靠拢。数据向单个中心靠拢时,可以简单地用高斯函数去拟合,得到相关参数,那么可以通过3sigma准则对数据进行去噪以为后续处理做准备。当数据向两个中心靠拢时,单峰高斯函数就不再适用了,这时候就需要双峰高斯函数出马了。

高斯函数(Gaussian Function)是一种常见的数学函数,广泛应用于概率论、统计学、信号处理、图像处理等领域。


一维高斯函数

一维高斯函数的公式为:
f ( x ) = A ⋅ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f(x)=A\cdot\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) f(x)=Aexp(2σ2(xμ)2)

参数说明:

  • A A A:振幅(Amplitude),控制函数的最大值。
  • μ \mu μ:均值(Mean),表示函数的中心位置(即峰值所在的位置)。
  • σ \sigma σ:标准差(Standard Deviation),控制函数的宽度(越小越尖锐,越大越平缓)。
  • x x x:自变量。

归一化形式:
如果需要将高斯函数归一化(使其在 ( − ∞ -\infty ) 到 ( + ∞ +\infty +) 的积分等于 1),则公式变为:
f ( x ) = 1 2 π σ ⋅ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f(x)=\frac{1}{\sqrt{2\pi}\sigma}\cdot\exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right) f(x)=2π σ1exp(2σ2(xμ)2)
此时,( A = \frac{1}{\sqrt{2\pi}\sigma} )。


二维高斯函数

二维高斯函数通常用于描述二维空间中的分布,例如图像处理中的模糊滤波器。其公式为:
f ( x , y ) = A ⋅ exp ⁡ ( − ( x − x 0 ) 2 2 σ x 2 − ( y − y 0 ) 2 2 σ y 2 ) f(x,y)=A\cdot\exp\left(-\frac{(x-x_0)^2}{2\sigma_x^2}-\frac{(y-y_0)^2}{2\sigma_y^2}\right) f(x,y)=Aexp(2σx2(xx0)22σy2(yy0)2)

各向同性高斯函数
当 ( \sigma_x = \sigma_y = \sigma ) 时,二维高斯函数变为:
f ( x , y ) = A ⋅ exp ⁡ ( − ( x − x 0 ) 2 + ( y − y 0 ) 2 2 σ 2 ) f(x,y)=A\cdot\exp\left(-\frac{(x-x_0)^2+(y-y_0)^2}{2\sigma^2}\right) f(x,y)=Aexp(2σ2(xx0)2+(yy0)2)


多维高斯函数

对于 n 维高斯函数,其通用形式为:

f ( x ) = A ⋅ exp ⁡ ( − 1 2 ( x − μ ) ⊤ Σ − 1 ( x − μ ) ) f(\mathbf{x}) = A \cdot \exp\left(-\frac{1}{2} (\mathbf{x} - \boldsymbol{\mu})^\top \Sigma^{-1} (\mathbf{x} - \boldsymbol{\mu})\right) f(x)=Aexp(21(xμ)Σ1(xμ))

参数说明:

  • x \mathbf{x} x:( n )-维向量,表示自变量。
  • μ \boldsymbol{\mu} μ:( n )-维向量,表示均值。
  • Σ \Sigma Σ:协方差矩阵,控制分布的形状和方向。
  • Σ − 1 \Sigma^{-1} Σ1:协方差矩阵的逆矩阵。

各向同性多维高斯函数
当协方差矩阵为对角矩阵且所有对角元素相等时(即 Σ = σ 2 I \Sigma = \sigma^2 I Σ=σ2I,其中 I I I 是单位矩阵),公式简化为:
f ( x ) = A ⋅ exp ⁡ ( − ∥ x − μ ∥ 2 2 σ 2 ) f(\mathbf{x}) = A \cdot \exp\left(-\frac{\|\mathbf{x} - \boldsymbol{\mu}\|^2}{2\sigma^2}\right) f(x)=Aexp(2σ2xμ2)
其中 ∥ x − μ ∥ \|\mathbf{x} - \boldsymbol{\mu}\| xμ 表示欧几里得距离。


一维双峰高斯函数

对于双峰高斯函数,我们可以将其视为两个这样的高斯函数的叠加,每个都有自己的振幅,均值及标准差。因此,双峰高斯函数的形式可以表示为:

f ( x ) = A 1 exp ⁡ ( − ( x − μ 1 ) 2 2 σ 1 2 ) + A 2 exp ⁡ ( − ( x − μ 2 ) 2 2 σ 2 2 ) f(x) = A_1 \exp\left(-\frac{(x-\mu_1)^2}{2\sigma_1^2}\right) + A_2 \exp\left(-\frac{(x-\mu_2)^2}{2\sigma_2^2}\right) f(x)=A1exp(2σ12(xμ1)2)+A2exp(2σ22(xμ2)2)

可以用于拟合或描述具有双峰特性的数据集。


代码实现

这里基于ceres,在C++中对双峰高斯拟合进行实现。
思路很简单,输入一维的数据和直方图的宽度,构建直方图,然后通过直方图的顶端坐标来拟合双峰高斯函数,稍微麻烦的是找到合适的初始值:

  1. 建直方图
  2. 确定初值
  3. 优化求解
struct BimodalGaussianResidual
{BimodalGaussianResidual(double x, double y) : x_(x), y_(y){}template <typename T>bool operator()(const T* const params, T* residual) const{const T A1 = params[0];const T mu1 = params[1];const T sigma1 = params[2];const T A2 = params[3];const T mu2 = params[4];const T sigma2 = params[5];T f1 = A1 * ceres::exp(-(x_ - mu1) * (x_ - mu1) / (T(2) * sigma1 * sigma1));T f2 = A2 * ceres::exp(-(x_ - mu2) * (x_ - mu2) / (T(2) * sigma2 * sigma2));residual[0] = y_ - (f1 + f2);return true;}private:const double x_;const double y_;
};bool FitBimodalGaussian(std::vector<float>& data, double* params, const double  bin_width)
{//==========================建直方图==========================double min_val = *std::min_element(data.begin(), data.end());double max_val = *std::max_element(data.begin(), data.end());std::map<double, int> histogram;for (double value : data){double bin = std::floor((value - min_val) / bin_width) * bin_width; // 找到所属的binhistogram[bin]++;}std::vector<double> x_data;std::vector<double> heights;for (const auto& entry : histogram){x_data.push_back(entry.first + min_val + 0.5 * bin_width);heights.push_back(entry.second);}//==========================确定初值==========================// 找到直方图中的两个峰值double max_height1 = 0, max_height2 = 0;double mu1 = 0, mu2 = 0;size_t peak1_index = 0; // 第一个峰值的索引// 找第一个峰值for (size_t i = 0; i < heights.size(); ++i){if (heights[i] > max_height1){max_height1 = heights[i];mu1 = x_data[i];peak1_index = i;}}// 找第二个峰值(避开第一个峰值附近的区域)const double separation_threshold = 5; // 峰值之间的最小距离      // 根据数据确定for (size_t i = 0; i < heights.size(); ++i){if (std::abs(x_data[i] - mu1) > separation_threshold && heights[i] > max_height2){max_height2 = heights[i];mu2 = x_data[i];}}// 估计标准差 sigma1 和 sigma2double sigma1 = 0.5, sigma2 = 0.5; // 初始猜测值const double half_max_height1 = max_height1 / 2.0;const double half_max_height2 = max_height2 / 2.0;// 找第一个峰值的半高宽double left_edge1 = mu1, right_edge1 = mu1;for (size_t i = 0; i < x_data.size(); ++i){if (x_data[i] < mu1 && heights[i] >= half_max_height1){left_edge1 = x_data[i];}if (x_data[i] > mu1 && heights[i] >= half_max_height1){right_edge1 = x_data[i];break;}}sigma1 = (right_edge1 - left_edge1) / (2 * std::sqrt(2 * std::log(2)));// 找第二个峰值的半高宽double left_edge2 = mu2, right_edge2 = mu2;for (size_t i = 0; i < x_data.size(); ++i){if (x_data[i] < mu2 && heights[i] >= half_max_height2){left_edge2 = x_data[i];}if (x_data[i] > mu2 && heights[i] >= half_max_height2){right_edge2 = x_data[i];break;}}sigma2 = (right_edge2 - left_edge2) / (2 * std::sqrt(2 * std::log(2)));// 设置初始参数 [A1, mu1, sigma1, A2, mu2, sigma2]params[0] = max_height1;params[1] = mu1;params[2] = sigma1;params[3] = max_height2;params[4] = mu2;params[5] = sigma2;#if MY_LOGstd::cout << std::fixed << std::setprecision(6);std::cout << "\nInitial Parameters:" << std::endl;std::cout << "A1 = " << params[0] << ", mu1 = " << params[1] << ", sigma1 = " << params[2] << std::endl;std::cout << "A2 = " << params[3] << ", mu2 = " << params[4] << ", sigma2 = " << params[5] << std::endl;
#endif//==========================优化求解==========================ceres::Problem problem;for (size_t i = 0; i < x_data.size(); ++i){problem.AddResidualBlock(new ceres::AutoDiffCostFunction<BimodalGaussianResidual, 1, 6>(new BimodalGaussianResidual(x_data[i], heights[i])), nullptr, params);}ceres::Solver::Options options;options.linear_solver_type = ceres::DENSE_QR;options.minimizer_progress_to_stdout = false;ceres::Solver::Summary summary;ceres::Solve(options, &problem, &summary);#if MY_LOGstd::cout << "\nFinal Parameters:\n";std::cout << "A1: " << params[0] << ", mu1: " << params[1] << ", sigma1: " << params[2] << "\n";std::cout << "A2: " << params[3] << ", mu2: " << params[4] << ", sigma2: " << params[5] << "\n";
#endifreturn true;
}

用一组真实数据测试,可得:

Initial Parameters:
A1 = 16223.000000, mu1 = -1.018652, sigma1 = 0.084932
A2 = 2868.000000, mu2 = 7.181348, sigma2 = 0.084932Final Parameters:
A1: 15804.267874, mu1: -1.138264, sigma1: 0.744859
A2: 2530.132897, mu2: 6.820187, sigma2: 0.759935

在这里插入图片描述

二维双峰高斯函数

类似的,二维双峰高斯函数可表达式如下:
f ( x , y ) = A 1 exp ⁡ ( − ( x − μ 1 x ) 2 2 σ 1 x 2 − ( y − μ 1 y ) 2 2 σ 1 y 2 ) + A 2 exp ⁡ ( − ( x − μ 2 x ) 2 2 σ 2 x 2 − ( y − μ 2 y ) 2 2 σ 2 y 2 ) f(x, y) = A_1 \exp\left(-\frac{(x-\mu_{1x})^2}{2\sigma_{1x}^2} - \frac{(y-\mu_{1y})^2}{2\sigma_{1y}^2}\right) + A_2 \exp\left(-\frac{(x-\mu_{2x})^2}{2\sigma_{2x}^2} - \frac{(y-\mu_{2y})^2}{2\sigma_{2y}^2}\right) f(x,y)=A1exp(2σ1x2(xμ1x)22σ1y2(yμ1y)2)+A2exp(2σ2x2(xμ2x)22σ2y2(yμ2y)2)

代码实现

#include <iostream>
#include <vector>
#include <cmath>
#include <random>
#include <map>
#include <iomanip>  
#include "ceres/ceres.h"
#include "gnuplot-iostream.h"// 二维双峰高斯残差函数
struct BimodalGaussianResidual2D
{BimodalGaussianResidual2D(double x, double y, double z) : x_(x), y_(y), z_(z){}template <typename T>bool operator()(const T* const params, T* residual) const{const T A1 = params[0];const T mu1_x = params[1];const T mu1_y = params[2];const T sigma1_x = params[3];const T sigma1_y = params[4];const T A2 = params[5];const T mu2_x = params[6];const T mu2_y = params[7];const T sigma2_x = params[8];const T sigma2_y = params[9];T f1 = A1 * ceres::exp(-(T(x_ - mu1_x) * T(x_ - mu1_x) / (T(2) * sigma1_x * sigma1_x) +T(y_ - mu1_y) * T(y_ - mu1_y) / (T(2) * sigma1_y * sigma1_y)));T f2 = A2 * ceres::exp(-(T(x_ - mu2_x) * T(x_ - mu2_x) / (T(2) * sigma2_x * sigma2_x) +T(y_ - mu2_y) * T(y_ - mu2_y) / (T(2) * sigma2_y * sigma2_y)));residual[0] = z_ - (f1 + f2);return true;}private:const double x_;const double y_;const double z_;
};// 二维双峰高斯数据生成
void GenerateBimodalGaussianData(std::vector<double>& x_data, std::vector<double>& y_data, std::vector<double>& z_data,double A1, double mu1_x, double mu1_y, double sigma1_x, double sigma1_y,double A2, double mu2_x, double mu2_y, double sigma2_x, double sigma2_y,int num_points, double noise_level)
{std::default_random_engine generator;std::normal_distribution<double> distribution(0.0, noise_level);for (int i = 0; i < num_points; ++i){double x = static_cast<double>(rand()) / RAND_MAX * 10.0 - 5.0; // 范围 [-5, 5]double y = static_cast<double>(rand()) / RAND_MAX * 10.0 - 5.0; // 范围 [-5, 5]double f1 = A1 * exp(-(pow(x - mu1_x, 2) / (2 * pow(sigma1_x, 2)) +pow(y - mu1_y, 2) / (2 * pow(sigma1_y, 2))));double f2 = A2 * exp(-(pow(x - mu2_x, 2) / (2 * pow(sigma2_x, 2)) +pow(y - mu2_y, 2) / (2 * pow(sigma2_y, 2))));double z = f1 + f2 + distribution(generator); // 添加噪声x_data.push_back(x);y_data.push_back(y);z_data.push_back(z);}
}// 二维双峰高斯函数拟合
bool FitBimodalGaussian2D(const std::vector<double>& x_data, const std::vector<double>& y_data, const std::vector<double>& z_data, double* params)
{ceres::Problem problem;for (size_t i = 0; i < x_data.size(); ++i){problem.AddResidualBlock(new ceres::AutoDiffCostFunction<BimodalGaussianResidual2D, 1, 10>(new BimodalGaussianResidual2D(x_data[i], y_data[i], z_data[i])),nullptr, params);}ceres::Solver::Options options;options.linear_solver_type = ceres::DENSE_QR;options.minimizer_progress_to_stdout = false;ceres::Solver::Summary summary;ceres::Solve(options, &problem, &summary);return true;
}int main()
{//==========================数据生成==========================std::vector<double> x_data, y_data, z_data;int num_points = 1000;double noise_level = 0.2;double A1_true = -3.0, mu1_x_true = -2.0, mu1_y_true = 2.0, sigma1_x_true = 1.0, sigma1_y_true = 1.0;double A2_true = 5.0, mu2_x_true = 2.0, mu2_y_true = -2.0, sigma2_x_true = 1.5, sigma2_y_true = 1.5;GenerateBimodalGaussianData(x_data, y_data, z_data,A1_true, mu1_x_true, mu1_y_true, sigma1_x_true, sigma1_y_true,A2_true, mu2_x_true, mu2_y_true, sigma2_x_true, sigma2_y_true,num_points, noise_level);//==========================确定初值==========================double initial_params[] = { A1_true, mu1_x_true, mu1_y_true,  sigma1_x_true, sigma1_y_true, A2_true , mu2_x_true ,  mu2_y_true, sigma2_x_true, sigma2_y_true };// 添加随机噪声std::random_device rd;std::mt19937 gen(rd());std::normal_distribution<> d(0, 2*noise_level);for (int i = 0; i < 10;++i)initial_params[i]+= d(gen);//==========================优化求解==========================std::cout << "\nInitial Parameters:\n";std::cout << "A1: " << initial_params[0] << ", mu1_x: " << initial_params[1] << ", mu1_y: " << initial_params[2] << ", sigma1_x: " << initial_params[3] << ", sigma1_y: " << initial_params[4] << "\n";std::cout << "A2: " << initial_params[5] << ", mu2_x: " << initial_params[6] << ", mu2_y: " << initial_params[7] << ", sigma2_x: " << initial_params[8] << ", sigma2_y: " << initial_params[9] << "\n";FitBimodalGaussian2D(x_data, y_data, z_data, initial_params);std::cout << "\nFinal Fitted Parameters:\n";std::cout << "A1: " << initial_params[0] << ", mu1_x: " << initial_params[1] << ", mu1_y: " << initial_params[2] << ", sigma1_x: " << initial_params[3] << ", sigma1_y: " << initial_params[4] << "\n";std::cout << "A2: " << initial_params[5] << ", mu2_x: " << initial_params[6] << ", mu2_y: " << initial_params[7] << ", sigma2_x: " << initial_params[8] << ", sigma2_y: " << initial_params[9] << "\n";//==========================图形绘制==========================// 将数据传递给 Gnuplot 并绘制std::vector<std::tuple<double, double, double>> data;for (size_t i = 0; i < x_data.size(); ++i){data.emplace_back(x_data[i], y_data[i], z_data[i]);}auto format_param = [](double value){std::ostringstream oss;oss << std::fixed << std::setprecision(3) << value;return oss.str();};Gnuplot gp;// 设置绘图标题和坐标轴标签gp << "set terminal wxt enhanced\n";    // 使用支持交互的终端gp << "set mouse\n";                    // 启用鼠标交互gp << "set title 'BimodalGaussian2D Fit'\n";gp << "set xlabel 'X'\n";gp << "set ylabel 'Y'\n";gp << "set zlabel 'Z'\n";// 设置绘图为三维模式gp << "set style data points\n";    // 使用点样式gp << "set ticslevel 0\n";          // 调整 Z 轴刻度位置gp << "set isosamples 100,100\n";   // 设置采样数量gp << "set hidden3d\n";             // 隐藏被遮挡区域gp << "splot '-' with points pointtype 7 pointsize 0.5 title 'Scatter Points', "<< format_param(initial_params[0]) << "*exp(-((x - " << format_param(initial_params[1])<< ")**2/(2*" << format_param(initial_params[3]) << "**2) + (y - " << format_param(initial_params[2])<< ")**2/(2*" << format_param(initial_params[4]) << "**2))) "<< "+ " << format_param(initial_params[5]) << "*exp(-((x - " << format_param(initial_params[6])<< ")**2/(2*" << format_param(initial_params[8]) << "**2) + (y - " << format_param(initial_params[7])<< ")**2/(2*" << format_param(initial_params[9]) << "**2)))\n";gp.send(data);gp.flush();return 0;
}

在真值基础上添加2倍随机噪声的初值及拟合结果如下所示,可以看到其拟合得相当准确的。

Initial Parameters:
A1: -3.11395, mu1_x: -2.43491, mu1_y: 1.9397, sigma1_x: 1.21568, sigma1_y: 1.3008
A2: 4.93584, mu2_x: 2.1473, mu2_y: -1.74558, sigma2_x: 1.88884, sigma2_y: 1.73732Final Fitted Parameters:
A1: -3.00556, mu1_x: -2.01663, mu1_y: 1.98635, sigma1_x: 0.96315, sigma1_y: 1.01506
A2: 4.95913, mu2_x: 2.01769, mu2_y: -2.01035, sigma2_x: 1.49838, sigma2_y: 1.49798

在这里插入图片描述

在这里插入图片描述


多维多峰高斯函数

同样,理论上也可以发散到多维多峰高斯函数的情形,不过一方面这种情况比较少见,另一方面高维的初值一般不好自动确定,可能应用得很少,这里不再作说明和演示。


补充
对ceres拟合感兴趣可移步C++ 带约束的Ceres形状拟合。
对gnuplot绘制感兴趣可移步如何在C++中优雅地绘制图表。


打完收工。

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

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

相关文章

【RP2350】香瓜树莓派RP2350之LED

本文最后修改时间&#xff1a;2025年05月10日 01:57 一、本节简介 本节以树莓派pico2开发板为例&#xff0c;举例如何写一个LED驱动加进工程里。 二、实验平台 1、硬件平台 1&#xff09;树莓派pico2开发板 ①树莓派pico2开发板&#xff08;作为仿真器&#xff09; ②micr…

机器人运动控制原理浅析-UC Berkeley超视觉模态模型

加州伯克利发布的超视觉多感知模态融合(FuSe, Fuse Heterogeneous Sensory Data)模型&#xff0c;基于视觉、触觉、听觉、本体及语言等模态&#xff0c;利用自然语言跨模态对齐(Cross-Modal Grounding)优调视觉语言动作等通用模型&#xff0c;提高模型任务成功率。 总体框架 …

【Bootstrap V4系列】学习入门教程之 组件-媒体对象(Media object)

Bootstrap V4系列 学习入门教程之 组件-媒体对象&#xff08;Media object&#xff09; 媒体对象&#xff08;Media object&#xff09;一、Example二、Nesting 嵌套三、Alignment 对齐四、Order 顺序五、Media list 媒体列表 媒体对象&#xff08;Media object&#xff09; B…

解决VirtualBox中虚拟机(ubuntu)与主机(windows)之间互相复制粘贴(文本)

一.开始的设置 1.在VirtualBox中打开设置&#xff0c;常规中修改主机与虚拟机交互设置 2.虚拟机关闭状态下&#xff0c;存储中选中控制器SATA&#xff0c;勾选‘使用主机输入输出’ 3.选中操作系统对应的虚拟文件&#xff0c;.vdi文件&#xff0c;勾选右边的固态驱动器。 4.启…

java 多核,多线程,分布式 并发编程的现状 :从本身的jdk ,到 spring ,到其它第三方。

Java 在多核、多线程和高性能编程领域提供了丰富的现成框架和工具&#xff0c;既有标准库中的并发组件&#xff0c;也有第三方框架。以下是一些关键框架及其应用场景的总结&#xff1a;便于后面我们站在巨人的肩膀上&#xff0c;继续前行 一、Java 标准库中的多线程框架 Execut…

Nodejs核心机制

文章目录 前言 前言 结合 Node.js 的核心机制进行说明&#xff1a; 解释事件循环的各个阶段。 答案 Node.js 事件循环分为 6 个阶段&#xff0c;按顺序执行&#xff1a; Timers&#xff1a;执行 setTimeout 和 setInterval 的回调。 Pending I/O Callbacks&#xff1a;处理系…

C++笔记6:数字字面量后缀和前缀总结

在C中&#xff0c;可以在数字字面量后面添加字母后缀&#xff08;或前缀&#xff09;来表示特定的数据类型。这些后缀能够明确指定字面量的类型&#xff0c;避免类型转换带来的潜在问题。以下是常见的几种类型后缀及其含义&#xff1a; 1. 整数后缀 u 或 U&#xff1a;表示 u…

50.辐射抗扰RS和传导抗扰CS测试环境和干扰特征分析

辐射抗扰RS和传到抗扰CS测试环境和干扰特征分析 1. 辐射抗扰RS2. 传导抗扰CS 1. 辐射抗扰RS 辐射抗扰RS考察对外界电磁场干扰得抗扰能力&#xff0c;测试频段为80MHz~2000MHz&#xff0c;用1KHz得正弦波进行调幅&#xff0c;在电波暗室内进行。测试标准&#xff1a;IEC 61000-…

Java多态详解

Java多态详解 什么是多态&#xff1f; 比如我们说&#xff1a;“驾驶一辆车”&#xff0c;有人开的是自行车&#xff0c;有人开的是摩托车&#xff0c;有人开的是汽车。虽然我们都说“开车”&#xff0c;但“怎么开”是由具体的车类型决定的&#xff1a;“开”是统一的动作&a…

问题及解决01-面板无法随着窗口的放大而放大

在MATLAB的App Designer中&#xff0c;默认情况下&#xff0c;组件的位置是固定的&#xff0c;不会随着父容器的大小变化而改变。问题图如下图所示。 解决&#xff1a; 为了让Panel面板能够随着UIFigure父容器一起缩放&#xff0c;需要使用布局管理器&#xff0c;我利用 MATLA…

【GESP真题解析】第 20 集 GESP 二级 2025 年 3 月编程题 2:时间跨越

大家好,我是莫小特。 这篇文章给大家分享 GESP 二级 2025 年 3 月编程题第 2 题:时间跨越。 题目链接 洛谷链接:B4260 时间跨越 一、完成输入 根据题意,输入包含五行,每行一个正整数,分别代表 y,m,d,h,k。 注意到数据范围:对于全部数据,保证有 2000≤y≤3000,1≤m≤…

GTS-400 系列运动控制器板卡介绍(二十一)---电子齿轮跟随

运动控制器函数库的使用 运动控制器驱动程序、dll 文件、例程、Demo 等相关文件请通过固高科技官网下载,网 址为:www.googoltech.com.cn/pro_view-3.html 1 Windows 系统下动态链接库的使用 在 Windows 系统下使用运动控制器,首先要安装驱动程序。在安装前需要提前下载运动…

软件工程之需求分析涉及的图与工具

需求分析与规格说明书是一项十分艰巨复杂的工作。用户与分析员之间需要沟通的内容非常的多&#xff0c;在双方交流信息的过程中很容易出现误解或遗漏&#xff0c;也可能存在二义性。如何才能更加准确的表达双方的意思&#xff0c;且清楚明了&#xff0c;绘制各类图形就显得非常…

蓝桥杯14届 数三角

问题描述 小明在二维坐标系中放置了 n 个点&#xff0c;他想在其中选出一个包含三个点的子集&#xff0c;这三个点能组成三角形。然而这样的方案太多了&#xff0c;他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形&#xff1f; 输…

在Fiddler中添加自定义HTTP方法列并高亮显示

在Fiddler中添加自定义HTTP方法列并高亮显示 Fiddler 是一款强大的 Web 调试代理工具&#xff0c;允许开发者检查和操作 HTTP 流量。一个常见需求是自定义 Web Sessions 列表&#xff0c;添加显示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通过颜色区…

数据库分库分表实战指南:从原理到落地

1. 为什么要分库分表&#xff1f; 1.1 单库瓶颈表现 存储瓶颈&#xff1a;单表数据超过5000万行&#xff0c;查询性能急剧下降性能瓶颈&#xff1a;单库QPS超过5000后响应延迟显著增加可用性风险&#xff1a;单点故障导致全系统不可用 1.2 突破性优势 --------------------…

Selenium的driver.get_url 和 手动输入网址, 并点击的操作,有什么不同?

我在搞爬取的时候&#xff0c;发现有些网站直接用driver.get(url) 跳转到目标特定的网址的时候&#xff0c;会被强制跳转到其他的网址上&#xff0c;但是如果是自己手动&#xff0c;在网址栏那里输入网址&#xff0c;并点回车&#xff0c;却能完成跳转。 这是在使用 Selenium …

Java【06】数组查找(二分查找)、排序(冒泡排序、简单选择排序)

1. 数组的操作 1.1 数组的反转 int[] arrs{3,5,7,8,9}; 编写程序&#xff0c;让arrs中的数据进行反转{9,8,7,5,3} 1.2数组的查找 ① 顺序查找 从头到尾一个一个的找&#xff01; ② 二分查找 对数组有一个要求&#xff1a;数组必须是有序(大小)的&#xff01; int num3; int[]…

Redis 基础详解:从入门到精通

在当今互联网应用开发领域&#xff0c;数据存储与处理的性能和效率至关重要。Redis&#xff08;Remote Dictionary Server&#xff09;作为一款开源的、基于内存的键值存储系统&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;被广泛应用于数据库、缓存、消息中间件等场景…

图片转ICO图标工具

图片转ICO图标 可批量操作 下载地址&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/6312c565ec98 这个工具是一个批量图片转ICO图标的神器&#xff0c;有了它&#xff0c;以后再也不用为ICO格式的转换烦恼&#xff01;而且这个软件特别小巧&#xff0c;完全不用安装。…