【状态估计】非线性非高斯系统的状态估计——离散时间的批量估计

上一篇文章介绍了离散时间的递归估计,本文着重介绍离散时间的批量估计。

上一篇位置:【状态估计】非线性非高斯系统的状态估计——离散时间的递归估计。


离散时间的批量估计问题

最大后验估计

目标函数

利用高斯-牛顿法来解决估计问题的非线性版本,这种优化方法也可以认为是MAP方法

首先建立最小化的目标函数,然后考虑如何解决它。

构建目标函数,优化变量为:

x = [ x 0 x 1 ⋮ x K ] x=\begin{bmatrix}x_0\\x_1\\\vdots\\x_K\end{bmatrix} x= x0x1xK

即需要估计整条轨迹。

对于非线性情况,定于相对于先验和测量的误差为:

e v , 0 ( x ) = x ˇ 0 − x 0 e v , k ( x ) = f ( x k − 1 , v k , 0 ) − x k \begin{aligned}e_{v,0}(x)&=\check x_0-x_0 \\ e_{v,k}(x)&=f(x_{k-1},v_k,0)-x_k\end{aligned} ev,0(x)ev,k(x)=xˇ0x0=f(xk1,vk,0)xk

其中, k = 1 , 2 , . . . , K k=1,2,...,K k=1,2,...,K

e y , k ( x ) = y k − g ( x k , 0 ) e_{y,k}(x)=y_k-g(x_k,0) ey,k(x)=ykg(xk,0)

其中, k = 0 , 1 , . . . , K k=0,1,...,K k=0,1,...,K

它们对目标函数的贡献为:

J v , k ( x ) = 1 2 e v , k ( x ) T W v , k − 1 e v , k ( x ) J y , k ( x ) = 1 2 e y , k ( x ) T W y , k − 1 e y , k ( x ) \begin{aligned}J_{v,k}(x)&=\frac{1}{2}e_{v,k}(x)^TW_{v,k}^{-1}e_{v,k}(x) \\ J_{y,k}(x)&=\frac{1}{2}e_{y,k}(x)^TW_{y,k}^{-1}e_{y,k}(x)\end{aligned} Jv,k(x)Jy,k(x)=21ev,k(x)TWv,k1ev,k(x)=21ey,k(x)TWy,k1ey,k(x)

那么完整的代价函数为:

J ( x ) = ∑ k = 0 K ( J v , k ( x ) + J y , k ( x ) ) J(x)=\sum_{k=0}^K(J_{v,k}(x)+J_{y,k}(x)) J(x)=k=0K(Jv,k(x)+Jy,k(x))

通常,可以 W v , k W_{v,k} Wv,k W y , k W_{y,k} Wy,k简单的认为是对称正定的权重矩阵。通过设置权重矩阵和测量噪声的协方差相关联,则最小化目标函数等同于最大化状态的联合似然函数

同时,定义:

e ( x ) = [ e v ( x ) e y ( x ) ] e v ( x ) = [ e v , 0 ( x ) e v , 1 ( x ) ⋮ e v , K ( x ) ] e y ( x ) = [ e y , 0 ( x ) e y , 1 ( x ) ⋮ e y , K ( x ) ] \begin{aligned}e(x)&=\begin{bmatrix}e_v(x)\\e_y(x)\end{bmatrix} \\ e_v(x)&=\begin{bmatrix}e_{v,0}(x)\\e_{v,1}(x)\\\vdots\\e_{v,K}(x)\end{bmatrix} \\ e_y(x)&=\begin{bmatrix}e_{y,0}(x)\\e_{y,1}(x)\\\vdots\\e_{y,K}(x)\end{bmatrix}\end{aligned} e(x)ev(x)ey(x)=[ev(x)ey(x)]= ev,0(x)ev,1(x)ev,K(x) = ey,0(x)ey,1(x)ey,K(x)

W = d i a g ( W v , W y ) W v = d i a g ( W v , 0 , W v , 1 , . . . , W v , K ) W y = d i a g ( W y , 0 , W y , 1 , . . . , W y , K ) \begin{aligned}W&=diag(W_v,W_y) \\ W_v&=diag(W_{v,0},W_{v,1},...,W_{v,K}) \\ W_y&=diag(W_{y,0},W_{y,1},...,W_{y,K})\end{aligned} WWvWy=diag(Wv,Wy)=diag(Wv,0,Wv,1,...,Wv,K)=diag(Wy,0,Wy,1,...,Wy,K)

