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

01 LM 算法及 Cpp 实现

文章目录

    • 01 LM 算法及 Cpp 实现
      • 1.1 应用
      • 1.2 阻尼法推导
      • 1.3 Cpp 算法实现

01 LM 算法及 Cpp 实现

1.1 应用

LM 算法用于解决非线性最小二乘问题

min ⁡ x F ( x ) = 1 2 ∥ f ( x ) ∥ 2 2 (1) \min _x F(x)=\frac{1}{2}\|f(\boldsymbol{x})\|_2^2 \tag{1} xminF(x)=21f(x)22(1)

其中, f ( x ) f(\boldsymbol{x}) f(x) 是指各项的残差。

LM 算法有两种推导方式,即 阻尼法置信域 法(见《十四讲》),这里用阻尼法进行推导。

1.2 阻尼法推导

(1)一阶泰勒展开近似

f ( x ) f(\boldsymbol{x}) f(x) x n \boldsymbol{x_n} xn 处一阶泰勒展开(把 Δ x \Delta \boldsymbol{x} Δx 看做未知数),

f ( x n + Δ x ) ≈ f ( x n ) + J ( x n ) Δ x (2) f(\boldsymbol{x_n}+\Delta \boldsymbol{x}) \approx f(\boldsymbol{x_n})+\boldsymbol{J}\left(\boldsymbol{x}_n\right) \Delta \boldsymbol{x} \tag{2} f(xn+Δx)f(xn)+J(xn)Δx(2)

那么问题转化为,对于每次迭代,求解最优的 Δ x \Delta \boldsymbol{x} Δx

Δ x ∗ = arg ⁡ min ⁡ Δ x 1 2 ∥ f ( x n ) + J n ( x n ) Δ x ∥ 2 (3) \Delta \boldsymbol{x}^*=\arg \min _{\Delta \boldsymbol{x}} \frac{1}{2}\left\|f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}_{\boldsymbol{n}}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}\right\|^2 \tag{3} Δx=argΔxmin21f(xn)+Jn(xn)Δx2(3)

(2)加入阻尼项

Δ x ∗ = arg ⁡ min ⁡ Δ x M ( Δ x ) = 1 2 ∥ f ( x n ) + J n ( x n ) Δ x ∥ 2 + 1 2 μ Δ x T Δ x (4) \Delta \boldsymbol{x}^*=\arg \min _{\Delta \boldsymbol{x}} M(\Delta \boldsymbol{x})=\frac{1}{2}\left\|f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}_{\boldsymbol{n}}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}\right\|^2+\frac{1}{2} \mu \Delta \boldsymbol{x}^T \Delta \boldsymbol{x} \tag{4} Δx=argΔxminM(Δx)=21f(xn)+Jn(xn)Δx2+21μΔxTΔx(4)

其中, μ \mu μ 为阻尼系数,阻尼项 1 2 μ Δ x T Δ x \frac{1}{2} \mu \Delta \boldsymbol{x}^T \Delta \boldsymbol{x} 21μΔxTΔx 可以看做是对于过大的 Δ x \Delta \boldsymbol{x} Δx 的惩罚。

(3)求极值

Δ x \Delta \boldsymbol{x} Δx 求导,并令其等于零,

J ( x n ) T f ( x n ) + J ( x n ) T J ( x n ) Δ x + μ Δ x = 0 (5) \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \Delta \boldsymbol{x}+\mu \Delta \boldsymbol{x}=\mathbf{0} \tag{5} J(xn)Tf(xn)+J(xn)TJ(xn)Δx+μΔx=0(5)

Δ x ∗ = − ( J ( x n ) T J ( x n ) + μ I ) − 1 J ( x n ) T f ( x n ) (6) \Delta \boldsymbol{x}^*=-\left(\boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)+\mu \boldsymbol{I}\right)^{-1} \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right) \tag{6} Δx=(J(xn)TJ(xn)+μI)1J(xn)Tf(xn)(6)

