MSCKF4讲:后端理论推导(下)

MSCKF4讲:后端理论推导(下)

文章目录

  • MSCKF4讲:后端理论推导(下)
  • 6 可观测性分析与约束
    • 6.1 为什么要做能观性分析
    • 6.2 关于零空间解释
    • 6.3 可观测性分析
    • 6.4 可观测性约束
      • ① 状态转移矩阵Φ
      • ② 对观测矩阵H--观测的雅可比矩阵

  写在前面,为了防止偏航角被错误的可观,作者对状态转移矩阵和观测矩阵进行了一定的修改,使其满足可观性要求。

6 可观测性分析与约束

  论文使用这种约束方法:OC-EKF

  论文 Observability-constrained vision-aided inertial navigation

  线性系统理论能观测能控概念

1 能观测:状态量(如位姿、偏差)是否可以由输出(如观测的预测值)反应

2 能控:状态量是否受到输入影响

6.1 为什么要做能观性分析

  真实VIO系统不能观的维度是4(平移和yaw角),而实际MSCKF不能观的维度变成了3,绕重力轴的旋转(yaw角)被错误地能观了,从而产生了不一致性Inconsistency,系统误认为yaw角具有更多的信息从而将yaw对应的协方差设得比较小,最终导致VIO估计精度的下降。能观性分析就是为了能让MSCKF系统不可观的维度与真实系统一致,从而提高VIO精度。

补充:为什么vio系统不能观的维度是4?

​ 对于平移来说,如果系统没有全局信息,就很难确定相机在世界坐标系中的绝对位置。在滚动(roll)和俯仰(pitch)发生变化时,重力会在测量中引入一些不确定性,但是对于偏航来说,由于重力一直指向下,说白了没有这个方向的投影分量,它并不提供关于相机绝对朝向的信息。因此,偏航角在这种情况下被认为是不可观测的

补充:为什么yaw被错误的能观测了?

​ 计算能观性矩阵会用到状态转移矩阵观测矩阵 ,这两个Jacobian的计算依赖状态值。如果使用状态真实值计算Jacobian,系统不能观维度为4,与真实系统一致;如果使用状态估计值,由于使用了不同时刻的估计量,能观性阵中会出现一个扰动项 ΔΓ,扰动项的存在使得yaw角对应那一维的零空间向量不再成立,从而导致yaw角被错误地能观了。

6.2 关于零空间解释

  Ax=0x就是矩阵A的零空间。

  矩阵A零度也就是不能观测的维度=n-秩。零度即零空间维度。

1 如果零空间维度为0,意味着矩阵的原像空间中只有一个样本可以被映射到矩阵像空间中的零点。(全0)
2 如果零空间维度为1:意味着矩阵的原像空间中有一条直线上的点经过矩阵算子后会被映射到像空间中的零点。
3 如果零空间维度为2:意味着矩阵的原像空间中有一个平面上的点经过矩阵算子后会被映射到像空间中的零点。
4 如果零空间维度为k:意味着矩阵的原像空间中有一个k维子空间,该k维子空间中的点经过矩阵算子后会被映射到像空间中的零点。

6.3 可观测性分析

  系统的可观测性属性影响估计器的一致性。在使用线性化估计器(如EKF)时,对评估系统和测量雅可比矩阵进行线性化错误会改变估计器获取信息的方向

  如果这些信息沿着不可观测的方向,将导致更大的误差、更小的不确定性和不一致性。就是说,如果由不可观变成可以观测,就会导致

  线性系统理论中提到,一个系统能否完全可观,看其能观测性判别矩阵 Q O Q_O QO是否满秩

  放到这里,就是如下形式,H表示系统输出矩阵(投影矩阵,不是雅可比!), ϕ \phi ϕ表示了系统矩阵离散化后的描述形式!注意这是一个时变系统。
O ≜ [ H 1 H 2 Φ 1 ⋮ H k Φ k − 1 ⋯ Φ 1 ] \left.\mathcal{O}\triangleq\left[\begin{array}{c}\mathbf{H}_1\\\mathbf{H}_2\mathbf{\Phi}_1\\\vdots\\\mathbf{H}_k\mathbf{\Phi}_{k-1}\cdots\mathbf{\Phi}_1\end{array}\right.\right] O H1H2Φ1HkΦk1Φ1

  这个矩阵对应的零空间如下