因此,目标函数可以写成:

J ( x ) = 1 2 e ( x ) T W − 1 e ( x ) J(x)=\frac{1}{2}e(x)^TW^{-1}e(x) J(x)=21e(x)TW1e(x)

定义一个修改版本的误差项:

u ( x ) = L e ( x ) u(x)=Le(x) u(x)=Le(x)

其中, L T L = W − 1 L^TL=W^{-1} LTL=W1。使用这些定义,可以得到更简单的目标函数:

J ( x ) = 1 2 u ( x ) T u ( x ) J(x)=\frac{1}{2}u(x)^Tu(x) J(x)=21u(x)Tu(x)

这正是二次型的形式,但不是关于设定变量 x x x的二次型。目标是最小化目标函数,得到最优参数 x ^ \hat x x^

x ^ = a r g m i n ( J ( x ) ) \hat x=argmin(J(x)) x^=argmin(J(x))

可以使用许多非线性优化的方法来求解这个二次型的表达式。最经典的方法是高斯牛顿优化方法,但还有许多其他的选择。

牛顿法

牛顿法是指,以迭代的方式,不断用二次函数来近似目标函数,朝着二次近似极小值移动的方法。假设自变量的初始估计,或者说工作点为 x o p x_{op} xop,那么可对原函数 J ( ) J() J()在工作点附近进行二阶泰勒展开:

J ( x o p + δ x ) ≈ J ( x o p ) + ( ∂ J ( x ) ∂ x ∣ x o p ) δ x + 1 2 δ x T ( ∂ 2 J ( x ) ∂ x ∂ x T ∣ x o p ) δ x J(x_{op}+\delta x)\approx J(x_{op})+(\frac{\partial J(x)}{\partial x}|_{x_{op}})\delta x+\frac{1}{2}\delta x^T(\frac{\partial^2 J(x)}{\partial x\partial x^T}|_{x_{op}})\delta x J(xop+δx)J(xop)+(xJ(x)xop)δx+21δxT(xxT2J(x)xop)δx

其中, δ x \delta x δx表示相对于初始估计 x o p x_{op} xop的微小增量,一阶偏导称为雅可比矩阵,二阶偏导称为海塞矩阵。注意,海塞矩阵必须是正定的,才能判断该二次近似的极小值存在,才能使用牛顿法

下一步是找到 δ x \delta x δx的值,最小化该二次近似。令 δ x \delta x δx的导数为0:

∂ J ( x o p + δ x ) ∂ δ x = ( ∂ J ( x ) ∂ x ∣ x o p ) + δ x T ( ∂ 2 J ( x ) ∂ x ∂ x T ∣ x o p ) = 0 \frac{\partial J(x_{op}+\delta x)}{\partial \delta x}=(\frac{\partial J(x)}{\partial x}|_{x_{op}}) + \delta x^T(\frac{\partial^2 J(x)}{\partial x\partial x^T}|_{x_{op}})=0 δxJ(xop+δx)=(xJ(x)xop)+δxT(xxT2J(x)xop)=0

化简,求得:

( ∂ 2 J ( x ) ∂ x ∂ x T ∣ x o p ) δ x = − ( ∂ J ( x ) ∂ x ∣ x o p ) T (\frac{\partial^2 J(x)}{\partial x\partial x^T}|_{x_{op}})\delta x=-(\frac{\partial J(x)}{\partial x}|_{x_{op}})^T (xxT2J(x)xop)δx=(xJ(x)xop)T

当海塞矩阵可逆时(必定可逆,因为前面假设为正定的),可以得到方程的解,然后根据下面的公式来更新工作点:

x o p ⟵ x o p + δ x x_{op}\longleftarrow x_{op}+\delta x xopxop+δx

不停地迭代上述过程,直到 δ x \delta x δx变得足够小为止。对于牛顿法,有几点需要注意:

  • 局部收敛,这意味着当初始估计已经足够接近解时,不断地改进可以保证结果收敛到一个解

  • 收敛速度是二次的(比简单梯度下降收敛得快得多)

  • 海塞矩阵的计算可能很复杂,使得牛顿法在现实中应用存在困难。

高斯牛顿法

最优化目标函数,对 u ( ) u() u()进行泰勒展开,而不是对 J ( ) J() J()进行泰勒展开:

u ( x o p + δ x ) ≈ u ( x o p ) + ( ∂ u ( x ) ∂ x ∣ x o p ) δ x u(x_{op}+\delta x)\approx u(x_{op})+(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x u(xop+δx)u(xop)+(xu(x)xop)δx

将其代入 J ( ) J() J()中,则:

J ( x o p + δ x ) ≈ 1 2 ( u ( x o p ) + ( ∂ u ( x ) ∂ x ∣ x o p ) δ x ) T ( u ( x o p ) + ( ∂ u ( x ) ∂ x ∣ x o p ) δ x ) J(x_{op}+\delta x)\approx \frac{1}{2}(u(x_{op})+(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x)^T(u(x_{op})+(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x) J(xop+δx)21(u(xop)+(xu(x)xop)δx)T(u(xop)+(xu(x)xop)δx)

针对 δ x \delta x δx最小化:

∂ J ( x o p + δ x ) ∂ δ x = ( u ( x o p ) + ( ∂ u ( x ) ∂ x ∣ x o p ) δ x ) T ( ∂ u ( x ) ∂ x ∣ x o p ) = 0 \frac{\partial J(x_{op}+\delta x)}{\partial \delta x}=(u(x_{op})+(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x)^T(\frac{\partial u(x)}{\partial x}|_{x_{op}})=0 δxJ(xop+δx)=(u(xop)+(xu(x)xop)δx)T(xu(x)xop)=0

化简,求得:

( ∂ u ( x ) ∂ x ∣ x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) δ x = − ( ∂ u ( x ) ∂ x ∣ x o p ) T u ( x o p ) (\frac{\partial u(x)}{\partial x}|_{x_{op}})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x=-(\frac{\partial u(x)}{\partial x}|_{x_{op}})^Tu(x_{op}) (xu(x)xop)T(xu(x)xop)δx=(xu(x)xop)Tu(xop)

高斯牛顿法的另一种推导方式

从牛顿法到高斯牛顿法,主要就是海塞矩阵的近似。那么我们看:

J ( x ) = 1 2 u ( x ) T u ( x ) J(x)=\frac{1}{2}u(x)^Tu(x) J(x)=21u(x)Tu(x)

它的雅可比矩阵为:

∂ J ( x ) ∂ x ∣ x o p = u ( x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) \frac{\partial J(x)}{\partial x}|_{x_{op}} = u(x_{op})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}}) xJ(x)xop=u(xop)T(xu(x)xop)

海塞矩阵为:

∂ 2 J ( x ) ∂ x ∂ x T ∣ x o p = ( ∂ u ( x ) ∂ x ∣ x x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) + ∑ i = 1 M u i ( x o p ) ( ∂ 2 u i ( x ) ∂ x ∂ x T ∣ x o p ) \frac{\partial^2 J(x)}{\partial x\partial x^T}|_{x_{op}} = (\frac{\partial u(x)}{\partial x}|x_{x_{op}})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}})+\sum_{i=1}^M u_i(x_{op})(\frac{\partial^2u_i(x)}{\partial x\partial x^T}|_{x_{op}}) xxT2J(x)xop=(xu(x)xxop)T(xu(x)xop)+i=1Mui(xop)(xxT2ui(x)xop)

其中: u ( x ) = ( u 1 ( x ) , u 2 ( x ) , . . . , u M ( x ) u(x)=(u_1(x),u_2(x),...,u_M(x) u(x)=(u1(x),u2(x),...,uM(x)

注意到在海塞矩阵的表达式中,我们可以假设在 J J J的极小值附近,第二项相对于第一项是很小的。直观上看,在极小值附近 u i ( x ) u_i(x) ui(x)的值应该是很小的(理想情况下为零)。因此在忽略了包含二阶导的项时,海塞可以近似为:

∂ 2 J ( x ) ∂ x ∂ x T ∣ x o p ≈ ( ∂ u ( x ) ∂ x ∣ x x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) \frac{\partial^2 J(x)}{\partial x\partial x^T}|_{x_{op}} \approx (\frac{\partial u(x)}{\partial x}|x_{x_{op}})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}}) xxT2J(x)xop(xu(x)xxop)T(xu(x)xop)

将雅可比矩阵和海塞矩阵的近似,带入到牛顿法的公式,可以得到:

( ∂ u ( x ) ∂ x ∣ x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) δ x = − ( ∂ u ( x ) ∂ x ∣ x o p ) T u ( x o p ) (\frac{\partial u(x)}{\partial x}|_{x_{op}})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}})\delta x=-(\frac{\partial u(x)}{\partial x}|_{x_{op}})^Tu(x_{op}) (xu(x)xop)T(xu(x)xop)δx=(xu(x)xop)Tu(xop)