J ( x n ) T J ( x n ) = H J ( x n ) T f ( x n ) = g \begin{aligned} \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right) &=\boldsymbol{H} \\ \boldsymbol{J}\left(\boldsymbol{x}_{\boldsymbol{n}}\right)^T f\left(\boldsymbol{x}_{\boldsymbol{n}}\right) &=\boldsymbol{g} \end{aligned} J(xn)TJ(xn)J(xn)Tf(xn)=H=g

则式(6)可写为

Δ x ∗ = − ( H + μ I ) − 1 g (7) \Delta \boldsymbol{x}^*=-(\boldsymbol{H}+\mu \boldsymbol{I})^{-1} \boldsymbol{g} \tag{7} Δx=(H+μI)1g(7)

(4)阻尼系数 μ \mu μ 的调节

定义增益系数 ρ \rho ρ

ρ = f ( x + Δ x ) − f ( x ) J ( x ) T Δ x (8) \rho=\frac{f(\boldsymbol{x}+\boldsymbol{\Delta x})-f(\boldsymbol{x})}{\boldsymbol{J}(\boldsymbol{x})^T\Delta \boldsymbol{x}} \tag{8} ρ=J(x)TΔxf(x+Δx)f(x)(8)

其中,分子是实际下降的值,分母是近似下降的值。若 ρ \rho ρ 接近于 1 ,则近似效果好;若 ρ \rho ρ 太小,则说明实际减小的值远小于近似减小的值,即近似效果较差,需缩小近似范围,即增大阻尼系数 μ \mu μ; 若 ρ \rho ρ 太大,则说明实际减小的值大于近似减小的值,则需放大近似范围,即减小 μ \mu μ

两种调节方法:

if  ρ < 0.25 μ : = μ ∗ 2 else if  ρ > 0.75 μ : = μ / 3 \begin{aligned} \text { if } & \rho<0.25 \\ & \mu:=\mu * 2 \\ \text { else if } & \rho>0.75 \\ & \mu:=\mu / 3 \end{aligned}  if  else if ρ<0.25μ:=μ2ρ>0.75μ:=μ/3

也就是, ρ < 0.25 \rho<0.25 ρ<0.25 时增大阻尼系数; ρ > 0.75 \rho>0.75 ρ>0.75 时,减小阻尼系数。

或者:

i f ρ > 0 μ : = μ ∗ max ⁡ { 1 3 , 1 − ( 2 ρ − 1 ) 3 } ; ν : = 2 e l s e μ : = μ ∗ ν ; ν : = 2 ∗ ν \begin{aligned} if \rho>0 \\ &\mu:=\mu * \max \left\{\frac{1}{3}, 1-(2 \rho-1)^3\right\} ; \quad \nu:=2\\ else\\ &\mu:=\mu * \nu ; \quad \nu:=2 * \nu \end{aligned} ifρ>0elseμ:=μmax{31,1(2ρ1)3};ν:=2μ:=μν;ν:=2ν

1.3 Cpp 算法实现

两种方法差别在于 ρ \rho ρ 的分母的计算(我的更快?)。

优化目标是待定系数,把他们看做 未知数,需要计算的 step 就是这些待定系数的 step。

(1)我的方法