零空间:零空间的秩表示了不可观测的维度。很明显这个零空间的维度是4(两个全0行),刚好对应vio系统的不可观维度4,即平移与yaw。

O N 1 = 0 , N 1 = [ 0 3 R b v , 1 G g 0 3 0 3 0 3 − ( G v b , 1 ) ∧ G g 0 3 0 3 I 3 − ( t w b , 1 ) ∧ G g I 3 − ( p w ) ∧ G g ] = [ N t , 1 ∣ N r , 1 ] \left.\mathcal{O}\mathbf{N}_1=\mathbf{0},\quad\mathbf{N}_1=\left[\begin{array}{cc}\mathbf{0}_3&R_{bv,1}G\mathbf{g}\\\mathbf{0}_3&\mathbf{0}_3\\\mathbf{0}_3&-(^G\mathbf{v}_{b,1})^{\wedge G}\mathbf{g}\\\mathbf{0}_3&\mathbf{0}_3\\\mathbf{I}_3&-(t_{wb,1})^{\wedge G}\mathbf{g}\\\mathbf{I}_3&-(p_w)^{\wedge G}\mathbf{g}\end{array}\right.\right]=\left[\begin{array}{cc}\mathbf{N}_{t,1}&|&\mathbf{N}_{r,1}\end{array}\right] ON1=0,N1= 03030303I3I3Rbv,1Gg03(Gvb,1)Gg03(twb,1)Gg(pw)Gg =[Nt,1Nr,1]

  但是,随着状态增多,能观测性矩阵维度大了,其中 H k Φ k , 1 = H k Φ k , k − 1 … Φ 2 , 1 Φ 1 \mathrm{H}_k\Phi_{k,1}=\mathrm{H}_k\Phi_{k,k-1}\ldots\Phi_{2,1}\Phi_1 HkΦk,1=HkΦk,k1Φ2,1Φ1递推过程中,形式和理想的形式不一致了。就是能观测性矩阵形式变了,那么原来的零空间的形式肯定不再满足。0空间的最后一列不成立,导致可观测性多了一维(yaw)。

  论文中为了纠正这个问题,即仍然用原来零空间的形式,那么就只能强制修改能观测性矩阵的形式

6.4 可观测性约束

  针对上述问题,修改状态转移矩阵 Φ观测矩阵 H。本质上不需要关注0空间在每一时刻是否一样,只要保证每一个时刻的0空间维度都是4即可!也就是要满足下面两个式子!
N k = Φ k − 1 N k − 1 , H k N k = 0 \mathbf{N}_k=\Phi_{k-1}\mathbf{N}_{k-1},\quad\mathbf{H}_k\mathbf{N}_k=\mathbf{0} Nk=Φk1Nk1,HkNk=0

① 状态转移矩阵Φ

N k = Φ k − 1 N k − 1 \mathbf{N}_k=\Phi_{k-1}\mathbf{N}_{k-1} Nk=Φk1Nk1

  展开
