超详细讲解无迹卡尔曼(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)滤波(个人整理结合代码分析) 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 重载 (c)begin/(c)end

    我试图超载 c begin c end类的函数 以便能够调用 C 11 基于范围的 for 循环 它在大多数情况下都有效 但我无法理解和解决其中一个问题 for auto const point fProjectData gt getPoi
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org

随机推荐

  • 复合查询

    复合查询 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