超详细讲解无迹卡尔曼(UKF)滤波(个人整理结合代码分析)

2023-10-31

目录

1.用来做什么?

2.线性卡尔曼滤波

3.扩展卡尔曼滤波

4.无迹卡尔曼滤波


1.用来做什么?

——针对系统的不确定性:1.不存在完美的数学模型

                                                2.系统的扰动不可控、也很难建模

                                                3.测量传感器存在误差

     例1:通过系统的状态方程得出的电流值i1,和传感器测得的电流值i2,由于不确定性的存在,两个值都不准确,所以i1和i2通过卡尔曼滤波算法算出其最接近真实值的值。

     例2:如小红同学说今天老师穿的是红色的衣服(根据以往经验,每周四老师都穿红衣服,小红得出的结论),小白说老师今天穿的白色的衣服(看到一个像老师的人穿的白色的衣服,小白得出老师穿白色衣服的结论),通过卡尔曼滤波推算谁说话的权重更大,则推断出更应该相信谁的话。

2.线性卡尔曼滤波

系统真实方程为(状态方程的基础上存在噪声):

 x\:_{_{k}}=Ax_{_{k-1}}+B*U_{k-1}+w_{k-1}

Z_{k}=Hx_{k}+v_{k}


先验估计(他叫这名):      

    \widehat{x}_{k}^{-}=A\widehat{x}_{k-1}+B*U_{k-1}          —— 这是系统状态方程(方程建立的不准确性)

   P_{k}^{-}=AP_{k-1}A^{^{T}}+Q                              —— 这是先验误差协方差(用来算卡尔曼增益) 