N r , k + 1 = Φ k N r , k → [ C ( q ^ c , k + 1 ∣ k ) c g 0 3 − ⌊ c v ^ t , k + 1 ∣ k × ⌋ c g 0 3 − ⌊ c p ^ t , k + 1 ∣ k × ⌋ c g ] = [ Φ 11 Φ 12 0 3 0 3 0 3 0 3 0 3 I 3 0 3 0 3 0 3 Φ 31 Φ 32 I 3 0 34 0 3 0 3 0 3 0 3 I 3 0 3 0 51 Φ 52 δ t I 3 Φ 54 I 3 ] [ C ( q ^ c , k ∣ k − 1 ) c g 0 3 − ⌊ q ^ t , k ∣ k − 1 × ⌋ c g 0 3 0 3 ] . \mathbf{N}_{r,k+1}=\mathbf{\Phi}_k\mathbf{N}_{r,k}\quad\to\quad\begin{bmatrix}\mathbf{C}\left(\hat{q}_{c,k+1|k}\right)^{c}\mathbf{g}\\\mathbf{0}_{3}\\-\lfloor c\hat{\mathbf{v}}_{t,k+1|k}\times\rfloor^{c}\mathbf{g}\\\mathbf{0}_{3}\\-\lfloor{}^{c}\hat{\mathbf{p}}_{t,k+1|k}\times\rfloor^{c}\mathbf{g}\end{bmatrix}=\begin{bmatrix}\Phi_{11}&\Phi_{12}&\mathbf{0}_{3}&\mathbf{0}_{3}&\mathbf{0}_{3}&\mathbf{0}_{3}\\\mathbf{0}_{3}&\mathbf{I}_{3}&\mathbf{0}_{3}&\mathbf{0}_{3}&\mathbf{0}_{3}\\\Phi_{31}&\Phi_{32}&\mathbf{I}_{3}&\mathbf{0}_{34}&\mathbf{0}_{3}\\\mathbf{0}_{3}&\mathbf{0}_{3}&\mathbf{0}_{3}&\mathbf{I}_{3}&\mathbf{0}_{3}\\\mathbf{0}_{51}&\Phi_{52}&\delta t\mathbf{I}_{3}&\Phi_{54}&\mathbf{I}_{3}\end{bmatrix}\begin{bmatrix}\mathbf{C}\left(\hat{q}_{c,k|k-1}\right)^{c}\mathbf{g}\\\mathbf{0}_{3}\\-\lfloor\hat{q}_{t,k|k-1}\times\rfloor^{c}\mathbf{g}\\\mathbf{0}_{3}\\\mathbf{0}_{3}\end{bmatrix}. Nr,k+1=ΦkNr,k C(q^c,k+1∣k)cg03cv^t,k+1∣k×cg03cp^t,k+1∣k×cg = Φ1103Φ3103051Φ12I3Φ3203Φ520303I303δtI30303034I3Φ5403030303I303 C(q^c,kk1)cg03q^t,kk1×cg0303 .
我们把这个矩阵乘出来,能得到3个等式(主要是修改Φ11,31,51):

第1行:可以直接拿出来

C ( ′ q ˉ ^ G , k + 1 ∣ k ) c g = Φ 11 C ( ′ q ˉ ^ G , k ∣ k − 1 ) c g → Φ 11 = C ( ι , k + 1 ∣ k q ~ ^ ι , k ∣ k − 1 ) . \mathbf{C}\left({}^{\prime}\hat{\bar{q}}_{G,k+1|k}\right)^{c}\mathbf{g}=\Phi_{11}\mathbf{C}\left({}^{\prime}\hat{\bar{q}}_{G,k|k-1}\right)^{c}\mathbf{g}\quad\to\Phi_{11}=\mathbf{C}\left({}^{\iota,k+1|k}\hat{\tilde{q}}_{\iota,k|k-1}\right). C(qˉ^G,k+1∣k)cg=Φ11C(qˉ^G,kk1)cgΦ11=C(ι,k+1∣kq~^ι,kk1).

第3、5行:论文中提到线性相关,无法直接求,或者说由多个解(等式中包含了反对
称矩阵导致实际右侧如果按照第⼀个式子那么算就会导致得到矩阵是线性相关的)

Φ 31 C ( q ^ c , k ∣ k − 1 ) G g = ⌊ G v ^ l , k ∣ k − 1 × ⌋ G g − ⌊ G v ^ l , k + 1 ∣ k × ⌋ G g Φ 51 C ( I q ^ G , k ∣ k − 1 ) G g = δ t ⌊ G v ^ l , k ∣ k − 1 × ⌋ G g − ⌊ G p ^ l , k + 1 ∣ k × ⌋ G g \begin{aligned}\Phi_{31}\mathbf{C}\left(\hat{q}_{c,k|k-1}\right)^G\mathbf{g}&=\lfloor{}^G\hat{\mathbf{v}}_{l,k|k-1}\times\rfloor^G\mathbf{g}-\lfloor{}^G\hat{\mathbf{v}}_{l,k+1|k}\times\rfloor^G\mathbf{g}\\\Phi_{51}\mathbf{C}\left({}^I\hat{q}_{G,k|k-1}\right)^G\mathbf{g}&=\delta t\lfloor{}^G\hat{\mathbf{v}}_{l,k|k-1}\times\rfloor^G\mathbf{g}-\lfloor{}^G\hat{\mathbf{p}}_{l,k+1|k}\times\rfloor^G\mathbf{g}\end{aligned} Φ31C(q^c,kk1)GgΦ51C(Iq^G,kk1)Gg=Gv^l,kk1×GgGv^l,k+1∣k×Gg=δtGv^l,kk1×GgGp^l,k+1∣k×Gg