这个上面的推导结果保持一致。

高斯牛顿法的改进

由于高斯牛顿法不能保证收敛(因为对海塞矩阵进行了近似),可以使用两个实际的方法对其进行改进:

  1. 一旦计算出最优增量 δ x \delta x δx,则实际的更新为:

x o p ⟵ x o p + α δ x x_{op}\longleftarrow x_{op}+\alpha\delta x xopxop+αδx

其中, α ∈ [ 0 , 1 ] \alpha\in[0,1] α[0,1]为自定义的参数。在实际上,常常通过线搜索的方式求得 α \alpha α的最优值。该方法能够有效的原因在于, δ x \delta x δx是下降方向;而只是调整了在该方向上的行进距离,使得收敛性质更加鲁棒(而不是更快)

  1. 可以使用列文伯格-马夸尔特(LM)改进高斯牛顿法:

( ( ∂ u ( x ) ∂ x ∣ x o p ) T ( ∂ u ( x ) ∂ x ∣ x o p ) + λ D ) δ x = − ( ∂ u ( x ) ∂ x ∣ x o p ) T u ( x o p ) ((\frac{\partial u(x)}{\partial x}|_{x_{op}})^T(\frac{\partial u(x)}{\partial x}|_{x_{op}})+\lambda D)\delta x=-(\frac{\partial u(x)}{\partial x}|_{x_{op}})^Tu(x_{op}) ((xu(x)xop)T(xu(x)xop)+λD)δx=(xu(x)xop)Tu(xop)

其中, D D D为正定对角矩阵。当 D = 1 D=1 D=1时,随着 λ ≥ 0 \lambda\ge0 λ0变大,海塞矩阵近似所占的比重相对较小,此时:

δ x = − 1 λ ( ∂ u ( x ) ∂ x ∣ x o p ) T u ( x o p ) \delta x=-\frac{1}{\lambda}(\frac{\partial u(x)}{\partial x}|_{x_{op}})^Tu(x_{op}) δx=λ1(xu(x)xop)Tu(xop)

即最速下降(即负梯度)中非常小的一个步长。当 λ = 0 \lambda=0 λ=0时,则恢复为通常的高斯牛顿更新。

LM法通过缓慢增加 λ \lambda λ的值,可以在海塞矩阵近似较差或病态的情况下工作

关于误差项的高斯牛顿法

前面提到:

J ( x ) = 1 2 u ( x ) T u ( x ) u ( x ) = L e ( x ) \begin{aligned}J(x)&=\frac{1}{2}u(x)^Tu(x) \\ u(x)&=Le(x)\end{aligned} J(x)u(x)=21u(x)Tu(x)=Le(x)

其中, L T L = W − 1 L^TL=W^{-1} LTL=W1是一个常量。

将上式代入高斯牛顿的更新方程中,可以得到关于误差项 e ( x ) e(x) e(x)的更新:

( L H ) T L H δ x = − ( L H ) T L e ( x o p ) (LH)^TLH\delta x=-(LH)^TLe(x_{op}) (LH)TLx=(LH)TLe(xop)

其中,

H = − ∂ e ( x ) ∂ x ∣ x o p = [ 1 − F 0 1 − F 1 ⋱ ⋱ 1 − F K − 1 1 G 0 G 1 G 2 ⋱ G K ] F k − 1 = ∂ f ( x k − 1 , v k , w k ) ∂ x k − 1 ∣ x o p , k − 1 , v k , 0 G k = ∂ g ( x k , n k ) ∂ x k ∣ x o p , k , 0 \begin{aligned}H&=-\frac{\partial e(x)}{\partial x}|_{x_{op}}=\begin{bmatrix}1\\-F_0&1\\&-F_1&\ddots\\&&\ddots&1\\&&&-F_{K-1}&1\\G_0\\&G_1\\&&G_2\\&&&\ddots\\&&&&G_K\end{bmatrix} \\ F_{k-1}&=\frac{\partial f(x_{k-1},v_k,w_k)}{\partial x_{k-1}}|_{x_{op},k-1,v_k,0} \\ G_{k}&=\frac{\partial g(x_{k},n_k)}{\partial x_{k}}|_{x_{op},k,0}\end{aligned} HFk1Gk=xe(x)xop= 1F0G01F1G1G21FK11GK =xk1f(xk1,vk,wk)xop,k1,vk,0=xkg(xk,nk)xop,k,0