——(注意:噪声满足p(w)\rightarrow (0,Q),其中0是期望值,Q是协方差矩阵。P^{^{k-}}这里是x_{k}-\widehat{x^{-}}_{k}误差的期望/协方差(越接近0越好)。

P_{k}^{-}=E[e^{-}_{k}*e^{-}_{k}{T}] =AE[e_{k-1}e_{k-1}^{T}]A^{T}+E[w_{k-1}w_{k-1}^{T}] =AP_{k-1}A^{T}+Q


后验估计(所要求的值)

             因为:Z_{k}=H\widetilde{x}_{k}                                     ——(传感器测量的不准确性)

                         \widetilde{x}_{k}=H^{-}Z_{k}

                          \widehat{x}_{k}=\widehat{x}_{k}^{-}+G(\widetilde{x}_{k}-\widehat{x}_{k}^{-})     G=K_{k}H

          \widehat{x}_{k}=\widehat{x}_{k}^{-}+K_{k}(Z_{k}-H\widehat{x}_{k}^{-})               ——后验得到的值

     P_{k}=E[e_{k}*e_{k}^{T}]                           ——x_{k}-\widehat{x}_{k}(真实值与后验估计误差的期望(目标期望为0))

            =E[(x_{k}-\widehat{x}_{k})(x_{k}-\widehat{x}_{k})^{T}]     

   其目标为P的期望为0或方差最小(使后验估计与真实值误差最小),通过推导可以得到卡尔曼增益:

 K_{k}=\frac{P_{k}^{-}H^{T}}{HP_{k}^{-}H^{T}+R}                         ——(P最小时求得的K_{k}

   同时可以得到P

P_{k}=(I-K_{k}H)P_{k}^{-}                         —— (用来更新P_{k}^{-}值)

3.扩展卡尔曼滤波

卡尔曼滤波主要用于分析线性系统。

扩展卡尔曼滤波主要用于分析非线性系统。(正态分布的随机变量通过非线性系统后就不再是正态的了) 。

扩展卡尔曼滤波——主要是通过泰勒级数一阶展开,将非线性系统线性化,之后的求取与线性化卡尔曼滤波一致。

非线性系统:

x_{k}=f(x_{k-1},u_{k-1},w_{k-1})                 P(w)\rightarrow N(0,Q)

Z_{k}=h(x_{k},v_{k})                                     P(v)\rightarrow N(0,R)

 泰勒级数一阶展开式:

f(x)=f(x_{0})+\frac{\partial f}{\partial x}(x-x_{0})                           \frac{\partial f}{\partial x}多维用雅克比矩阵

对非线性系统线性化。系统有误差,无法在真实点线性化,则{\color{Red} {\color{Red} }f(x_{k})}{\color{Red} \widehat{x}_{k-1}}处线性化{\color{Green} \widehat{x}_{k-1}}{\color{Green} x-1}时的后验估计)

x_{k}=f(\widehat{x}_{k-1},u_{k-1},{\color{Red} w_{k-1}})+{\color{Red} A}(x_{k-1}-\widehat{x}_{k-1})+{\color{Red} W}w_{k-1}    

w_{k-1}等于0(误差假设为0)A=\frac{\partial f}{\partial x}/\widehat{x}_{k-1},u_{k-1}雅克比矩阵W=\frac{\partial f}{\partial w}/\widehat{x}_{k-1},u_{k-1}雅克比矩阵。

z_{k}\widehat{x}_{k}线性化:

z_{k}=h(\widehat{x}_{k},v_{k})+H(x_{k}-\widehat{x}_{k})+Vv_{k}

H=\frac{\partial h}{\partial x}/\widehat{x}_{k},V=\frac{\partial h}{\partial v}/\widehat{x}_{k}

 令f(\widehat{x}_{k-1},u_{k-1},{0})=\widetilde{x}_{k-1}h(\widehat{x}_{k},v_{k})=\widetilde{z}_{k}

\rightarrow \left\{\begin{matrix}x_{k}=\widetilde{x}_{k-1}+{ A}(x_{k-1}-\widehat{x}_{k-1})+{ W}w_{k-1} \\ z_{k}=\widetilde{z}_{k}+H(x_{k}-\widehat{x}_{k})+Vv_{k} \end{matrix}\right.         ——线性化后的系统方程


先验估计:

  \widehat{x}_{k}^{-}=f(\widehat{x}_{k-1},u_{k-1},{0})

 P_{k}^{-}=AP_{k-1}A^{^{T}}+{\color{Red} WQW^{T}}


  后验估计:

\widehat{x}_{k}=\widehat{x}_{k}^{-}+K_{k}(Z_{k}-{\color{Red} h(\widehat{x}_{k}^{-},0)})

 K_{k}=\frac{P_{k}^{-}H^{T}}{HP_{k}^{-}H^{T}+{\color{Red} VRV^{T}}}

P_{k}=(I-K_{k}H)P_{k}^{-}

标红部分为扩展和线性卡尔曼滤波的不同之处。

4.无迹卡尔曼滤波

            由于扩展卡尔曼滤波可能存在线性化误差,且一般情况下雅克比矩阵不易实现,增加了算法的计算复杂度。

           无迹卡尔曼滤波不采用泰勒展开实现非线性系统线性化,而是采用无迹变换(Unscented Transform,UT)来处理均值和协方差的非线性传递问题。(UKF算法是对非线性函数的概率密度分布进行近似,用一系列确定样本来逼近状态的后验概率密度,而不是对非线性函数进行近似,不需要对雅克比矩阵进行求导。)

无迹变换:

——(1)原状态分布中按某一规则选取一些采样点(其均值和方差等于原状态分布的均值和方差)

—— (2)将点带入非线性方程中(求取变换后的均值和协方差)

以对称分布采样的UT变换为例。设一个非线性变换y=f(x)。状态向量xn维随机变量,已知其均值\overline{x}和方差P。通过UT变换得到2n+1个sigma点和相应的权值w

(1)计算2n+1个sigma点,即采样点

\left\{\begin{matrix} X^{(0)}=\overline{​{X}},i=0\\ X^{(i)}=\overline{​{X}}+(\sqrt{(n+\lambda )P})_{i},i=1\sim n \\ X^{(i)}=\overline{​{X}}-(\sqrt{(n+\lambda )P})_{i},i=1\sim n+1\sim 2n \end{matrix}\right.

(\sqrt{P})_{i}表示矩阵方根的第i列。注意应确保(n+\lambda )P为半正定矩阵。

设:

\overline{x}=\begin{bmatrix} 1\\ 2\\ 3\\ 4 \end{bmatrix},m=(\sqrt{(n+\lambda )P})_{i}=\begin{bmatrix} 1&1 &1 & 1\\ 0& 1& 1 &1 \\ 0 &0 &1 &1 \\ 0& 0& 0 &1 \end{bmatrix}

则:

\overline{x}+m=\begin{bmatrix} 2 &2 &2 &2 \\ 2 & 3&3 &3 \\ 3& 3 &4 & 4\\ 4 & 4 & 4 &5 \end{bmatrix} , \overline{x}-m=\begin{bmatrix} 0 &0 &0 & 0\\ 2 & 1 & 1 & 1\\ 3 & 3 & 2 &2 \\ 4& 4 & 4 & 3 \end{bmatrix}             ——\overline{x}+m\overline{x}-m对称

合并起来就是9个sigma点:

     sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig9

X=\begin{bmatrix} 1&2 &2 &2 & 2& 0&0 & 0&0 \\ 2&2 &3 &3 &3 &2 &1 &1 &1 \\ 3& 3&3 &4 &4 & 3&3 & 2&2 \\ 4&4 & 4& 4& 5& 4&4 &4 &3 \end{bmatrix}

(2)计算采样点相应的权值

\left\{\begin{matrix} w_{m}^{(0)}=\frac{\lambda }{n+\lambda }\\ w_{c}^{(0)}=\frac{\lambda }{n+\lambda }+(1-a^{2}+\beta ) \\ w_{m}^{(i)}=w_{c}^{(i)}=\frac{\lambda }{2(n+\lambda) } ,i=1\sim 2n\end{matrix}\right.

将9个sigma点带入非线性方程得到新的sigma点:

\overline{X}=f(X)          

假设得到       sig1 sig2 sig3 sig4 sig5 sig6 sig7 sig8 sig9    

                    ​​​​​​​\overline{X}=\begin{bmatrix} 2&3 &3 &3 & 2& 1&1 &2&1 \\ 2&3 &2 &1 &1 &1 &2 &2 &2\\ 2&3&4 &3 &5 & 6&3 & 2&1 \\ 4&2&3& 2& 1& 3&1 &3 &1 \end{bmatrix},     

定义权值w_{m}^{(1)}=-0.3w_{m}^{(2)}=w_{m}^{(3)}=w_{m}^{(4)}=w_{m}^{(5)}=w_{m}^{(6)}=w_{m}^{(7)}=w_{m}^{(8)}=w_{m}^{(9)}=0.6​​​​​​​​​​​​​

可求得下一个点的先验值(经过UT变换后得到的先验值)

\widehat{X}=\sum_{i=1}^{9}w_{m}^{i}X^{i}

\widehat{X}=-0.3*sigma1+0.6*sigma2+0.6*sigma3+0.6*sigma4+0.6*sigma5+0.6*sigma6+0.6*sigma7+0.6*sigma8+0.6*sigma9​​​​​​​

\widehat{X}=\begin{bmatrix} 4\\ 5\\ 6\\ 7 \end{bmatrix}     (随便填的值,我就不算了哈哈哈)

以上是无迹变换算先验值的整个过程。

无迹卡尔曼滤波算法

非线性系统:

\left\{\begin{matrix} X(k+1)=f(x(k),W(k))\\ Z(k)=h(x(k),V(k)) \end{matrix}\right.

步骤:

 ————1、经过UT变换求得sigma采样点及其权值

X^{(i)}(k/k)=\begin{bmatrix} \widehat{X}(k/k) & \widehat{X}(k/k)+\sqrt{(n+\lambda )P(k/k}) & \widehat{X}(k/k)-\sqrt{(n+\lambda )P(k/k}) \end{bmatrix}

————2、计算2n+1个sigma点集的一步预测

X^{^{(i)}}(k+1/k)=f[k,X^{i}(k/k)]

————3、系统状态量的一步预测(相当于KF/EKF的先验值)

\widehat{X}(k+1/k)=\sum_{i=0}^{2n}w^{i}X^{i}(k+1/k)                          ——UT变换后得到的新的状态值     

P(k+1/k)=\sum_{i=0}^{2n}w^{i}[\widehat{X}(k+1/k)-{X}^{i}(k+1/k)][\widehat{X}(k+1/k)-{X}^{i}(k+1/k)^{T}]+Q

————4、再次使用UT变换,产生新的sigma点集

\widehat{X}^{i}(k+1/k)=\begin{bmatrix} \widehat{X}(k+1/k) & \widehat{X}(k+1/k) +\sqrt{(n+\lambda )P(k+1/k}) &\widehat{X}(k+1/k) -\sqrt{(n+\lambda )P(k+1/k}) \end{bmatrix}

————5、新的sigma点集带入观测方程,得到预测的观测量

Z^{i}(k+1/k)=h[X^{i}(k+1/k)]​​​​​​​

————6、通过加权求得观测量新的均值及协方差

\overline{Z}(k+1/k)=\sum_{i=0}^{2n}w^{i}Z^{i}(k+1/k)                            ——UT变换后得到的新的观测值

Pz_{k}z_{k}=\sum_{i=0}^{2n}w^{i}[Z^{i}(k+1/k)]-\overline{Z}(k+1/k)][Z^{i}(k+1/k)]-\overline{Z}(k+1/k)]^{T}+R

Px_{k}z_{k}=\sum_{i=0}^{2n}w^{i}[X^{i}(k+1/k)]-\overline{X}(k+1/k)][Z^{i}(k+1/k)]-\overline{Z}(k+1/k)]^{T}​​​​​​​

————7、  计算卡尔曼增益

K(k+1)=P_{x_{k}z_{k}}P_{z_{k}z_{k}}^{-1}

————8、系统的状态更新和协方差更新

\widehat{X}(k+1/k+1)=\widehat{X}(k+1/k)+K(k+1)[Z(k+1)-\widehat{Z}(k+1/k)]

 P(k+1/k+1)=P(k+1/k)-K(k+1)P_{z_{k}z_{k}}K^{T}(k+1)

                                                          图1. 卡尔曼滤波流程图

实际应用(仿真分析):

系统方程:

X(k+1)=\Phi X(k)+ \Gamma W(k)

Z(k)=\sqrt{(x(k)-x_{0})^{2}+(y(k)-y_{0})^{2}}+V(k)

\Phi =\begin{bmatrix} 1& 1 & 0 & 0\\ 0& 1 & 0 &0 \\ 0& 0 & 1&1 \\ 0& 0& 0& 1 \end{bmatrix},\Gamma =\begin{bmatrix} 0.5 &0 \\ 1& 0\\ 0& 0.5\\ 0& 1 \end{bmatrix},Q=\sigma _{w}*diag([1,1]),R=5

真实状态信息为:

X_{real}(k)=[x_{real}(k),\dot{x}_{real}(k),y_{real}(k),\dot{y}_{real}(k)]^{T}

UKF滤波算法得到的目标状态为:

 X_{UKF}(k)=[x_{UKF}(k),\dot{x}_{​{UKF}}(k),y_{​{UKF}}(k),\dot{y}_{​{UKF}}(k)]^{T}

定义均方根误差(RMSE):

RMSE(K)=\sqrt{(x_{UKF}(k)-x_{real}(k))^{2}+(y_{UKF}(k)-y_{real}(k))^{2}}

 代码:

 T=1;
N=60/T;
X=zeros(4,N);                                  ——定义X为4行60列的数列
X(:,1)=[-100,2,200,20];                   ——第一个点
Z=zeros(1,N);                                   ——定义Z为1行60列的数列
delta_w=1e-3;
Q=delta_w*diag([0.5,1]);                ——状态噪声
G=[T^2/2,0;T,0;0,T^2/2;0,T];
R=5;                                                          ——观测噪声
F=[1,T,0,0;0,1,0,0;0,0,1,T;0,0,0,1];
x0=200;
y0=300;                                                ——可以随便给定(Z方程里的值)

Xstation=[x0,y0];
v=sqrtm(R)*randn(1,N);
for t=2:N
    X(:,t)=F*X(:,t-1)+G*sqrtm(Q)*randn(2,1);
end
for t=1:N
    Z(t)=Dist(X(:,t),Xstation)+v(t);
end                                                             ——真实状态值和观测值

​​​​​​​

L=4;
alpha=1;
kalpha=0;
belta=2;
ramda=3-L;
for j=1:2*L+1
    Wm(j)=1/(2*(L+ramda));
    Wc(j)=1/(2*(L+ramda));
end
Wm(1)=ramda/(L+ramda);                                            ——求第一次方差的权值
Wc(1)=ramda/(L+ramda)+1-alpha^2+belta;                ——求第一次均值的权值

Wm​​​​​​​

Wc

Xukf=zeros(4,N);
Xukf(:,1)=X(:,1);
P0=eye(4);

 for t=2:N                                                                   ——(注:下面给出的数据是第一次循环)
    xestimate=Xukf(:,t-1);


    P=P0;                                                                    ——初始协方差随便给定   (4行4列矩阵)
    cho=(chol(P*(L+ramda)))';                                  ——半正定矩阵


    for k=1:L
        xgamaP1(:,k)=xestimate+cho(:,k);


        xgamaP2(:,k)=xestimate-cho(:,k);   ——  xgamaP1的1列与xgamaP2的1列关于xestimate对称

                                                                              xgamaP1的2列与xgamaP2的2列对称

                                                                              xgamaP1的3列与xgamaP2的3列对称

​​​​​​​                                                                              xgamaP1的4列与xgamaP2的4列对称


    end
    Xsigma=[xestimate,xgamaP1,xgamaP2];                   ——求出第一步的9个sigma点

 

    Xsigmapre=F*Xsigma;                              ——9个sigma点带入非线性函数得到新的9个sigma点

  Xpred=zeros(4,1);
    for k=1:2*L+1
        Xpred=Xpred+Wm(k)*Xsigmapre(:,k);               ——新的状态值(先验值)4行1列

    end                                                             

     Ppred=zeros(4,4);
    for k=1:2*L+1
        Ppred=Ppred+Wc(k)*(Xsigmapre(:,k)-Xpred)*(Xsigmapre(:,k)-Xpred)'; 
    end
    Ppred=Ppred+G*Q*G';                                       ——新的协方差

    chor=(chol((L+ramda)*Ppred))';
    for k=1:L
        XaugsigmaP1(:,k)=Xpred+chor(:,k);
        XaugsigmaP2(:,k)=Xpred-chor(:,k);
    end
    Xaugsigma=[Xpred XaugsigmaP1 XaugsigmaP2];     ——先验值经UT变化得到新的9个sigma点                                                                                                                   (用来算Z值)


    for k=1:2*L+1;
        Zsigmapre(1,k)=hfun(Xaugsigma(:,k),Xstation);——9个sigma点带入非线性函数得到新的9个          end                                             sigma点,公式Z(k)=\sqrt{(x(k)-x_{0})^{2}+(y(k)-y_{0})^{2}}+V(k)
     Zpred=0;
    for k=1:2*L+1
        Zpred=Zpred+Wm(k)*Zsigmapre(1,k);                         ——新的Z值
    end

    Pzz=0;
    for k=1:2*L+1
        Pzz=Pzz+Wc(k)*(Zsigmapre(1,k)-Zpred)*(Zsigmapre(1,k)-Zpred)';         ——用来求卡尔曼增益
    end
    Pzz=Pzz+R;


    Pxz=zeros(4,1);
    for k=1:2*L+1
        Pxz=Pxz+Wc(k)*(Xaugsigma(:,k)-Xpred)*(Zsigmapre(1,k)-Zpred)';       ——用来求卡尔曼增益
    end


    K=Pxz*inv(Pzz);


    xestimate=Xpred+K*(Z(t)-Zpred);                                   ——最终求得的值


    P=Ppred-K*Pzz*K';                                     ——更新协方差值
    P0=P;
    Xukf(:,t)=xestimate;                                      ——迭代
end

 for i=1:N
    Err_KalmanFilter(i)=Dist(X(:,i),Xukf(:,i));
end
figure
hold on;box on;
plot(X(1,:),X(3,:),'-k.');
plot(Xukf(1,:),Xukf(3,:),'-r+');
legend('真实轨迹','UKF轨迹')
figure
hold on;box on;
plot(Err_KalmanFilter,'-ks','MarkerFace','r')


调用函数1:

function d=Dist(X1,X2)
if length(X2)<=2
    d=sqrt((X1(1)-X2(1))^2+(X1(3)-X2(2))^2);
else
    d=sqrt((X1(1)-X2(1))^2+(X1(3)-X2(3))^2);
end


调用函数2:
function[y]=hfun(x,xx)
y=sqrt((x(1)-xx(1))^2+(x(3)-xx(2))^2);

参考视频:

 【卡尔曼滤波器】1_递归算法_Recursive Processing_哔哩哔哩_bilibili

参考书本:

 卡尔曼滤波原理及应用——MATLAB仿真

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

超详细讲解无迹卡尔曼(UKF)滤波(个人整理结合代码分析) 的相关文章

  • .Net Core 中 String 默认不可序列化吗?

    我正在查看其他的 Fortify 静态分析安全测试 SAST 扫描报告 以识别和抑制误报 应用程序框架是C NET Core SAST 报告部分内容如下 Method1 在第 111 行将不可序列化的对象存储为 HttpSessionSta
  • 请求的资源不支持 HTTP 方法“GET”

    我的路线配置正确 并且我的方法具有装饰标签 我仍然收到 请求的资源不支持 HTTP 方法 GET 消息 System Web Mvc AcceptVerbs GET POST System Web Mvc HttpGet public st
  • System.MissingMethodException:找不到方法?

    以前工作的 ASP NET WebForms 应用程序现在抛出此错误 System MissingMethodException 找不到方法 The DoThis方法位于同一个类上 它应该可以工作 我有一个这样的通用处理程序 public
  • 如何在函数中将结构成员作为指针传递?

    问题是我有一个结构是另一个 主要 结构的成员 我编写了一个函数来清除第一个结构 它需要一个指向结构的指针 我想使用该函数来清除主要结构内的结构 但我不确切知道哪种方法是正确的 为了更好地解释它 这里有一些代码 我有一个结构 定义为 type
  • Ruby 解释器嵌入到 C 代码中

    我只是尝试书中的一个简单例子 我有一个 sum rb 文件 class Summer def sum max raise Invalid maximum max if max lt 0 max max max 2 end end 还有一个
  • 模拟 EF core dbcontext 和 dbset

    我正在使用 ASP NET Core 2 2 EF Core 和 MOQ 当我运行测试时 我收到此错误 消息 System NotSupportedException 非虚拟 可在 VB 中重写 成员上的设置无效 x gt x Movies
  • 使用 std::string 导致 Windows“找不到入口点”[重复]

    这个问题在这里已经有答案了 当我用 G C C 编译它时 include
  • 将 Uploadify 与 Sharepoint 和 .net 结合使用

    我在共享点页面上有一些由 JQuery 生成的 html 我想在这个 html 中使用 uploadify 将文件上传到服务器 亚历山大 https stackoverflow com users 25427 alexander gyosh
  • string.empty 和 string[0] == '\0' 之间的区别

    假设我们有一个字符串 std string str some value is assigned 有什么区别str empty and str 0 0 C 11 及更高版本 string variable 0 如果字符串为空 则需要返回空字
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • 为什么long long 2147483647 + 1 = -2147483648? [复制]

    这个问题在这里已经有答案了 为什么这段代码不打印相同的数字 long long a b a 2147483647 1 b 2147483648 printf lld n a printf lld n b 我知道int变量的最大数量是2147
  • 如何检查是否发生溢出? [复制]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 那里有更好的 DateTime.Parse 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道有一个库 付费或免费 能够处理比 DateTime Parse 使用的更常见的日期时间格式 能够
  • 在 C# 4.0 中,是否可以从泛型类型参数派生类?

    我一直在尝试这个 但我似乎无法弄清楚 我想做这个 public abstract class SingletonType
  • Cuda:最小二乘求解,速度较差

    最近 我使用Cuda编写了一个名为 正交匹配追踪 的算法 在我丑陋的 Cuda 代码中 整个迭代需要 60 秒 而 Eigen lib 只需 3 秒 在我的代码中 矩阵 A 是 640 1024 y 是 640 1 在每一步中 我从 A 中
  • 正则表达式基于组的不同替换?

    所以我对正则表达式比较陌生 并且做了一些练习 我正在玩一个简单的 混淆器 它只是寻找 dot or dot or at or at 不区分大小写 并且在匹配项之前或之后有或没有任意数量的空格 这是针对通常情况的 someemail AT d
  • 为 C++ 类播种 rand()

    我正在开发一个 C 类 它使用rand 在构造函数中 我真的希望这个班级在几乎所有方面都能照顾好自己 但我不知道在哪里播种rand 如果我播种rand 在构造函数中 每次构造我的对象类型的新实例时都会对其进行播种 因此 如果我按顺序创建 3
  • 更改预处理到文件后出现错误 1 ​​错误 LNK1104

    我必须使用预处理器 所以我改变了 配置属性 gt C gt 预处理器 gt 预处理为文件 gt 是 并得到错误 错误 1 错误 LNK1104 无法打开文件 Debug asnreal obj 这个问题的解决办法 我必须在 lib 文件的路
  • 访问 Visual Studio 扩展中的当前代码窗格

    我正在编写一个 Visual Studio 2010 扩展 在代码视图中带有右键单击菜单 我希望能够从菜单项事件处理程序检查当前代码 但无法在对象模型中找到执行此操作的位置 如何在 Visual Studio 扩展中访问当前窗口中的代码 E
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐

  • 复合查询

    复合查询 1 单表查询 查询工资高于500或岗位为MANAGER的雇员 同时还要满足他们的姓名首字母为大写的J select empno ename sal job from emp where sal gt 500 or job MANA
  • 倒排索引学习笔记

    概述 顺序扫描法 正向搜索法 举个例子 比如我们有大量的文件 文件编号从A B C 需求 要找出文件内容中包含有java的所有文件 需求实现 从A文件开始查找 再找B文件 然后再找C文件 以此类推 弊端 如果文件数量很多 查找速度慢 倒排索
  • JavaScript中的基本数据类型与引用数据类型

    JavaScript中的基本数据类型与引用数据类型 转载自 https www cnblogs com c2016c articles 9328725 html 1 栈 stack 和堆 heap stack为自动分配的内存空间 它由系统自
  • Aliyun本地化部署WebPageTest--前端性能测量工具

    1 有阿里云 创建一个ECS实例 2 设置阿里云docker源加速器 拉取对应的镜像 docker pull webpagetest server docker pull webpagetest agent 1 运行server实例 doc
  • C语言全局变量和局部变量总结

    只有不断的学习 不断的进步 才能不被替代 只有你的不可替代性才决定你的价值 2016年11月18日 第一部分问题 今天一个小伙伴问我一个问题 如图程序1 咋一看没有问题啊 后来想想确实有问题 这个c a a 似乎是语句 必须在函数体内才能执
  • ESP32使用AT MQTT 固件发布主题信息返回ERROR解决

    目录 发布格式 原因及其解决方法 发布格式 AT MQTTPUB lt topic gt lt data gt 0 0 当需要发布对应主题的json数据包时 错误格式 AT MQTTPUB 0 device date msg1 22 msg
  • WAV文件格式详解

    概述 Waveform Audio File Format WAVE 又或者是因为WAV后缀而被大众所知的 它采用RIFF Resource Interchange File Format 文件格式结构 通常用来保存PCM格式的原始音频数据
  • Podman 从入门到精通

    腾讯云原生最佳实践 1 前言 在本文中 我们将了解 Podman Pod Manager的缩写 它的功能和用法 2 Podman Podman 是一个开源的容器管理工具 用于开发 管理和运行OCI容器 让我们来看看与其他容器管理工具相比 P
  • 图片拖到任意处并记录相应的位置

  • 备忘一下,vulkan android sample 编译错误:ninja: error: libshaderc.a', needed by

    又要编译vulkan API Sample 每次找这行命令要用很久 备个忘 不编译shaderc的对应的编译错误为 Build command failed Error while executing process C Users hon
  • GPT1,2,3

    GPT1 transformer解码器因为有掩码所以不看后面的东西 gpt就是transformer的解码器 bert 是transformer的编码器 gpt核心卖点 不管输入如何 transformer模型不会变 半监督 先在没有标号上
  • 华为OD机试真题-磁盘容量排序-2023年OD统一考试(B卷)

    题目描述 磁盘的容量单位常用的有M G T这三个等级 它们之间的换算关系为1T 1024G 1G 1024M 现在给定n块磁盘的容量 请对它们按从小到大的顺序进行稳定排序 例如给定5块盘的容量 1T 20M 3G 10G6T 3M12G9M
  • python获得用户输入的一个字符串、格式如下_第七章 用户输入和while语句

    大多数编程都旨在解决最终用户的问题 为此通常需要从用户那里获取一些信息 例如 假设有人要判断自己是否到了投票的年龄 要编写回答这个问题的程序 就需要知道用户的年龄 这样才能给出答案 因此 这种程序需要让用户输入其年龄 再将其与投票年龄进行比
  • .mdb文件导入到mysql(工具Navicat Premium 12)

    可能会报错 需要安装AccessDatabaseEngine 1打开数据库 2 选择你的mdb文件 跟着提示一步步往下就行了 如果选择文件后报错 安装一下AccessDatabaseEngine 网上找找 这个是64位的 链接 https
  • GRPC C++开发环境搭建

    本文章参与 lt 零声教育 gt 的C C Linux服务器高级架构系统教程学习 1 安装必要的依赖工具 安装必要的依赖工具 sudo apt get install autoconf automake libtool 如果cmake低于3
  • SLF4J

    日志是任何项目中最重要的东西之一 特别是遇到多线程环境下高压力导致的并发bug时 但是在实际项目中有使用slf4j api slf4j log4j12还有log4j的 作为程序员到底应该使用哪一种呢 要使用他们 我们首先要理清楚他们之间的关
  • 八进制数字字符转化为十进制详解

    include
  • C++ Primer Plus(第6版)第2章 开始学习C++

    复习题 1 函数 2 用iostream头文件的内容替换源代码中的 include语句 3 使std名称空间中的内容全部直接可用 4 std cout lt lt hello world lt
  • 车牌识别项目总结2019.9

    最近学了Python感觉很强大 对计算机视觉有些兴趣 于是来做一个车牌识别项目 其中学习了OpenCV Python MATLAB等 收获颇丰 写一篇文章记录一下 整体思路 车牌识别 LPR License Plate Recognitio
  • 超详细讲解无迹卡尔曼(UKF)滤波(个人整理结合代码分析)

    目录 1 用来做什么 2 线性卡尔曼滤波 3 扩展卡尔曼滤波 4 无迹卡尔曼滤波 1 用来做什么 针对系统的不确定性 1 不存在完美的数学模型 2 系统的扰动不可控 也很难建模 3 测量传感器存在误差 例1 通过系统的状态方程得出的电流值i