然后论文里面引入了一个最小二乘类似的约束,其中 A=Φ31 或 Φ51

min ⁡ A ∗ ∥ A ∗ − A ∥ F 2 , s.t.  A ∗ u = w \min_{\mathbf{A}^{*}}\left\|\mathbf{A}^{*}-\mathbf{A}\right\|_{\mathcal{F}}^{2},\quad\text{s.t. }\mathbf{A}^{*}\mathbf{u}=\mathbf{w} AminAAF2,s.t. Au=w

A ∗ = A − ( A u − w ) ( u T u ) − 1 u T \mathbf{A}^*=\mathbf{A}-(\mathbf{A}\mathbf{u}-\mathbf{w})\left(\mathbf{u}^T\mathbf{u}\right)^{-1}\mathbf{u}^T A=A(Auw)(uTu)1uT

// 5. Observability-constrained VINS 可观性约束// Modify the transition matrix// 5.1 修改phi_11// imu_state.orientation_null为上一个imu数据递推后保存的// 这块可能会有疑问,因为当上一个imu假如被观测更新了,// 导致当前的imu状态是由更新后的上一个imu状态递推而来,但是这里的值是没有更新的,这个有影响吗// 答案是没有的,因为我们更改了phi矩阵,保证了零空间// 并且这里必须这么处理,因为如果使用更新后的上一个imu状态构建上一时刻的零空间// 就破坏了上上一个跟上一个imu状态之间的0空间// Ni-1 = phi_[i-2] * Ni-2// Ni = phi_[i-1] * Ni-1^// 如果像上面这样约束,那么中间的0空间就“崩了”Matrix3d R_kk_1 = quaternionToRotation(imu_state.orientation_null);Phi.block<3, 3>(0, 0) =quaternionToRotation(imu_state.orientation) * R_kk_1.transpose();// 5.2 修改phi_31Vector3d u = R_kk_1 * IMUState::gravity;RowVector3d s = (u.transpose() * u).inverse() * u.transpose();Matrix3d A1 = Phi.block<3, 3>(6, 0);Vector3d w1 =skewSymmetric(imu_state.velocity_null - imu_state.velocity) * IMUState::gravity;Phi.block<3, 3>(6, 0) = A1 - (A1 * u - w1) * s;// 5.3 修改phi_51Matrix3d A2 = Phi.block<3, 3>(12, 0);Vector3d w2 =skewSymmetric(dtime * imu_state.velocity_null + imu_state.position_null -imu_state.position) *IMUState::gravity;Phi.block<3, 3>(12, 0) = A2 - (A2 * u - w2) * s;

② 对观测矩阵H–观测的雅可比矩阵

