对卡尔曼滤波的理解和简单示例实现
目录
一、概述
二、基本公式解释
1)状态转移方程
2)状态更新方程
3)卡尔曼系数更新方程
4)误差协方差估计方程
三、一个简单示例
一、概述
经典卡尔曼滤波算法在线性系统中运用非常广泛,可以对数据实现很好的平滑处理,降低噪声,使滤波后的数据更加接近真实值。此处不对卡尔曼滤波做深入的数学原理分析,相关的资料已经很多,只是讲解卡尔曼滤波的基本使用方法。卡尔曼滤波核心思想就是利用当前时刻的测量值与前一时刻对当前时刻的估计值进行加权求和后,得到当前时刻的最优值,这个值被认为是最接近真实值的结果。
二、基本公式解释
卡尔曼基本公式有5个,分别是估计和更新两部分。估计公式如下:
更新公式如下:
1)状态转移方程
估计公式中的第一个方程称为状态转移方程,它的作用是利用前一时刻的最优估计值计算当前时刻的估计值。公式中,F为状态转移矩阵,B为控制矩阵,u为控制量,x为状态量,这些量均为矩阵形式。状态转移方程具体如何构造,则与实际对象直接相关。比如对一个直线运动的物体,对不同时刻下测得的距离数据进行滤波处理。我们首先需要做的就是构建卡尔曼滤波需要使用到的状态转移方程,就是如何利用前一时刻的状态得到当前时刻的状态。很明显,这里最直观的状态量就是距离,那么如何通过前一个距离得到下一个距离呢?很自然我们会想到在这个场景中物体的运动可能满足这个数学模型r1=r0+v*dt。这是一个最简单的匀速直线运动数学模型,用它就可以关联起前后两个时刻的距离信息。为了说明的简单,这里我们就默认已知这个运动就是匀速直线运动,不考虑加速度,考虑也只是状态量的维度增加而已。
那么如何将这个数学模型转换为状态转移方程呢?首先我们要搞清楚方程中每个变量的实际含义:
u为控制量,它是从上一个状态到下一个状态期间,外界额外施加的影响,比如在当前这个场景中额外施加一个变化的力,这个力会影响距离值。此处没有这个影响,所以u直接取0。
B为控制矩阵,就是将这个u转换为我们所需要的状态量所使用的转换矩阵,它反映了u和x之间的关系。此处也可以不需要。
x为状态量,是卡尔曼滤波的关键。直观的我们是要得到物体的距离,所以很自然会将距离纳入到状态向量中,但是在这个场景中状态向量不仅包含距离。从数学模型中我们看到,模型中还用到了速度v和时间间隔dt。我们知道这个dt是用来表征过程的,不属于物体的状态,而v表征的是物体的速度,所以在此模型中,状态向量x应为x = [r;v],构造为列向量。那么根据这个数学模型,我们就可以写出状态转移方程F为:
通过对状态转移方程的说明,可知道:构造状态转移方程的前提是假设出实际场景中前后状态之间的数学模型,这个模型可以不是绝对准确,但要基本要反映前后状态的关系。如果不知道前后状态之间有何关系,不能提供一个符合度较好的数学模型,则是不能继续后续工作,也就不能使用卡尔曼滤波了。再者就是状态向量是根据数学模型分析出来的,它包含测量量,也可以包含未测量的量,如v。或许有人会问这个未测量的量怎么赋值,这个不用担心,我们只需提供一个初始随机值,在后续计算中这个值会逐渐趋于稳定(如果场景真是一个匀速运动)。
2)状态更新方程
此处跳过其它方程而直接对状态更新方程进行说明,主要是遵循卡尔曼滤波的核心思想,便于更好理解滤波的具体实现流程。状态转移方程利用前后时刻状态之间的关系,通过使用上一时刻的最优估计值得到了对当前时刻的估计值,当然这个值不是真实值。我们也不可能得到真实值,但我们希望最终能够得到最接近真实的值。
状态更新方程就是将估计值与测量值进行叠加,得到对当前时刻的最优估计结果。在状态更新方程中,J就是卡尔曼系数、s就是测量的状态量、D是观测矩阵。
卡尔曼系数J:从状态更新方程的形式上我们可以看出,J其实表征了观测量和估计量在最终的最优估计中所占比重的大小,J越大,则观测量占比重越大,反之越小。其计算后续再说明。
观测量s 就是测得的距离值。
观测矩阵D表示状态量与观测量之间的关系,在此处,观测量s只有一个距离r,而状态量包括r和v,所以,要将状态量x转换到观测量s的形式需要一个矩阵D,在此处D=[1 0],因为只需要保留状态量中的距离值。
3)卡尔曼系数更新方程
更新方程中的第一个方程即为卡尔曼系数更新方程,这个方程表示了卡尔曼系数的计算方法,也表针该系数在每步滤波后都会重新计算。式中,P为误差协方差矩阵,O为测量噪声协方矩阵。结合估计方程中的第二个计算P的方程,从形式上看,我们可以简单理解为,卡尔曼系数反映了在测量噪声和状态噪声中,状态噪声所占的比重。结合前面的分析,我们可以发现下面的关系:
状态噪声——卡尔曼系数——观测量占比,这三个量呈正相关关系,也就是说,如果状态噪声越大,那么观测量在最优估计值中的占比也就越大。这正与我们的期望是一致的,即如果状态噪声过大,说明我们建立的模型不够准确,状态转移方程会引入较大的估计误差,因此我们更愿意相信测量的结果。上述关系对应测量噪声O正好相反。
下面再说明卡尔曼系数更新方程中参数的取值,此处只说明测量噪声O,或者叫观测噪声。这个参数在此处就是一个常数,因为我们只有一个观测量。它的大小是多少需要根据实际情况来设定,而不是通过计算得来的,它表示的是我们仪器的测量误差,也就是测量噪声。
4)误差协方差估计方程
估计方程中的第二个方程就是误差协方差估计方程,该方程用于估计误差协方差矩阵P。P反映的是我们的状态估计量的误差之间的相关性,同时包含了估计误差的大小,方程中加入了状态转移噪声协方差矩阵Q,反映了不同状态变量之间的噪声关系,它的取值有一些经验公式。
在滤波过程中,P是在不断变化的,它的初始值对滤波初期的影响较大,它反映了对初始估计值的可信程度,设置不合理可能导致滤波初期误差偏大。
三、一个简单示例
以下是基于MATLAB实现的一个简单示例,加载的数据文件包含3列数据,分别是时间、距离和速度,滤波只使用了时间、距离信息。在滤波过程中对速度进行了估计,并比对速度估计结果。
clear;
clc;
weizhi = load("weizhi-int.txt");
t = weizhi(:,1);
z = weizhi(:,2);
V_true = weizhi(:,3);%提取出真实速度
%plot(t,z);
count = length(weizhi(:,2));
%noise = randn(1,count)*50;
%z = z + noise';
%首先初始化相关参数
H = [1 0];%测量矩阵
F = [1 0.05;0 1];%状态转移矩阵
dt = 0.05;
sigma_a = 200;
Q = [dt^4/4 dt^3/2; dt^3/2 dt^2] * sigma_a^2;%过程噪声
R = 0.1;%测量噪声
P = [1 0; 1 0];%初始状态协方差矩阵
I = eye(2);
% 初始化
x_true = [0; 0]; % 真实状态 [位置; 速度]
x_est = [z(1); 0]; % 估计状态
estimations = zeros(2,count);
estimations(:,1) = z(1);
R_pre = zeros(1,count);%存放位置预测值
Rerror = zeros(1,count);%存放位置预测误差
V_pre = zeros(1,count);%存放速度估计值
V_error = zeros(1,count);%存放速度估计误差
%开始计算
for i = 1:count%%预测x_pred = F * x_est;%对当前位置的预测值P_pred = F * P * F' + Q;% --- 更新步骤 ---K = P_pred * H' / (H * P_pred * H' + R); % 卡尔曼增益x_est = x_pred + K * (z(i) - H * x_pred);%得到最优估计值P = (I - K * H) * P_pred;%更新协方差矩阵% 存储估计结果estimations(:,i) = x_est;%当前位置的最优估计结果R_pre(i) = x_pred(1);Rerror(i) = x_pred(1)-z(i);if i > 20%取1s间隔估计速度V_pre(i) = x_pred(1)-R_pre(i-20);elseif i > 1V_pre(i) = (x_pred(1)-R_pre(1))/(0.05*(i-1));endendV_error(i) = V_pre(i)-V_true(i);
end
figure(1);
subplot(2,1,1);
plot(t,z);
hold on;
plot(t,R_pre,'.');
%plot(t,estimations(1,:),'.');
legend("测量值","预测值");
xlabel("时间(s)");
ylabel("距离(m)");
grid on;
subplot(2,1,2);
plot(t,Rerror,'.');
xlabel("时间(s)");
ylabel("距离预测误差(m)");
grid on;
figure(2);
subplot(2,1,1);
plot(t,V_pre,'.');
hold on;
plot(t,V_true);
legend("估计值","实测值");
xlabel("时间(s)");
ylabel("速度(m/s)");
grid on;
grid on;
subplot(2,1,2);
plot(t,V_error,'.');
xlabel("时间(s)");
ylabel("速度估计误差(m)");
grid on;
相关文章:
对卡尔曼滤波的理解和简单示例实现
目录 一、概述 二、基本公式解释 1)状态转移方程 2)状态更新方程 3)卡尔曼系数更新方程 4)误差协方差估计方程 三、一个简单示例 一、概述 经典卡尔曼滤波算法在线性系统中运用非常广泛,可以对数据实现很好的平…...
Linux基础命令总结
Linux系统命令 1. systemctl 1. 基本语法 systemctl start | stop | restart | status 服务名 2. 经验技巧查看服务的方法:/usr/lib/systemd/system 3. 案例实操 (1)查看防火墙服务的状态 systemctl status firewalld (2)停止防火墙服务 systemctl stop firewalld (…...
视觉大模型专栏导航
关于视觉大模型专栏,暂时还没有比较明确的更新计划,最近会在本专栏上更新关于Sam模型的基本原理,包括Image Encoder、Prompt Encoder及Mask Decoder等模块的实现;还有记录下如何利用Sam代码跑通一个demo。 后期接触了其他视觉大模…...
Eigen的主要类及其功能
Eigen 是一个高性能的 C 模板库,主要用于线性代数、矩阵和向量运算。它提供了许多类来支持各种数学运算,以下是 Eigen 的主要类及其功能分类。 1. 核心矩阵和向量类 这些是 Eigen 中最常用的类,用于表示矩阵和向量: Matrix - 通用…...
深入理解TransmittableThreadLocal:原理、使用与避坑指南
一、ThreadLocal与InheritableThreadLocal回顾 在介绍TransmittableThreadLocal之前,我们先回顾一下Java中的ThreadLocal和InheritableThreadLocal。 1. ThreadLocal ThreadLocal提供了线程局部变量,每个线程都可以通过get/set访问自己独立的变量副本…...
大模型奖励建模新突破!Inference-Time Scaling for Generalist Reward Modeling
传统的RM在通用领域面临准确性和灵活性挑战,而DeepSeek-GRM通过动态生成principle和critic,结合并行采样与meta RM引导的投票机制,实现了更高质量的奖励信号生成。论文通过Self-Principled Critique Tuning (SPCT)方法,显著提升了…...
C++:string 1
练习题: 这个题的思路是从前往后,从后往前同时找,不是字母的话就继续,是的话就交换。 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include <string> using namespace std; //1、4个…...
C语言学习之调试
在C语言的编程学习中,我们能不可避免的要遇到bug。通常我们面对编译错误等问题是很容易发现的,但是当我们面对代码结果不满足预期等情况下是很难去改的,因此我们就要学习如何调试代码。 bug与调试 什么是bug? bug本意是“昆虫”和…...
【project】--模拟搭建一个中小型校园网的网络平台
文章目录 项目介绍设备及IP地址分配node01配置网卡配置DHCP配置路由转发 node02配置网卡配置安装并配置授权 Unbound DNS node03配置网卡配置安装防火墙SNAT配置DNAT配置(端口转发)纯缓存 Unbound DNS 配置 node04配置node05配置node06配置 项目介绍 本项目通过1台物理机和VMw…...
DeepSeek 的长上下文扩展机制
DeepSeek 在基础预训练完成后,引入 YaRN(Yet another RoPE extensioN method)技术,通过额外的训练阶段将模型的上下文窗口从默认的 4K 逐步扩展至 128K。整个过程分为两个阶段:第一阶段将上下文窗口从 4K 扩展到 32K;第二阶段则进一步从 32K 扩展到 128K。每个阶段均采用…...
AQS条件队列源码详细剖析
AQS条件队列源码详细剖析 0.简介 欢迎来到我的博客:TWind的博客 最好先看过我博客中的 ReentrantLock的超详细源码解析 ,不然想要理解条件队列的源码会非常困难。 AQS中的条件队列相比同步队列略显简单,但依然优异且高效,复杂而…...
LeetCode --- 446 周赛
题目列表 3522. 执行指令后的得分 3523. 非递减数组的最大长度 3524. 求出数组的 X 值 I 3525. 求出数组的 X 值 II 一、执行指令后的得分 照着题目要求进行模拟即可,代码如下 // C class Solution { public:long long calculateScore(vector<string>&…...
ngrok 内网穿透技术系统性文档
ngrok 内网穿透技术系统性文档—目录 1. 概述与背景1.1 内网穿透的需求背景1.2 ngrok的核心定义1.3 定位与核心价值 2. 核心原理与技术架构2.1 技术架构图2.2 核心原理详解2.2.1 隧道建立流程2.2.2 多协议支持机制2.2.3 动态DNS与路由 3. 功能体系与配置详解3.1 基础功能3.1.1 …...
C++ 为什么建议类模板定义在头文件中,而不定义在源文件中
类模板 XXXX 模板的编译模式模板不是实际的代码,而是一个“代码生成模板” 分离定义会导致链接错误补充为什么普通类可以分离定义?对比C11的export关键字(已弃用) 模板的编译模式 C模板采用两阶段编译(Two-Phase Tran…...
Android studio学习之路(八)---Fragment碎片化页面的使用
fragment的用法很常见,你可能经常看见这样的画面: 通过滑动来进行切换页面,今天我们就来实现这样的形式 介绍 使用 Fragment 的核心价值在于 模块化设计 和 动态适配能力,尤其适合以下场景: 需要…...
数据结构和算法(九)--红黑树
一、红黑树 1、红黑树 前面介绍了2-3树,可以看到2-3树能保证在插入元素之后,树依然保持平衡状态,它的最坏情况下所有子结点都是2-结点,树的高度为IgN,相比于我们普通的二叉查找树,最坏情况下树的高度为N,确…...
字节跳动开源数字人模型latentsync1.5,性能、质量进一步优化~
项目背景 LatentSync1.5 是由 ByteDance 开发的一款先进的 AI 模型,专门针对视频唇同步(lip synchronization)任务设计,旨在实现音频与视频唇部动作的高质量、自然匹配。随着 AI 技术的快速发展,视频生成和编辑的需求…...
Pygame入门:零基础打造你的第一个游戏窗口
Pygame入门:零基础打造你的第一个游戏窗口 大家好,欢迎来到本期的技术分享!今天,我们将一起探索如何使用Python中的Pygame库来创建一个简单的游戏窗口。无论你是编程新手,还是对游戏开发感兴趣的朋友,这篇文章都将帮助你迈出第一步。让我们开始吧! 什么是Pygame? 在…...
《ATPL地面培训教材13:飞行原理》——第13章:高速飞行
翻译:刘远贺;工具:Cursor & Cluade 3.7;过程稿 第13章:高速飞行 目录 引言声速马赫数恒定指示空速爬升对马赫数的影响恒定马赫数下真空速随高度的变化恒定飞行高度和指示空速下温度对马赫数的影响气动流动的细分…...
【C语言练习】004. 使用各种运算符进行计算
【C语言练习】004. 使用各种运算符进行计算 004. 使用各种运算符进行计算1. 算术运算符2. 关系运算符3. 逻辑运算符4. 位运算符5. 赋值运算符6. 逗号运算符综合示例输出结果004. 使用各种运算符进行计算 在C语言中,运算符用于执行各种数学和逻辑运算。以下是一些常见的运算符…...
Pygame事件处理详解:键盘、鼠标与自定义事件
Pygame事件处理详解:键盘、鼠标与自定义事件 在游戏开发中,玩家的交互是至关重要的。无论是移动角色、触发动作还是暂停游戏,都需要通过各种输入来实现。Pygame作为一个功能强大的Python库,提供了丰富的API来处理这些输入,包括键盘、鼠标以及自定义事件。本文将详细介绍如…...
16. LangChain自主智能体(Autonomous Agent):模拟人类工作流的进阶设计
引言:当AI学会"思考"与"行动" 2025年某跨国律所的合同审查智能体,通过自主规划任务流,将平均处理时间从8小时缩短至23分钟。本文将基于LangChain的AgentExecutor与Deepseek-R1,揭示如何构建能自主决策、动态…...
直接映射例题及解析
目录 基本单位换算 例题一 📁 Tag Directory(标签目录) 是什么? 例题二 例题三 例题四 串行访问还是并行访问的选择 例题五 例题六 例题七 🔵 P1:(按行访问) …...
MAVLink协议:原理、应用与实践
目录 1. 前言 2. MAVLink 协议的基本概念 2.1 协议概述 2.2 消息格式 2.3 协议版本 3. MAVLink 协议的适应场景 3.1 无人机地面站与飞行器通信 3.2 飞行器与传感器通信 3.3 无人机集群通信 3.4 飞行模拟与测试 4. 基于 Python 的 MAVLink 协议编程实践 4.1 开发环境…...
【记一次亚马逊普华永道审计流程】
1、2025年2月21日 收到审计邮件 2、2025年2月25日未及时关注注册开发者的邮箱导致一直未回复 3、2025年3月4日亚马逊警告邮件-依旧未回复 4、2025年3月13日APP正式被亚马逊开发者商店下架 停用影响: APP从官方商店下架,不能授权新店铺 停用原因: 由于此邮箱为注册…...
Java 异常处理全解析:从基础到自定义异常的实战指南
Java 异常处理全解析:从基础到自定义异常的实战指南 一、Java 异常体系:Error 与 Exception 的本质区别 1. 异常体系核心架构 Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许…...
二、UI自动化测试02--元素定位方法
目录 一、定位⼀组元素⽅法二、XPath 定位⽅法1. 路径策略1.1 路径值获取⽅法 2. 利⽤元素属性策略利⽤元素属性策略的注意事项 3. 属性和逻辑结合4. 层级和属性结合策略5. XPath 延伸⽅法 三、CSS 定位⽅法1. CSS 策略: id选择器/class选择器/元素选择器/属性选择器2. 属性选择…...
第二章 信息技术发展(2.1 信息技术及其发展)
2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件 (Computer Hardware) 是指计算机系统中由电 、机械和光电元件等组成 的各 种物理装置的总称计算机软件 (Computer Software) 是指计算机系统中的程序及其文档,程序是计 算任务的处理对象和处理规则的描述;文档是为了便千…...
【SwitchyOmega安装教程】
目录 一、插件安装 1. 下载安装文件 2. 打开浏览器扩展安装页面 3. 安装插件 二、界面详情 三、配置信息 3.1 设置IP 1、查看IP地址信息 2、批量测试IP是否有效 3、点击扩展程序,选择 Proxy SwitchyOmega 4、 点击选项进行配置 5、配置页面 一、插件安装 1…...
驱动开发硬核特训 · Day 21(上篇加强版):深入理解子系统机制与实战初探
📅 日期:2025-04-27 📚 技术平台:嵌入式Jerry(B站) 1. 为什么要有子系统?(深度版) 在 Linux 内核发展早期,设备管理较为混乱,每种设备࿰…...
GoFly快速开发框架新增UI素材库-帮助开发者快速开发管理后台UI基于ArcoDesign框架开发
说明: 为开发者提供管理台的UI素材,社区将持续为开发开发后台系统常用UI界面,让开发时能有一半的界面可以直接从UI库获取,减少开发者自己排版界面的时间,帮助开发者快速开发后台业务。 使用的前端版本要求࿱…...
Unity-Shader详解-其二
前向渲染和延迟渲染 前向渲染和延迟渲染总的来说是我们的两种主要的渲染方式。 我们在Unity的Project Settings中的Graphic界面能够找到渲染队列的设定: 我们也可以在Main Camera这里进行设置: 那这里我们首先介绍一下两种渲染(Forward R…...
Windows 安装 Neo4j 教程
Windows 安装 Neo4j 教程 Neo4j 是一个开源的图数据库,它以图形结构存储数据,适合用于处理高度连接的数据,广泛应用于社交网络、推荐系统、欺诈检测等场景。本文将为你介绍如何在 Windows 系统上安装和配置 Neo4j 数据库。 一、安装前准备 …...
Neo4j 常用查询语句
Neo4j 常用查询语句 Neo4j 是一个图数据库,查询语言是 Cypher,它类似于 SQL 但针对图形数据进行了优化。Cypher 语法直观易懂,适合用来处理图数据。本文将介绍一些 Neo4j 中常用的查询语句,帮助你快速掌握图数据的操作方法。 一…...
机器学习(10)——神经网络
文章目录 1. 神经网络基本原理1.1. 什么是神经网络1.2. 核心思想 2. 基础组件3. 前向传播(Forward Propagation)4. 反向传播(Backpropagation)5. 激活函数对比6. 网络架构类型7. 优化策略8. Python示例(PyTorch&#x…...
Qt软件开发-摄像头检测使用软件V1.1
系列文章目录 Qt软件开发-摄像头检测使用软件V1.1 文章目录 系列文章目录前言一、V1.1增加了哪些功能?二、代码构成1.总体结构2. 代码内容 三、效果展示图总结 前言 之前,在Qt软件开发-摄像头检测使用软件:https://blog.csdn.net/xuming204…...
AI日报 - 2025年04月26日
🌟 今日概览(60秒速览) ▎🤖 模型竞赛 | OpenAI与Google新模型在Arena榜单激烈角逐,性能指标各有千秋。 OpenAI发布o3/o4-mini等新模型,Gemini 2.5 Pro紧随其后,数学、编程能力成焦点。 ▎💼 商业动向 | 并…...
ES6 Map/WeakMap/Set/WeakSet 全解指南
一、设计思想与核心概念 1. 解决传统结构的痛点 Object:键只能是字符串/Symbol、无序、无size属性Array:查找效率低(O(n))、无自动去重机制核心突破:// 传统方式 vs ES6方式 const obj { [{}]: value }; // 键会被转为"[object Obje…...
【Python】使用uv管理python虚拟环境
本文介绍了python虚拟环境管理工具uv,包括uv的作用、uv的常用命令等等。 参考:UV - 管理Python 版本、环境、第三方包 1. 介绍uv 官网:https://docs.astral.sh/uv/ uv是一个python虚拟环境管理工具,可以用来替代pip、pyenv、vir…...
求解,如何控制三相无刷电机?欢迎到访评论
问题:通过一个集成的TF2104芯片控制H桥上桥臂和下桥臂,如何控制?还是说得需要PWM_UH和PWM_UL分开控制?...
002 六自由度舵机机械臂——姿态解算理论
00 DH模型的核心概念 【全程干货【六轴机械臂正逆解计算及仿真示例】】 如何实现机械臂的逆解计算-机器谱-robotway DH模型是机器人运动学建模的基础方法,通过四个参数描述相邻关节坐标系之间的变换关系。其核心思想是将复杂的空间位姿转换分解为绕轴旋转…...
部署大模型需要多少GPU显存?以DeepSeek R1部署为例
引言 部署大型语言模型(LLM)时究竟需要多少GPU显存?本文将进行一次简单测算。 如何计算 算法1 可以用一个简单的公式来计算显存占用(单位GB): 参数说明如下: 符号 含义 M 所需的 GPU 显存…...
C++?类和对象(下)!!!
一、前言 在之前我们已经讨论过了有关类和对象的前置知识以及类中的六大默认成员函数,在本期我们继续再讨论类和对象中剩余的友元、初始化列表等相关知识,如果需要再了解之前的知识的话,链接奉上:C?类和对象࿰…...
function,bind,lambda的用法
C中的std::function、std::bind与Lambda表达式详解 一、std::function std::function是C11标准引入的类模板,用于封装任意类型的可调用对象,例如函数指针、Lambda表达式、函数对象等。通过std::function可以实现不同形式可调用对象的统一存储与调用…...
Maven的聚合工程与继承
目录 一、为什么需要使用Maven工程 二、聚合工程的结构 三、聚合工程实现步骤 四、父工程统一管理版本 五、编译打包 大家好,我是jstart千语。想着平时开发项目似乎都是用maven来管理的,并且大多都是聚合工程。而且在maven的聚合工程中,…...
C/C++对时间的处理
1. 两种数据结构 time_t 是一个在C和C++编程语言中用于表示时间的类型。time_t类型通常是一个长整型(long int)或整数类型,用于表示从特定参考点(通常是1970年1月1日00:00:00 UTC)经过的秒数。 time_t定义在<ctime>头文件中,通常用于记录时间戳,比如获取当前时间…...
Spring Boot 支持政策
🧑💻 Spring Boot 支持政策 ✒️ Andy Wilkinson 于2023年12月7日编辑本页 32次修订 📌 核心政策 🛡️ VMware Tanzu 开源支持政策 Spring Boot 针对关键错误和安全问题提供支持 📆 版本支持周期 1️⃣ 主要版本&a…...
实验四 进程调度实验
一、实验目的 1、了解操作系统CPU管理的主要内容。 2、加深理解操作系统管理控制进程的数据结构--PCB。 3、掌握几种常见的CPU调度算法(FCFS、SJF、HRRF、RR)的基本思想和实现过程。 4、用C语言模拟实现CPU调度算法。 5、掌握CPU调度算法性能评价指…...
静态多态和动态多态的区别
C多态机制深度解析 多态是面向对象编程的核心特性,允许通过统一接口执行不同实现。在C中,多态表现为基类指针或引用调用虚函数时,根据实际对象类型执行对应派生类的函数逻辑。 基础实现示例 定义基类与派生类,演示动态绑定…...
现代化Android开发:Compose提示信息的最佳封装方案
在 Android 开发中,良好的用户反馈机制至关重要。Jetpack Compose 提供了现代化的 UI 构建方式,但提示信息(Toast/Snackbar)的管理往往显得分散。本文将介绍如何优雅地封装提示信息,提升代码可维护性。 一、基础封装方案 1. 简单 Snackbar …...