/***********************************************************                                          *
* Time: 2022/11/3
* Author: xiaocong
* Function: LM 算法** @ 解决的是最小二乘问题,也就是找到最优的系数使得残差最小* @ obj = A * sin(Bx) + C * cos(D*x) - F*      A * sin(Bx) + C * cos(D*x) 是目标函数*      F 是实际值*      目标是找到使 obj 最小的系数 A B C D
***********************************************************/#include <Eigen/Dense>      // 稠密矩阵
#include <Eigen/Sparse>      // 稀疏矩阵
#include <iostream>
#include <cmath>using namespace std;
using namespace Eigen;const double DERIV_STEP = 1e-5;
const int MAX_INTER = 100;#define max(a, b) (((a)>(b))?(a):(b))// 定义目标函数
double func(const VectorXd input, const VectorXd &output, const VectorXd &params, int objIndex)
{// obj = A * sin(Bx) + C * cos(D*x) - Fdouble x1 = params(0);   // params 中存储的是系数double x2 = params(1);double x3 = params(2);double x4 = params(3);double t = input(objIndex);    // input 中存储的是 xdouble f = output(objIndex);   // output 中存储的是实际值return x1 * sin(x2 * t) + x3 * cos(x4 * t) - f;    // 返回 objIndex 项的残差
}// 计算残差矩阵
VectorXd objF(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{VectorXd obj(input.rows());    // 存储所有残差,也就是残差矩阵for (int i = 0; i < input.rows(); i++)obj(i) = func(input, output, params, i);return obj;   // 返回残差矩阵
}// 残差平方和
double Func(const VectorXd &obj)
{return obj.squaredNorm() / 2.0;
}// 求某个系数在某点的导数
double Deriv(const VectorXd &input, const VectorXd &output, int objIndex, const VectorXd &params, int paraIndex)
{VectorXd para1 = params;VectorXd para2 = params;para1(paraIndex) -= DERIV_STEP;para2(paraIndex) += DERIV_STEP;double obj1 = func(input, output, para1, objIndex);double obj2 = func(input, output, para2, objIndex);return (obj2 - obj1) / (2 * DERIV_STEP);     // 该点处的导数,为求雅克比矩阵做准备
}// 计算雅克比矩阵
/***************************** 我们优化的是系数 params,把他们看做未知数,分别求导,得到雅克比矩阵* 维度:(input.rows() x params.rows())* [[df/dA df/dB df/dC df/dD]    <--- x1*  [df/dA df/dB df/dC df/dD]    <--- x2*  [.......................]*  [df/dA df/dB df/dC df/dD]]    <--- xn****************************/
MatrixXd Jacobian(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{int rowNum = input.rows();int colNum = params.rows();MatrixXd Jac(rowNum, colNum);for (int i = 0; i < rowNum; i++)for (int j = 0; j < colNum; j++)Jac(i, j) = Deriv(input, output, i, params, j);return Jac;
}//求 Hessian 矩阵对角线最大值
// Hessian 矩阵:二阶导数
double maxMatrixDiagonale(const MatrixXd &Hessian)
{int max = 0;for (int i = 0; i < Hessian.rows(); i++){if(Hessian(i, i) > max)max = Hessian(i, i);}return max;
}// 近似下降值
double linerDeltaL(const VectorXd &step, const MatrixXd &Jac)
{VectorXd L = Jac * step;return L.norm();
}void levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params)
{double epsilon = 1e-12;int iterCnt = 0;         // 迭代计数double tao = 1e-3;long long v = 2;// 求初始的 uMatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4double u = tao * maxMatrixDiagonale(H);     // Hessian 矩阵对角线最大值乘 taowhile (iterCnt < MAX_INTER)     // double 类型不能直接作比较{VectorXd obj = objF(input, output, params);    // 误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd g = Jac.transpose() * obj;     // 也就是 g,4x1VectorXd step = (H + u * MatrixXd::Identity(H.rows(), H.cols())).inverse() * g;if(step.norm() < epsilon)break;cout << "H:" << endl << H << endl;cout << "step: " << endl << step << endl;VectorXd paramsNew(params.rows());paramsNew = params - step;            // 更新 params// 计算 params 误差obj = objF(input, output, params);// 计算 paramsNew 误差VectorXd  obj_new = objF(input, output, paramsNew);double deltaF = Func(obj) - Func(obj_new);     // 求差double deltaL = linerDeltaL(step, Jac);// 计算增益系数 rhodouble rho = deltaF / deltaL;          // 实际下降值 / 近似下降值cout << "rho is; " << rho <<endl;if(rho > 0){params = paramsNew;u *= max(1.0 / 3.0, 1 - pow(2 * rho - 1, 3));v = 2;} else{u = u * v;v = v * 2;}cout << "u= " << u << "\tv= " << v << endl;iterCnt ++;cout << "Iteration " << iterCnt << " times, result is :" << endl<< params << endl;}
}int main()
{int params_num = 4;int total_data = 100;VectorXd input(total_data);VectorXd output(total_data);double A = 5, B = 1, C = 10, D = 2;    // 初始化// 生成数据for (int i = 0; i < total_data; i++){double x = 20.0 * ((rand() % 1000) / 1000.0) - 10.0;    // [-10, 10]double deltaY = 2.0 * (rand() % 1000) / 1000.0;         // 随机噪声,[0, 2]double y = A * sin(B*x) + C * cos(D*x) + deltaY;input(i) = x;output(i) = y;}VectorXd params_levenMar(params_num);params_levenMar << 3.6, 1.3, 7.2, 1.7;levenMar(input, output, params_levenMar);cout << "**********************************************" << endl;cout << "Levenberg-Marquardt parameter: " << endl << params_levenMar << endl;}

输出

Levenberg-Marquardt parameter:4.85628
0.99790410.05242.003

(2)网络方法

/***********************************************************                                          *
* Time: 2022/11/2
* Author: xiaocong
* Function: LM 算法** @ 解决的是最小二乘问题,也就是找到最优的系数使得残差最小* @ obj = A * sin(Bx) + C * cos(D*x) - F*      A * sin(Bx) + C * cos(D*x) 是目标函数*      F 是实际值*      目标是找到使 obj 最小的系数 A B C D
***********************************************************/#include <Eigen/Dense>      // 稠密矩阵
#include <Eigen/Sparse>      // 稀疏矩阵
#include <iostream>
#include <iomanip>    // 控制输入输出格式等
#include <cmath>using namespace std;
using namespace Eigen;const double DERIV_STEP = 1e-5;
const int MAX_INTER = 100;#define max(a, b) (((a)>(b))?(a):(b))// 定义目标函数
double func(const VectorXd input, const VectorXd &output, const VectorXd &params, int objIndex)
{// obj = A * sin(Bx) + C * cos(D*x) - Fdouble x1 = params(0);   // params 中存储的是系数double x2 = params(1);double x3 = params(2);double x4 = params(3);double t = input(objIndex);    // input 中存储的是 xdouble f = output(objIndex);   // output 中存储的是实际值return x1 * sin(x2 * t) + x3 * cos(x4 * t) - f;    // 返回 objIndex 项的残差
}// 计算残差矩阵
VectorXd objF(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{VectorXd obj(input.rows());    // 存储所有残差,也就是残差矩阵for (int i = 0; i < input.rows(); i++)obj(i) = func(input, output, params, i);return obj;   // 返回残差矩阵
}// 残差平方和
double Func(const VectorXd &obj)
{return obj.squaredNorm() / 2.0;
}// 求某个系数在某点的导数
double Deriv(const VectorXd &input, const VectorXd &output, int objIndex, const VectorXd &params, int paraIndex)
{VectorXd para1 = params;VectorXd para2 = params;para1(paraIndex) -= DERIV_STEP;para2(paraIndex) += DERIV_STEP;double obj1 = func(input, output, para1, objIndex);double obj2 = func(input, output, para2, objIndex);return (obj2 - obj1) / (2 * DERIV_STEP);     // 该点处的导数,为求雅克比矩阵做准备
}// 计算雅克比矩阵
/***************************** 我们优化的是系数 params,把他们看做未知数,分别求导,得到雅克比矩阵* 维度:(input.rows() x output.rows())* [[df/dA df/dB df/dC df/dD]    <--- x1*  [df/dA df/dB df/dC df/dD]    <--- x2*  [.......................]*  [df/dA df/dB df/dC df/dD]]    <--- xn****************************/
MatrixXd Jacobian(const VectorXd &input, const VectorXd &output, const VectorXd &params)
{int rowNum = input.rows();int colNum = params.rows();MatrixXd Jac(rowNum, colNum);for (int i = 0; i < rowNum; i++)for (int j = 0; j < colNum; j++)Jac(i, j) = Deriv(input, output, i, params, j);return Jac;
}//求 Hessian 矩阵对角线最大值
// Hessian 矩阵:二阶导数
double maxMatrixDiagonale(const MatrixXd &Hessian)
{int max = 0;for (int i = 0; i < Hessian.rows(); i++){if(Hessian(i, i) > max)max = Hessian(i, i);}return max;
}double linerDeltaL(const VectorXd &step, const VectorXd &gradient, const double u)
{double L = step.transpose() * (u * step - gradient);return L;
}void levenMar(const VectorXd &input, const VectorXd &output, VectorXd &params)
{int errNum = input.rows();int paraNum = params.rows();// initial parametersVectorXd obj = objF(input, output, params);    // 得到误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd gradient = Jac.transpose() * obj;     // 也就是 g,4x1double tao = 1e-3;long  long v = 2;double epsilon1 = 1e-12, epsilon2 = 1e-12;double u = tao * maxMatrixDiagonale(H);     // Hessian 矩阵对角线最大值乘 taobool found = gradient.norm() <= epsilon1;if (found) return;        // 直接退出程序,不再执行后面的程序double last_sum = 0;int iterCnt = 0;         // 迭代计数while (iterCnt < MAX_INTER){VectorXd obj = objF(input, output, params);    // 误差矩阵MatrixXd Jac = Jacobian(input, output, params);    // 得到雅克比矩阵MatrixXd H = Jac.transpose() * Jac;            // 得到 Hessian 矩阵,4x4VectorXd gradient = Jac.transpose() * obj;     // 也就是 g,4x1if(gradient.norm() < epsilon1){cout << "stop g(x) = 0 for a local minimizer optimizer." << endl;break;}cout << "H:" << endl << H << endl;VectorXd step = (H + u * MatrixXd::Identity(paraNum, paraNum)).inverse() * gradient;// 求 Delta x = (H + uI)^{-1}g      注意:step 维度(4x1)cout << "step: " << endl << step << endl;if(step.norm() <= epsilon2 * (params.norm()) + epsilon2){cout << "stop because change in x is small" << endl;break;}VectorXd paramsNew(params.rows());paramsNew = params - step;            // 更新 params// 计算 params 误差obj = objF(input, output, params);// 计算 paramsNew 误差VectorXd  obj_new = objF(input, output, paramsNew);double deltaF = Func(obj) - Func(obj_new);     // 求差double deltaL = linerDeltaL(-1 * step, gradient, u);// 计算增益系数 rhodouble rho = deltaF / deltaL;          // 实际下降值 / 近似下降值cout << "rho is; " << rho <<endl;if(rho > 0){params = paramsNew;u *= max(1.0 / 3.0, 1 - pow(2 * rho - 1, 3));v = 2;} else{u = u * v;v = v * 2;}cout << "u= " << u << "\tv= " << v << endl;iterCnt ++;cout << "Iteration " << iterCnt << " times, result is :" << endl<< params << endl;}
}int main()
{int params_num = 4;int total_data = 100;VectorXd input(total_data);VectorXd output(total_data);double A = 5, B = 1, C = 10, D = 2;    // 初始化// 生成数据for (int i = 0; i < total_data; i++){double x = 20.0 * ((rand() % 1000) / 1000.0) - 10.0;    // [-10, 10]double deltaY = 2.0 * (rand() % 1000) / 1000.0;         // 随机噪声,[0, 2]double y = A * sin(B*x) + C * cos(D*x) + deltaY;input(i) = x;output(i) = y;}VectorXd params_levenMar(params_num);params_levenMar << 3.6, 1.3, 7.2, 1.7;levenMar(input, output, params_levenMar);cout << "Levenberg-Marquardt parameter: " << endl << params_levenMar << endl << endl << endl;cout << "**********************************************" << endl;}

相关文章:

01 LM 算法及 Cpp 实现

文章目录 01 LM 算法及 Cpp 实现1.1 应用1.2 阻尼法推导1.3 Cpp 算法实现 01 LM 算法及 Cpp 实现 1.1 应用 LM 算法用于解决非线性最小二乘问题 min ⁡ x F ( x ) 1 2 ∥ f ( x ) ∥ 2 2 (1) \min _x F(x)\frac{1}{2}\|f(\boldsymbol{x})\|_2^2 \tag{1} xmin​F(x)21​∥f(x…...

【网络安全架构】互联网正对中国社会、经济、文化等各个领域产生巨大影响‘

摘 要&#xff1a; 中国互联网近年来飞速发展&#xff0c;普及率达到38.4%。已稳居世界第一网民大国的地位。互联网正对社会、经济、文化等各个领域产生巨大影响。2011年12月21日“泄密门”事件&#xff0c;再次敲响网络安全的警钟。网络攻击和入侵都是根据网络模型不同层次的特…...

【笔记】Android ServiceStateTracker 网络状态变化逻辑及SPN更新影响

业务简介 在网络状态变化的时候&#xff08;数据或WiFi&#xff09;&#xff0c;会更新SPN。 基于Android U的代码分析。 分类&#xff1a;SPN Data_Dic-的博客-CSDN博客 功能逻辑 状态说明 飞行模式下注册上WFC的话&#xff0c;注册状态MD上报 regState: NOT_REG_MT_NOT…...

2PC和3PC的区别是什么

2PC提交协议是什么 二阶段提交是指&#xff0c;在计算机网络一级数据库领域内&#xff0c;为了使基于分布式系统的架构下的所有节点在进行事务提交时保持一致性而设计的一种算法。在分布式系统中&#xff0c;每个节点虽然可以知晓自己操作的成功和失败&#xff0c;但是无法知道…...

redis未设置密码被植入挖矿脚本

最近一台测试linux响应速度贼慢&#xff0c;检查发现cpu消耗高达100%&#xff01;查看进程杀死后过段时间又重启了&#xff0c;一时间也摸不到头绪。无意间发现启动redis的时候cpu瞬间拉到了100%&#xff0c;主要就是zzh和newinit.sh两个脚本。百度了一下说是被植入了挖矿脚本&…...

轮询--一起学习吧之架构

一、定义 轮询&#xff08;Polling&#xff09;是一种CPU决策如何提供周边设备服务的方式&#xff0c;又称“程控输出入”&#xff08;Programmed I/O&#xff09;。这种方式是由CPU定时发出询问&#xff0c;依序询问每一个周边设备是否需要其服务&#xff0c;有即给予服务&am…...

【开发工具】Git模拟多人开发场景理解分支管理和远程仓库操作

我们来模拟一个多人多分支的开发场景。假设你有一个新的空白远程仓库,假设地址是 https://github.com/user/repo.git。 克隆远程仓库到本地 $ git clone https://github.com/user/repo.git这会在本地创建一个 repo 目录,并自动设置远程主机为 origin。 创建本地开发分支并推送…...

从零学习Linux操作系统 第三十一部分 ansible常用模块介绍

一、ansible运行模块的两种方式 Ad-Hoc方式 ##利用ansible命令直接完成管理&#xff0c;主要用于临时命令使用场景 playbook方式 ##ansible脚本&#xff0c;主要用于大型项目场景&#xff0c;需要前期的规划&#xff0c;相当于shell当中的脚本 二、如何查看模块帮助 ansible…...

【Linux C | 网络编程】多播的概念、多播地址、UDP实现广播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

HarmonyOS NEXT应用开发案例——滑动页面信息隐藏与组件位移效果

介绍 在很多应用中&#xff0c;向上滑动"我的"页面&#xff0c;页面顶部会有如下变化效果&#xff1a;一部分信息逐渐隐藏&#xff0c;另一部分信息逐渐显示&#xff0c;同时一些组件会进行缩放或者位置移动。向下滑动时则相反。 效果图预览 使用说明 向上滑动页面…...

ffmpeg 转码过程中参数含义

ffmpeg 转码过程中参数含义 frame 649 fps 73 q28.0 size 3072kB time00:00:25.88 bitrate 972.4kbits/ frame 694 fps 74 q28.0 size 3328kB time00:00:27.68 bitrate 984.9kbits/ frame 732 fps 74 q28.0 size 3584kB time00:00:29.20 bitrate1005.5kbits/ fram…...

探索c++——了解c++的魅力

前言&#xff1a;c是一门既面向对象又面向过程的语言。 不同于java纯粹的面向对象和c纯粹的面向过程。 造成c该特性的原因是c是由本贾尼大佬在c的基础上增添语法创建出来的一门新的语言。 它既兼容了c&#xff0c; 身具面向过程的特性。 又有本身的面向对象的特性。 面向对象和…...

Oracle常用语句语法

1 第一章Oracle命令 转载至 Oracle常用语句语法汇总 https://www.modb.pro/db/1759752946170548224 a) 系统管理员连接 conn */* as sysdba b) 查询当前用户 show user c) 创建新用户 create user 用户名 identified by 密码&#xff08;密码不能以数字开头&#xff09;。例如…...

时隔n年再度会看Vue,Git

时隔n年再度会看Vue,Git 曾经沧海难为水&#xff0c;除却巫山不是云。不知道这句话用在这里合不合适&#xff0c;好多东西在记忆中都淡化了。但是互联网确是有记忆的。研究以前项目的时候&#xff0c;翻看到gitee码云上托管的项目&#xff0c;就像是自己的孩子重新又回来了一样…...

SpringCloud-Zuul网关的使用

在SpringCloud中网关Zuul起什么作用&#xff1f; 在Spring Cloud中&#xff0c;Zuul 是一个边缘服务网关&#xff0c;起着以下作用&#xff1a;反向代理&#xff1a;Zuul 可以作为应用程序的反向代理服务器&#xff0c;接收客户端请求并将请求转发给相应的服务。这使得客户端可…...

mysql 中的一些重要函数

show create table user_profile 查看表结构 1.datediff(end_date,start_date)函数&#xff0c;now(), curdate() curtime() date_add(日期,interval num 时间) date_format(日期,格式) 4.select IFNULL(null,0); oracle 中nvl 函数 5.select IF(2 > 1, 2,0)&#xff…...

windows11配置电脑IP

windows11配置电脑IP 选择"开始>设置>“网络&Internet >以太网”。在 "属性"下&#xff0c;编辑IP地址&#xff0c;子网掩码&#xff0c;网关以及DNS。...

【JavaEE】_前端POST请求使用json向后端传参

目录 1. 关于json 2. 通过Maven仓库&#xff0c;将Jackson下载导入到项目中 3. 使用Jackson 3.1 关于readValue方法 3.2 关于Request.class类对象 3.3 关于request对象的属性类型 3.4 关于writeValueAsString 前端向后端传递参数通常有三种方法&#xff1a; 第一种&…...

大语言模型系列-GPT-2

文章目录 前言一、GPT-2做的改进二、GPT-2的表现总结 前言 《Language Models are Unsupervised Multitask Learners&#xff0c;2019》 前文提到&#xff0c;GPT-1利用不同的模型结构微调初步解决了多任务学习的问题&#xff0c;但是仍然是预训练微调的形式&#xff0c;GPT-…...

30m二级分类土地利用数据Arcgis预处理及获取

本篇以武汉市为例&#xff0c;主要介绍将土地利用数据转换成武汉市内各区土地利用详情的过程以及分区统计每个区内各地类面积情况&#xff0c;后面还有制作过程中遇到的面积制表后数据过小的解决方法以及一些相关的知识点&#xff1a; 示例数据下载链接&#xff1a;数据下载链…...

LeetCode-22题:括号生成(原创)

【题目描述】 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 【题目链接】. - 力扣&#xff08;LeetCode&#xff09; 【解题代码】 package dp;import java.util.ArrayList; import java.util.Arrays; im…...

如何应对IT服务交付中的问题?看了本文DevOps就懂了

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

Ubuntu23.10禁用Wayland

禁用前 编辑custom.conf文件 sudo vim /etc/gdm3/custom.conf 去掉WaylandEnablefalse前的#号 保存退出 重启系统 生效: 成功转换为X11...

Sora: 大型视觉模型背景、技术、局限性和机遇的综述

论文链接&#xff1a;https://arxiv.org/pdf/2402.17177.pdf 背景 在分析 Sora 之前&#xff0c;研究者首先盘点了视觉内容生成技术的沿袭。 在深度学习革命之前&#xff0c;传统的图像生成技术依赖于基于手工创建特征的纹理合成和纹理映射等方法。这些方法在生成复杂而生动…...

比较 2 名无人机驾驶员:借助分析飞得更高

近年来&#xff0c;越来越多的政府和执法机构使用无人机从空中鸟瞰。为了高效执行任务&#xff0c;无人机必须能够快速机动到预定目标。快速机动使它们能够在复杂的环境中航行&#xff0c;并高效地完成任务。成为认证的无人机驾驶员的要求因国家/地区而异&#xff0c;但都要求您…...

Vue开发实例(六)实现左侧菜单导航

左侧菜单导航 一、一级菜单二、二级菜单三、三级菜单1、加入相关事件 四、菜单点击跳转1. 创建新页面2. 配置路由3. 菜单中加入路由配置4、处理默认的Main窗口为空的情况 五、动态左侧菜单导航1、动态实现一级菜单2、动态实现二级菜单 一、一级菜单 在之前的Aside.vue中去实现…...

[嵌入式系统-37]:龙芯1B 开发学习套件 -6-协处理器CP0之CPU异常处理与外部中断控制器的中断处理

目录 一、CP0概述 1.1 CP0概述 1.2 龙芯异常exception与中断interrupt的区别 二、CPU协处理器的异常处理 三、外部中断与外部中断控制器 3.1 外部中断源 3.2 如何配置外部中断源 3.3 外部中断的中断向量表 3.2.1 软件中断向量表结构定义&#xff1a;ls1b_irq.c 3.2.2…...

前端实现一个绕圆心转动的功能

前言&#xff1a; 今天遇到了一个有意思的需求&#xff0c;如何实现一个元素绕某一个点来进行圆周运动&#xff0c;用到了一些初高中的数学知识&#xff0c;实现起来还是挺有趣的&#xff0c;特来分享&#x1f381;。 一. 效果展示 我们先展示效果&#xff0c;如下图所示&…...

【vue.js】文档解读【day 2】 | 响应式基础

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 响应式基础声明响应式状态(属性)响应式代理 vs 原始值声明方法深层响应性DOM 更新时机有状态方法 响应式…...

element-ui radio 组件源码分享

今日简单分享 radio 组件的实现原理&#xff0c;主要从以下三个方面来分享&#xff1a; 1、radio 页面结构 2、radio 组件属性 3、radio 组件方法 一、radio 页面结构 1.1 页面结构如下&#xff1a; 二、radio 属性 2.1 value / v-model 属性&#xff0c;类型为 string / …...