H c a m [ H θ G 0 3 × 9 H p l ∣ H f ] [ 0 3 C ( ι G , k ∣ k − 1 q ^ g ) c g 0 3 0 3 0 3 − ⌊ c q ^ ℓ , k ∣ k − 1 × ⌋ c g 0 3 0 3 I 3 − ⌊ c q ^ ℓ , k ∣ k − 1 × ⌋ c g I 3 − ⌊ c f ^ k ∣ k − 1 × ⌋ c g ] = [ 0 0 ] . \mathbf{H}_{cam}\begin{bmatrix}\mathbf{H}_{\theta_G}&\mathbf{0}_{3\times9}&\mathbf{H}_{\mathbf{p}_l}&|&\mathbf{H}_{\mathbf{f}}\end{bmatrix}\begin{bmatrix}\mathbf{0}_{3}&\mathbf{C}\left(\iota_{G,k|k-1}^{\hat{q}}\mathbf{g}\right)^{c}\mathbf{g}\\\mathbf{0}_{3}&\mathbf{0}_{3}\\\mathbf{0}_{3}&-\lfloor{}^{c}\mathbf{\hat{q}}_{\ell,k|k-1}\times\rfloor^{c}\mathbf{g}\\\mathbf{0}_{3}&\mathbf{0}_{3}\\\mathbf{I}_{3}&-\lfloor{}^{c}\mathbf{\hat{q}}_{\ell,k|k-1}\times\rfloor^{c}\mathbf{g}\\\mathbf{I}_{3}&-\lfloor{}^{c}\mathbf{\hat{f}}_{k|k-1}\times\rfloor^{c}\mathbf{g}\end{bmatrix}=\begin{bmatrix}\mathbf{0}&\mathbf{0}\end{bmatrix}. Hcam[HθG03×9HplHf] 03030303I3I3C(ιG,kk1q^g)cg03cq^,kk1×cg03cq^,kk1×cgcf^kk1×cg =[00].

  还是上面同样的计算方法,这部分细节后续在考虑吧,先把代码对应上即可。

  下面代码u就是对于了这个大矩阵(右),A就是对位姿的雅可比矩阵(左)。约束限制就是 A u = 0 = w Au=0=w Au=0=w。所以下面公式里的w其实是0.
H c a m [ H θ G H p l ] [ C ( q ^ G , k ∣ k − 1 ) G g ( ⌊ G f ^ k ∣ k − 1 × ⌋ − ⌊ G p ^ I , k ∣ k − 1 × ⌋ ) G g ] = 0. \mathbf{H}_{cam}\begin{bmatrix}\mathbf{H}_{\boldsymbol{\theta}_G}&\mathbf{H}_{\mathbf{p}_l}\end{bmatrix}\begin{bmatrix}\mathbf{C}\left(\hat{\boldsymbol{q}}_{G,k|k-1}\right)^G\mathbf{g}\\\left(\left\lfloor G\hat{\mathbf{f}}_{k|k-1}\times\right\rfloor-\left\lfloor{}^G\hat{\mathbf{p}}_{I,k|k-1}\times\right\rfloor\right)^G\mathbf{g}\end{bmatrix}=\mathbf{0}. Hcam[HθGHpl] C(q^G,kk1)Gg(Gf^kk1×Gp^I,kk1×)Gg =0.

H c a m \mathbf{H}_{cam} Hcam对应代码dz_dpc,即残差对相机系点 C P ^CP CP

H θ G \mathbf{H}_{\theta_G} HθG对应代码dpc_dxc,即相机系点 C P ^CP CP对旋转的雅可比

H p l \mathbf{H}_{\mathbf{p}_l} Hpl对应代码dpc_dxc,即相机系点 C P ^CP CP对平移的雅可比

H f \mathbf{H}_{\mathbf{f}} Hf对应代码dpc_dpg,即相机系点 C P ^CP CP对路标点 W P ^WP WP的雅可比

A ∗ = A − ( A u − w ) ( u T u ) − 1 u T \mathbf{A}^*=\mathbf{A}-(\mathbf{A}\mathbf{u}-\mathbf{w})\left(\mathbf{u}^T\mathbf{u}\right)^{-1}\mathbf{u}^T A=A(Auw)(uTu)1uT

解决来之后,根据下面公式依次对应新的雅可比。代码中是双目,所以行维都是4.