化简可得:

( H T W − 1 H ) δ x = H T W − 1 e ( x o p ) (H^TW^{-1}H)\delta x=H^TW^{-1}e(x_{op}) (HTW1H)δx=HTW1e(xop)

贝叶斯推断

从贝叶斯推断的角度也可以得到相同的更新方程。

MAP方法是通过定义目标函数,通过高斯-牛顿法得到 ( H T W − 1 H ) δ x = H T W − 1 e ( x o p ) (H^TW^{-1}H)\delta x=H^TW^{-1}e(x_{op}) (HTW1H)δx=HTW1e(xop)。当然,也可以使用捷径,对 e ( x ) e(x) e(x)进行线性化,再使用线性高斯系统的方法进行推导,最后会得到相同的结果。

贝叶斯推断,也可以使用线性化的方法进行讨巧,再证明得到。这里就不赘述了。


讨论

如果把EKF看作是全非线性高斯牛顿方法的近似,那么它的表现是不尽如人意的。主要原因是,EKF没有迭代至收敛的过程,其雅可比矩阵也只计算一次(可能远离最优估计)。从本质上看,EKF可以做得比单次高斯牛顿迭代更好,因为它没有一次性计算所有的雅可比矩阵。即EKF中,一部分雅可比计算是在运动先验中,另一部分在观测中,但是观测部分的雅可比是在推导运动先验之后再计算的。而单次高斯牛顿迭代中,两部分雅可比是一起计算的。

EKF的主要缺陷在于缺少迭代的过程。目前,在提升EKF的表现方面已经有不少的工作,包括IEKF。IEKF的问题在于,它仍然依赖于马尔可夫假设。它仅在一个时刻上进行了迭代,而非在整个轨迹上。

不过高斯牛顿的批量式的估计也存在一些问题。它必须离线运行,且不是一个恒定时间的算法。而EKF既可以是在线方法,也可以是恒定时间方法。所谓的滑动窗口滤波器(SWF),则是在由多个时间步长组成的窗口内进行选代,并且将这个窗口进行滑动,从而达到在线和恒定时间的实现

请添加图片描述

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

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

相关文章

Qt/QML学习-ListView