H c a m H θ G = A 1 : 2 , 1 : 3 ′ , H c a m H p l = A 1 : 2 , 4 : 6 ′ , H c a m H f = − A 1 : 2 , 4 : 6 ′ \mathbf{H}_{cam}\mathbf{H}_{\theta_G}=\mathbf{A}_{1:2,1:3}^{\prime},\mathbf{H}_{cam}\mathbf{H}_{\mathbf{p}_l}=\mathbf{A}_{1:2,4:6}^{\prime},\mathbf{H}_{cam}\mathbf{H}_{\mathbf{f}}=-\mathbf{A}_{1:2,4:6}^{\prime} HcamHθG=A1:2,1:3,HcamHpl=A1:2,4:6,HcamHf=A1:2,4:6

    // Modifty the measurement Jacobian to ensure// observability constrain.// 6. OCMatrix<double, 4, 6> A = H_x;Matrix<double, 6, 1> u = Matrix<double, 6, 1>::Zero();u.block<3, 1>(0, 0) = quaternionToRotation(cam_state.orientation_null) * IMUState::gravity;u.block<3, 1>(3, 0) =skewSymmetric(p_w - cam_state.position_null) * IMUState::gravity;H_x = A - A * u * (u.transpose() * u).inverse() * u.transpose();H_f = -H_x.block<4, 3>(0, 3);//4*3大小,从0行3列开始取,对应公式

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

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

相关文章

【洛谷 P8682】[蓝桥杯 2019 省 B] 等差数列 题解(数学+排序+辗转相除法)

[蓝桥杯 2019 省 B] 等差数列 题目描述 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列&#xff0c;只记得其中 N N N 个整数。 现在给出这 N N N 个整数&#xff0c;小明想知道包含这 N N N 个整数的最短的等差数列有几项&#xff1f; 输…

deep learning with pytorch(一)

1.create a basic nerual network model with pytorch 数据集 Iris UCI Machine Learning Repository fully connected 目标:创建从输入层的代码开始&#xff0c;向前移动到隐藏层&#xff0c;最后到输出层 # %% import torch import torch.nn as nn import torch.nn.funct…

【大数据】详细讲解

大数据 0. 前言1. 大数据的5V特征2. 大数据技术3. 大数据分析4. 大数据应用5. 失效风险与挑战 0. 前言 大数据是一个涉及非常庞大和复杂数据集的领域&#xff0c;这些数据集因其规模和复杂性而难以使用传统数据处理软件进行有效处理。在讲解大数据之前&#xff0c;我们首先需要…

LeetCode26 删除有序数组中的重复项

题目 给你一个 非严格递增排列 的数组 nums &#xff0c;请你原地删除重复出现的元素&#xff0c; 使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。 元素的 相对顺序 应该保持 一致 然后返回 nums 中唯一元素的个数。 示例 示例 1&#xff1a;输入&#xff1a;num…

30天JS挑战(第十四天)------数据的复制

第十四天挑战(数据的复制) 地址&#xff1a;https://javascript30.com/ 所有内容均上传至gitee&#xff0c;答案不唯一&#xff0c;仅代表本人思路 中文详解&#xff1a;https://github.com/soyaine/JavaScript30 该详解是Soyaine及其团队整理编撰的&#xff0c;是对源代码…

后端开发技术面试指南

工作10多年&#xff0c;每年都会帮组里面试一些新同学校招社招的都有&#xff0c;下面我就从一个面试官的视角来给大家拆解一下如何淡然应对后端开发技术面试。 1.一面多为电话面试 (1)问七问八 ①简历要注重内容&#xff0c;形式上不丑没有错别字即可。之前收到过一个工作5…

经典语义分割(一)利用pytorch复现全卷积神经网络FCN

经典语义分割(一)利用pytorch复现全卷积神经网络FCN 这里选择B站up主[霹雳吧啦Wz]根据pytorch官方torchvision模块中实现的FCN源码。 Github连接&#xff1a;FCN源码 1 FCN模型搭建 1.1 FCN网络图 pytorch官方实现的FCN网络图&#xff0c;如下所示。 1.2 backbone FCN原…

为raspberrypi编译bpftrace调试工具

基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客&#xff0c;其中提到&#xff0c;在嵌入式设备上使用BCC或bpftrace是不可行的&#xff1b;主要原因在于嵌入式设备的资源有限&#xff0c;而这两个调试工具依赖python/clang/llvm等库&…

Scratch 第十六课-弹珠台游戏

第十六课-弹珠台游戏 大家好&#xff0c;今天我们一起做一款弹珠台scratch游戏&#xff0c;我们也可以叫它弹球游戏&#xff01;这款游戏在刚出来的时候非常火爆。小朋友们要认真学习下&#xff01; 这节课的学习目标 物体碰撞如何处理转向问题。复习键盘对角色的控制方式。…

STL-内存的配置与释放

STL-内存的配置与释放 STL有两级空间配置器&#xff0c;默认是使用第二级。第二级空间配置器会在某些情况下去调用第一级空间配置器。空间配置器都是在allocate函数内分配内存&#xff0c;在deallocate函数内释放内存。 第一级空间配置器 第一级配置器只是对malloc函数和fre…

【自然语言处理】BitNet b1.58:1bit LLM时代

论文地址&#xff1a;https://arxiv.org/pdf/2402.17764.pdf 相关博客 【自然语言处理】BitNet b1.58&#xff1a;1bit LLM时代 【自然语言处理】【长文本处理】RMT&#xff1a;能处理长度超过一百万token的Transformer 【自然语言处理】【大模型】MPT模型结构源码解析(单机版)…

如何在 Mac 上成功轻松地恢复 Excel 文件

Microsoft Excel 的 Mac 版本始终略落后于 Windows 版本&#xff0c;这也许可以解释为什么如此多的用户渴望学习如何在 Mac 上恢复 Excel 文件。 但导致重要电子表格不可用的不仅仅是 Mac 版 Excel 的不完全稳定性。用户有时会失去注意力并删除错误的文件&#xff0c;存储设备…

2024-03-03 c++

&#x1f338; MFC进度条控件 | Progress Control 1。新建MFC项目&#xff08;基于对话框、静态库&#xff09; 2。添加控件&#xff0c;删除初始的3个多余控件 加1个progress control&#xff0c;修改其marquee为true&#xff0c;添加变量&#xff1a;变量名为test_progress。…

Angular基础---HelloWorld---Day1

文章目录 1. 创建Angular 项目2.对Angular架构的最基本了解3.创建并引用新的组件&#xff08;component&#xff09;4.对Angular架构新的认识&#xff08;多组件&#xff09;5.组件中业务逻辑文件的编辑&#xff08;ts文件&#xff09;6.标签中属性的绑定(1) ID的绑定(2) class…

String和String Builder

String和StringBuilder的区别 String类 String类代表字符串。java程序中所有字符串文字&#xff08;例如“abc”&#xff09;都被实现为此类的实例。 String类源码是用final修饰的&#xff0c;它们的值在创建后不能被更改。字符串缓冲区支持可变字符串。 String对象是不可变…

STM32 (2)

1.stm32编程模型 将C语言程序烧录到芯片中会存储在单片机的flsah存储器中&#xff0c;给芯片上电后&#xff0c;Flash中的程序会逐条进入到CPU中去执行&#xff0c;进而CPU去控制各种模块&#xff08;即外设&#xff09;去实现各种功能。 2.寄存器和寄存器编程 CPU通过控制其…

Apache POI的简单介绍与应用

介绍 Apache POI 是一个处理Miscrosoft Office各种文件格式的开源项目。我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作。PS&#xff1a; 一般情况下&#xff0c;POI 都是用于操作 Excel 文件&#xff0c;如图&#xff1a; Apache POI 的应用场景&…

SQL无列名注入

SQL无列名注入 ​ 前段时间&#xff0c;队里某位大佬发了一个关于sql注入无列名的文章&#xff0c;感觉好像很有用&#xff0c;特地研究下。 关于 information_schema 数据库&#xff1a; ​ 对于这一个库&#xff0c;我所知晓的内容并不多&#xff0c;并且之前总结SQL注入的…

设计模式-桥接模式实践案例

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;用于将抽象与实现分离&#xff0c;使它们可以独立地变化。这种模式通过提供一个桥接结构&#xff0c;可以将实现接口的实现部分和抽象层中可变化的部分分离开来。 以下是一个使用 Java 实现桥…

【数据结构】_包装类与泛型

目录 1. 包装类 1.1 基本数据类型和对应的包装类 1.2 &#xff08;自动&#xff09;装箱和&#xff08;自动&#xff09;拆箱 1.2.1 装箱与拆箱 1.2.2 自动&#xff08;显式&#xff09;装箱与自动&#xff08;显式&#xff09;拆箱 1.3 valueOf()方法 2. 泛型类 2.1 泛…