QML学习 ListView例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {id: windowwidth: 640height: 480visible: truetitle: qsTr("ListView")Rectangle {height: listView.heightwidth: listView.wi…

文件操作和IO流(Java版)

前言 我们无时无刻不在操作文件。可以说,我们在电脑上能看到的图片、视频、音频、文档都是一个又一个的文件,我们需要从文件中读取我们需要的数据,将数据运算后也需要将结果写入文件中长期保存。可见文件的重要性,今天我们就来简…

262个地级市-市场潜力指数(do文件+原始文件)

全国262个地级市-市场潜力指数(市场潜力计算方法代码数据)_市场潜力数据分析资源-CSDN文库 市场潜力指数:洞察未来发展的指南针 市场潜力指数是一个综合性的评估工具,它通过深入分析市场需求、竞争环境、政策支持和技术创新等多个…

2025考研~数据结构试卷

作者主页:知孤云出岫 数据结构试题 [TOC](数据结构试题)数据结构试卷一、选择题(每题2分,共20分)二、填空题(每题3分,共15分)三、简答题(每题10分,共40分)四…

rsync远程同步--累了,明天继续再写~。

rsync官网链接 rsync(Remote Sync,远程同步)开源快速备份工具,是一个用于本地和远程文件同步的Unix-like命令行程序。它使用“快速数据传输算法”,只发送源和目标之间的差异,因此数据传输非常高效。 可以在不同主机之间镜像同步整 个目录树…

图论---哈密顿回路的实现

开始编程前分析设计思路和程序的整体的框架,以及作为数学问题的性质: 设计思路: 利用邻接表存储图的结构,存储对应顶点和边作为无向图存边时正反都进行存储便于寻找路径对顶点的访问和路径走向进行记录使用回溯法+深度…

这不是在搞技术,而是在玩心态~

正文 大家好,我是bug菌~ 如今为制造业提供大型设备的研发型公司大多数都是做系统集成,一部分有技术实力的公司会把核心部分自研,其他相对比较通用的周边设备由其他公司产品来集成;也有一部分公司只是做做方案和资源整合&#xff0…

SSE 和 WebSocket 的区别与选择指南

在构建现代网络应用时,实时通信技术扮演着至关重要的角色。本文将深入讨论 Server-Sent Events (SSE) 和 WebSocket ——两种主要的实时通信技术,对比它们的实现方式、优势和具体用途,以帮助开发人员根据自身项目需求选择合适的技术。 何为 …

常用的设计模式和使用案例汇总

常用的设计模式和使用案例汇总 【一】常用的设计模式介绍【1】设计模式分类【2】软件设计七大原则(OOP原则) 【二】单例模式【1】介绍【2】饿汉式单例【3】懒汉式单例【4】静态内部类单例【5】枚举(懒汉式) 【三】工厂方法模式【1】简单工厂模式&#xf…

PostgreSQL 中如何实现数据的增量更新和全量更新的平衡?

文章目录 一、增量更新与全量更新的概念增量更新全量更新 二、考虑的因素1. 数据量2. 数据更改的频率和规模3. 数据一致性要求4. 系统性能和资源利用5. 业务逻辑和流程 三、解决方案(一)混合使用增量更新和全量更新(二)使用临时表…

未羽研发测试管理平台

突然有一些觉悟,程序猿不能只会吭哧吭哧的低头做事,应该学会怎么去展示自己,怎么去宣传自己,怎么把自己想做的事表述清楚。 于是,这两天一直在整理自己的作品,也为接下来的找工作多做点准备。接下来…

Python学习中使用循环(for, while)

在Python编程语言中,循环是一个非常重要的概念,可以帮助我们在代码中重复执行某些操作。Python支持两种主要的循环结构:for 循环和 while 循环。 1. for 循环 for 循环用于遍历一个序列(如列表、元组、字符串)或其他…

南方科技大学马永胜教授给年轻人使用AI工具上的建议

摘要 - 1. AI的未来,是机器人和机器人之间的合作; 2. 行业的发展方向是需求决定的,不要做同质化的发展,要做专/精/特/新; 3. 新质生产力 ( 科学技术革命性突破 生产要素创新型配置 产业深度转型升级&…

《植物大战僵尸杂交版》2.2版本:全新内容与下载指南

《植物大战僵尸杂交版》2.2版本已经火热更新,带来了一系列令人兴奋的新玩法和调整,为这款经典的塔防游戏注入了新的活力。如果你是《植物大战僵尸》系列的忠实粉丝,那么这个版本绝对值得你一探究竟。 2.2版本更新亮点 新增看星星玩法 这个新…

成为编程大佬!!——数据结构与算法(1)——算法复杂度!!

前言:解决同一个程序问题可以通过多个算法解决,那么要怎样判断一个算法的优劣呢?🤔 算法复杂度 算法复杂度是对某个程序运行时的时空效率的粗略估算,常用来判断一个算法的好坏。 我们通过两个维度来看算法复杂度——…

思考:Java内存模型和硬件内存模型

前言 前一阵在看volatile的原理,看到内存屏障和缓存一致性,发现再往底层挖就挖到了硬件和Java内存模型。这一块是自己似懂非懂的知识区,我一般称之为知识混沌区。因此整理这一篇文章。 什么是内存模型(Memory Model)…

个人面试总结

写在前面:以下是自己在拟录用后回顾总结的了一下当时面试题目,把标答写了出来,供以后复习所使用,希望大家理性食用~~ 预祝大家都能找到心仪的工作 笔试题目: 1.1. java中Collection和Collections的区别 Collection…

vue3+antdv仿百度网盘样式文件夹管理组件

实现: 默认进入页面时,文件夹全选;文件夹状态,以及文件夹内的文件选择状态,与组件联动文件夹数量,根据后端数据动态生成 实现思路: 将后端数据存到vuex中,增加(多选框…

基于vue的可视化大屏

要提前准备一个xinyang.json文件 可以在这个网站下载 DataV.GeoAtlas地理小工具系列 (aliyun.com) 代码结构 总框架代码&#xff1a; <template><div><div class"center"><center-left /><center-map /><center-right /><…

PPI(每英寸像素数)、DPI(每英寸点数)和Pixel(像素)的区别和联系?

一、定义 PPI、DPI和Pixel是图像处理、打印和显示领域中常用的三个概念&#xff0c;它们之间既有区别又有联系。以下是对这三个概念进行分别讲解&#xff1a; 1. PPI&#xff08;Pixels Per Inch&#xff09;&#xff0d;即每英寸像素数&#xff0c;是图像分辨率的一种表示方…