卡尔曼滤波器与DSP实现
卡尔曼滤波器是利用系统状态方程,结合测量结果对系统状态进行进行最优估计的算法。本文介绍它的主要公式,并举例在C6000 DSP上实现。
推荐资料
- KalmanFilter.NET
- Understanding Kalman Filters
- 卡尔曼滤波与组合导航原理
“If you can’t explain it simply, you don’t understand it well enough.” —— Albert Einstein
第一个网站是我认为的讲卡尔曼滤波讲得最好的资料!“如果你不能用简单的话把问题解释清楚,那就是理解得不够”。作者就是能用例子把问题讲得很清楚的那种人。上面举的例子和介绍的思路都非常适合初学者,即使是什么都不懂的人也能非常快速地理解。只是后面还有一些内容比如EKF、UKF等作者还没更新上去,目前只有基础的卡尔曼滤波。
第二个链接是MathWorks给出的关于卡尔曼滤波的教学视频,还有一个配套的关于单摆的实验,可以一边动手操作一边学习,感觉挺有意思的。
第三个链接是B站上的西北工业大学的严恭敏老师上课的录屏,严老师还有一本书《捷联惯导算法与组合导航原理》,相当于是课本,推荐想要系统学习的同学去看这个。
基础
在正式开始介绍之前,首先得有一些基础的概念。
随机变量的期望与方差
一维的随机变量xxx可以用它的期望μ\muμ和方差σ2\sigma^2σ2来描述;多维的随机变量XXX可以用期望E(X){\rm E}(X)E(X)和协方差矩阵V(X){\rm V}(X)V(X)来描述。对于一个一维的随机变量xxx,我们可以采样多个样本xix_ixi来对它的期望和方差进行估计。之所以说是“估计”是因为,我们如果想获得真实的期望和方差,就需要采样无穷多的样本,这是不可能做到的。
E(x)=1n∑i=0n−1xiV(x)=1n−1∑i=0n−1(xi−μ)2{\rm{E}}(x) = {1 \over n}\sum\limits_{i = 0}^{n - 1} {{x_i}\;\;\;{\rm{V}}(x)} = {1 \over {n - 1}}\sum\limits_{i = 0}^{n - 1} {{{\left( {{x_i} - \mu } \right)}^2}} E(x)=n1i=0∑n−1xiV(x)=n−11i=0∑n−1(xi−μ)2
上面的是公式是利用nnn个样本对随机变量xxx的期望和方差的无偏估计。之所以说是无偏是因为,如果再对上面的E(x){\rm E}(x)E(x)和V(x){\rm V}(x)V(x)求期望,分别可以得到μ\muμ和σ2\sigma^2σ2,它们是准确的估计。卡尔曼滤波算法中虽然不涉及这部分计算,但是最好能有这样的概念,方差可以用来衡量一个随机变量的变化程度。
期望代数(Expectation Algebra)
因为一维随机变量xxx是多维随机变量XXX的情况,所以后面都以多维随机变量XXX进行讨论。为了和后面的推导统一符号,也用xxx表示多维随机变量。期望代数是与随机变量的期望与方差相关的一些定理公式,在卡尔曼滤波的推导中会用到。记xxx的均值和协方差矩阵分别为μx\mu_xμx和V(x){\rm V}(x)V(x),它们满足:
V(x)=E((x−μx)(X−μx)T){\rm{V}}(x) = {\rm{E}}\left( {\left( {x - {\mu _x}} \right){{\left( {X - {\mu _x}} \right)}^{\rm T}}} \right)V(x)=E((x−μx)(X−μx)T)
如果对随机变量xxx进行线性变换得到y=Fxy=Fxy=Fx,FFF是N×NN\times NN×N的方阵,xxx是NNN维列向量。那么随机变量yyy的方差为:
V(y)=FV(x)FT{\rm{V}}(y) = F{\rm{V}}(x){F^{\rm T}}V(y)=FV(x)FT
还有很多简单的公式这里就不列出来了,都在这里可以找到,这是后面推导的基础。
卡尔曼滤波
卡尔曼滤波可以概括为三个环节,初始化,更新和预测。
初始化 Initiate
初始化状态向量x^0,0\hat x_{0,0}x^0,0和表示当前状态估计不确定度的协方差矩阵P0,0P_{0,0}P0,0。
x^0,0\hat x_{0,0}x^0,0可以任意,一般都初始化为0向量。在后续时刻经过多次测量后,系统的状态向量能够收敛到真实值附近。
x^0,0=[0,0,0,⋯,0]T{{\hat x}_{0,0}} = {\left[ {0,0,0, \cdots ,0} \right]^{\rm{T}}}x^0,0=[0,0,0,⋯,0]T
估计的状态x^\hat xx^的协方差矩阵称为估计不确定度(Estimate Uncertainty),用符号PPP表示。
Pn,n=E((x^n,n−μxn,n)(x^n,n−μxn,n)T){P_{n,n}} = {\rm{E}}\left( {\left( {{{\hat x}_{n,n}} - {\mu _{{x_{n,n}}}}} \right){{\left( {{{\hat x}_{n,n}} - {\mu _{{x_{n,n}}}}} \right)}^T}} \right)Pn,n=E((x^n,n−μxn,n)(x^n,n−μxn,n)T)
P0,0P_{0,0}P0,0表示在0时刻(初始时刻)对当前状态的估计不确定度。
P0,0=[σ200⋯00σ20⋯000σ2⋯0⋮⋮⋮⋱00000σ2]{P_{0,0}} = {\begin{bmatrix} {{\sigma ^2}}&0&0& \cdots &0\\ 0&{{\sigma ^2}}&0& \cdots &0\\ 0&0&{{\sigma ^2}}& \cdots &0\\ \vdots & \vdots & \vdots & \ddots &0\\ 0&0&0&0&{{\sigma ^2}} \end{bmatrix}} P0,0=σ200⋮00σ20⋮000σ2⋮0⋯⋯⋯⋱00000σ2
x^0,0\hat x_{0,0}x^0,0 我们是随意设置的,因此0时刻状态的真实期望值μx0,0{\mu_{{x_{0,0}}}}μx0,0很可能和我们随意设置的这个状态的估计值x^0,0\hat x_{0,0}x^0,0有很大的偏差。而这个估计的不确定度自然很大,我们可以为每个维度的方差设置一个很大的值,表示初始的估计是“不靠谱”的。同样随着后续的不断测量,我们在每一时刻的估计不确定度Pn,nP_{n,n}Pn,n也会同系统状态向量的估计x^n,n\hat x_{n,n}x^n,n一起不断更新。
除了这x^0,0\hat x_{0,0}x^0,0和P0,0P_{0,0}P0,0需要初始化以外,还有状态转移矩阵FFF,系统噪声的协方差矩阵QQQ,测量噪声的协方差矩阵RRR,观测矩阵HHH需要给出。这几个矩阵都是常量,不会随着时间变化,在后面提到了再作介绍。
预测 Predict
系统状态预测
卡尔曼滤波的使用是建立在状态空间模型(State Space Model)之上的。状态外推方程(state extrapolate equation)用于状态的预测,它的一般形式:
x^n+1,n=Fx^n,n+Gun+wn{{\hat x}_{n + 1,n}} = F{{\hat x}_{n,n}} + G{u_n} + {w_n}x^n+1,n=Fx^n,n+Gun+wn
- x^n+1,n{{\hat x}_{n + 1,n}}x^n+1,n是在nnn时刻对下一时刻的状态的估计;
- x^n,n{{\hat x}_{n,n}}x^n,n是在nnn时刻估计的nnn时刻的状态,FFF是状态转移矩阵(state transition matrix);
- un{u_n}un是外部输入,是确定的,GGG是控制矩阵(control matrix)表示外部输入对系统状态的影响;
- wn{w_n}wn是过程噪声(process noise)或者称为系统噪声,无法直接测量。
估计不确定度预测
Pn,n=E((x^n,n−μxn,n)(x^n,n−μxn,n)T){P_{n,n}} = {\rm{E}}\left( {\left( {{{\hat x}_{n,n}} - {\mu _{{x_{n,n}}}}} \right){{\left( {{{\hat x}_{n,n}} - {\mu _{{x_{n,n}}}}} \right)}^T}} \right)Pn,n=E((x^n,n−μxn,n)(x^n,n−μxn,n)T)
Pn+1,n=E((x^n+1,n−μxn+1,n)(x^n+1,n−μxn+1,n)T){P_{n + 1,n}} = {\rm{E}}\left( {\left( {{{\hat x}_{n + 1,n}} - {\mu _{{x_{n + 1,n}}}}} \right){{\left( {{{\hat x}_{n + 1,n}} - {\mu _{{x_{n + 1,n}}}}} \right)}^T}} \right)Pn+1,n=E((x^n+1,n−μxn+1,n)(x^n+1,n−μxn+1,n)T)
把状态转移方程代入上式后可以得到下式,其中QQQ是过程噪声wnw_nwn的协方差矩阵。
Pn+1,n=FPn,nFT+Q{P_{n + 1,n}} = F{P_{n,n}}{F^T} + QPn+1,n=FPn,nFT+Q
因为过程噪声wn{w_n}wn是无法直接测量的,因此我们一般在初始化的时候就可以给出一个固定的过程噪声的协方差矩阵QQQ。QQQ矩阵里的值如果太小,则会对系统状态的估计更加取信于模型的预测值,而弱化了观测值的作用,导致对系统状态的估计产生滞后误差(lag error);而如果QQQ矩阵里的值太大,导致估计的不确定度增大,则无法起到很好的滤波效果。
更新 Update
系统状态更新
首先是状态的更新,从n−1n-1n−1时刻来到nnn时刻后,多了一个观测值/测量值znz_nzn可以帮助我们更准确地进行估计。
x^n,n=x^n,n−1+Kn(zn−Hx^n,n−1){{\hat x}_{n,n}} = {{\hat x}_{n,n - 1}} + {K_n}\left( {{z_n} - H{{\hat x}_{n,n - 1}}} \right)x^n,n=x^n,n−1+Kn(zn−Hx^n,n−1)
HHH是观测矩阵,系统状态xxx中某些量我们可能是不能直接观测的,而只有部分可以直接观测,因此需要有一个观测矩阵HHH从状态向量中提出那些能够与观测值对应的部分。zn−Hx^n,n−1{z_n} - H{{\hat x}_{n,n - 1}}zn−Hx^n,n−1被记作innovation,中文翻译为“新息”,可以理解为“新的部分”。当前时刻的估计是上一时刻的估计与测量值的加权,加权系数是卡尔曼增益KnK_nKn。卡尔曼增益的大小直接决定了新的估计值是更加侧重前一时刻的估计值还是测量值。
估计不确定度更新
Pn,n=(I−KnH)Pn,n−1(I−KnH)T+KnRnKnT{P_{n,n}} = \left( {I - {K_n}H} \right){P_{n,n - 1}}{\left( {I - {K_n}H} \right)^{\rm{T}}} + {K_n}{R_n}K_n^{\rm{T}}Pn,n=(I−KnH)Pn,n−1(I−KnH)T+KnRnKnT
估计不确定度的更新是根据状态更新的方程得到的,可以重写一下状态更新方程:
x^n,n=(I−KnH)x^n,n−1+Knzn{{\hat x}_{n,n}} = \left( {I - K_nH} \right){{\hat x}_{n,n - 1}} + {K_n}{z_n}x^n,n=(I−KnH)x^n,n−1+Knzn
再根据期望代数中的公式即可得到Pn,n{P_{n,n}}Pn,n的计算表达式。其中znz_nzn是测量值,而RnR_nRn是测量噪声的协方差矩阵,
zn=Hxn+vn{z_n} = H{x_n} + {v_n}zn=Hxn+vn
xnx_nxn是nnn时刻系统真实的状态值,也就是系统状态的期望值μxn,n{\mu _{{x_{n,n}}}}μxn,n, vnv_nvn是测量噪声,Rn=E(vnvnT){R_n} = {\rm{E}}\left( {{v_n}v_n^{\rm{T}}} \right)Rn=E(vnvnT)。详细的推导过程可以看这里。
卡尔曼增益计算
卡尔曼增益是令估计不确定度Pn,nP_{n,n}Pn,n的迹最小化得到的。Pn,nP_{n,n}Pn,n的对角线是系统状态xn,nx_{n,n}xn,n每一个维度的方差,它的迹是这些方差之和。最小化tr(Pn,n)tr(P_{n,n})tr(Pn,n)可以通过对KnK_nKn求导,并令导数为零矩阵,然后得到最优的KnK_nKn。详细的推导过程可以看这里,最后得到如下结果:
Kn=Pn,n−1HT(HPn,n−1HT+Rn)−1{K_n} = {P_{n,n - 1}}{H^{\rm{T}}}{\left( {H{P_{n,n - 1}}{H^{\rm{T}}} + {R_n}} \right)^{ - 1}}Kn=Pn,n−1HT(HPn,n−1HT+Rn)−1
将这一结果再代入Pn,nP_{n,n}Pn,n的计算公式,可以简化Pn,nP_{n,n}Pn,n的计算:
Pn,n=(I−KnH)Pn,n−1{P_{n,n}} = \left( {I - {K_n}H} \right){P_{n,n - 1}}Pn,n=(I−KnH)Pn,n−1
总结
图片引用自这里
举例
在C6000 DSP上实现二维坐标点(x,y)的卡尔曼滤波,源代码。
首先实现了Matlab版本,依次给出10个二维坐标点作为观测值,然后将卡尔曼滤波后的结果输出显示;DSP上采用相同的参数设置,加载同样的10个二维坐标点,将结果输出显示后与Matlab的结果进行对比,确保结果正确后统计处理所需的时间。
匀速直线运动模型
state=[x,vx,y,vy]state = \left[ {x,{v_x},y,{v_y}} \right]state=[x,vx,y,vy]
FCV=[1100010000110001]{F_{CV}} = {\begin{bmatrix} 1&1&0&0\\ 0&1&0&0\\ 0&0&1&1\\ 0&0&0&1 \end{bmatrix}} FCV=1000110000100011
10次计算结果一致,DSP上Kalman滤波器初始化需要6.2μs6.2{\rm{\mu s}}6.2μs,每次更新和预测平均需要4.4μs4.4{\rm{\mu s}}4.4μs。
匀加速直线运动模型
state=[x,vx,ax,y,vy,ay]state = \left[ {x,{v_x},{a_x},y,{v_y},{a_y}} \right]state=[x,vx,ax,y,vy,ay]
FCA=[110.5000011000001000000110.5000011000001]{F_{CA}} = {\begin{bmatrix} 1&1&{0.5}&0&0&0\\ 0&1&1&0&0&0\\ 0&0&1&0&0&0\\ 0&0&0&1&1&{0.5}\\ 0&0&0&0&1&1\\ 0&0&0&0&0&1 \end{bmatrix}}FCA=1000001100000.5110000001000001100000.511
10次计算结果一致,DSP上Kalman滤波器初始化需要7.0μs7.0{\rm{\mu s}}7.0μs,每次更新和预测平均需要5.4μs5.4{\rm{\mu s}}5.4μs。
EKF & UKF
如果系统状态的状态转移方程或者观测方程是非线性的,那么就不能简单地用固定的FFF和HHH来表示系统的状态转移和观测矩阵。这时候就需要用到EKF或者UKF了。
EKF解决非线性的问题采用的是一阶泰勒展开来近似。这相比于KF就引入了额外的一些计算量,因为FFF和HHH不是固定的,每次系统状态改变都需要重新计算。
UKF采用的是类似蒙特卡洛分析的方法,用几个中心对称的sigma点来估计非线性变换后的随机变量的协方差矩阵。
相关文章:
卡尔曼滤波器与DSP实现
卡尔曼滤波器是利用系统状态方程,结合测量结果对系统状态进行进行最优估计的算法。本文介绍它的主要公式,并举例在C6000 DSP上实现。 推荐资料 KalmanFilter.NETUnderstanding Kalman Filters卡尔曼滤波与组合导航原理 “If you can’t explain it sim…...
引入QQ邮箱发送验证码进行安全校验
最近想给自己的项目在注册时加点安全校验,本想着使用短信验证码,奈何囊中羞涩只能退而求次改用QQ邮箱验证注册~ 一.需求分析 场景:用户输入自己的邮箱,点击获取验证码,后台会发送一封邮件到对应邮箱中。 分析&#x…...
【c++】数组
文章目录一维数组定义方式数组名案例案例1:元素逆置案例2:冒泡排序二维数组定义方式数组名案例:考试成绩统计数组特点: 1、每个数据元素放在一块连续的内存空间中; 2、数组中每个数据元素都是相同数据类型;…...
线程池的简单实现:Java线程池初学者必读指南
"作为一名Java开发者,是否曾经遇到过多线程并发的问题?线程数量过多时,会导致资源浪费,应用性能下降,甚至发生线程死锁的情况。那么,有没有一种方法可以有效地管理线程,避免这些问题呢&…...
【C#】[带格式的字符串] 复合格式设置字符串与使用 $ 的字符串内插 | 如何格式化输出字符串
复合格式输出 string name "Fred"; String.Format("Name {0}, hours {1:hh}", name, DateTime.Now);通过指定相同的参数说明符,多个格式项可以引用对象列表中的同一个元素。 例如,通过指定“0x{0:X} {0:E} {0:N}”等复合格式字符…...
Lecture4 反向传播(Back Propagation)
目录 1 问题背景 1.1计算图(Computational Graph) 1.2 激活函数(Activation Function)引入 1.3 问题引入 2 反向传播(Back Propagation) 2.1 为什么要使用反向传播 2.2 前馈运算(Forward Propagation…...
Power BI 筛选器函数---Window实例详解
一、Window函数 语法: Window ( <起始位置>,<起始位置类型>,<结束位置>,<结束位置类型>, [<关系>], [<OrderBy>],[空白],[PartitionBy] ) 含义: 对指定分区(PartitioinBy)中的行(关系表&…...
基础篇—如何创建css样式表,并集成到html文件中?
CSS 创建 HTML相当于一个页面的结构,CSS相当于页面的装饰,浏览器当读到一个样式表时,浏览器会根据它来格式化 HTML 文档。 如何插入样式表 插入样式表的方法有三种: 外部样式表(External style sheet)内部样式表(Internal style sheet)内联样式(Inline style)1、外…...
WindowsServer服务器系列:部署FTP文件服务
1、点击“开始”菜单,选择“服务器管理器” 2、在接下来弹出页面中选择“添加角色和功能” 3、接下来点击“下一步” 4、接下来选择“基于角色或基于功能的安装”并点击“下一步” 5、选择“从服务器池中选择服务器”并点击“下一步” 6、接下来选中“Web 服务器(II…...
华为OD机试 - 数字加减游戏(Python)| 真题+思路+代码
数字加减游戏 题目 小明在玩一个数字加减游戏,只使用加法或者减法,将一个数字 s 变成数字 t。 每个回合,小明可以用当前的数字加上或减去一个数字。 现在有两种数字可以用来加减,分别为 a,b(a!=b),其中 b 没有使用次数限制。 请问小明最少可以用多少次 a,才能将数字 s …...
【c/c++】c语言的自增操作在不同编译器的差别
示例代码 代码如下: #include <stdio.h>#define product(x) ((x)*(x))int main(void) {int i 3, j, k;j product(i); // (i) * (i)k product(i); // (i) * (i)printf("%d %d\n", j, k); }执行结果 在Ubuntu18.04下通过GCC编译和执行的结果…...
【LeetCode第 332 场周赛】
传送门 文章目录6354. 找出数组的串联值6355. 统计公平数对的数目6356. 子字符串异或查询6357. 最少得分子序列6354. 找出数组的串联值 题目 思路 前后指针 代码 class Solution { public:long long findTheArrayConcVal(vector<int>& nums) {long long res 0;i…...
【蓝桥杯单片机】Keil5中怎么添加STC头文件;从烧录软件中添加显示添加成功后新建工程时依旧找不到
蓝桥杯单片机的芯片型号:IAP15F2K61S2 添加头文件:STC15F2K60S2.H 【1】如何通过烧录软件添加STC头文件: 从ATC-ISP的Keil仿真设置中添加(同时自动下载仿真驱动)仔细阅读添加说明 KEIL5添加STC芯片库_Initdev的博客-…...
图解浏览器渲染页面详细过程
渲染详细过程 产生渲染任务,开启渲染流程 当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。 在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。…...
多线程面试题开胃菜1(5道)
一.多线程有什么用?1)发挥多核CPU 的优势随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4 核、8 核甚至 16 核的也都不少见,如果是单线程的程序,那么在双核 CPU 上就浪费了 50…...
植物育种中广义遗传力的定义
大家好, 我是邓飞。 今天聊一下广义遗传力的计算方法。 广义遗传力定义 广义遗传力(H2H^2H2)定义为归因于基因型总体遗传变异的表型变异比例。 通常他包括三个解释:(详见我这篇博客的公式推导 回归系数 相关系数 遗…...
西瓜书读书笔记—绪论
文章目录机器学习典型的机器学习过程基本术语归纳偏好机器学习 机器学习:致力于研究如果通过计算的手段,利用经验来改善系统自身的性能 在计算机系统中,“经验” 通常以 “数据” 形式存在,因此,机器学习所研究的主要内…...
ES8——Generator函数的使用
babel工具插件下载:npm i --save babel-polyfill 引入:polyfill.js进行转码(es8->es5) 介绍 Generator函数用于生成迭代器 function * (){} yeild: 作用同return类似 {const obj function* () {yield "a";yield 12…...
德馨食品冲刺A股上市:计划募资9亿元,林志勇为实际控制人
近日,浙江德馨食品科技股份有限公司(下称“德馨食品”或“德馨饮料”)预披露更新招股书,准备在上海证券交易所主板上市。据贝多财经了解,德馨食品于2022年7月5日递交上市申请,安信证券为其保荐机构。 本次…...
湿敏电阻的原理,结构,分类与应用总结
🏡《总目录》 0,概述 湿敏电阻是指电阻值随着环境的湿度变化而变化的电阻,本文对其工作原理,结构,分类和应用场景进行总结。 1,工作原理 湿敏电阻是利用湿敏材料制成的,湿敏材料吸收空气中水分时,自身的阻值发生变化。 2,结构 如下图所示,市民电阻包括4个部分构成,…...
千锋教育嵌入式物联网教程之系统编程篇学习-03
目录 进程的终止 exit函数 _exit函数 进程退出清理 进程间的替换 进程间通信 常见通信机制 进程间通信的实质 信号 产生信号的方式 信号的默认处理方式 进程对信号的处理方式 kill函数 进程的终止 使用exit函数对进程进行终止,而return只是结束函数&a…...
升级到https
现在很多站长都会考虑将自己的站点从http升级到https,不仅是基于安全的考虑,有的也是因为第三方平台的限制,如谷歌浏览器会将http站点标记为不安全的站点,微信平台要求接入的微信小程序必须使用https等。 那如何将一个http站点升…...
【C语言】数据结构-二叉树
主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 引入 我们之前已经学过线性数据结构,今天我们将介绍非线性数据结构----树 树是一种非线性的…...
c++中std::condition_variable最全用法归纳
前言 建议阅读以下文章前需先对建立 std::thread 多线程与std::mutex 锁有一定程度的熟悉 std::thread最全用法归纳 std::mutex最全用法归纳 概括 使用 std::condition_variable 的 wait 会把目前的线程 thread 停下来并且等候事件通知,而在另一个线程中可以使用…...
Python数据可视化:数据关系图表可视化
目录 1、散点图 1.1、趋势显示的二维散点图 1.2、分布显示的二维散点图 1.3、散点曲线图...
Urho3D约定
Urho3D使用以下约定和原则: 左手坐标系。正X、Y和Z轴指向右侧、上方和前方,正旋转为顺时针。度用于角度。顺时针顶点定义正面。音频音量指定为0.0(静音)到1.0(全音量)路径名使用斜杠而不是反斜杠。调用操作…...
python数据结构-列表,元组
列表 列表是Python中最通用的数据类型,可以写成方括号之间的逗号分隔值(项目)列表。 使用列表的重要事项是,列表中的项目不必是相同的类型。也就是说一个列表中的项目(元素)可以是数字,字符串,数组,字典等甚至是列表类…...
Properties类读配置文件、修改配置文件
Properties类简介(1)Properties类是专门用于读写配置文件的集合类(2)配置文件的后缀名为.properties,内容格式为:# 可以用“#”作为注释 键值 键值**注意:**键值对不需要有空格,值不需要用引号一起来。默认类型是String。键、值不可以是null(3)Properties类的方法可查找api文档…...
图解LeetCode——剑指 Offer 24. 反转链表
一、题目 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。 二、示例 示例: 【输入】 1->2->3->4->5->NULL 【输出】 5->4->3->2->1->NULL 限制: 0 < 节点个数 < 5000 三、…...
【C语言】“指针的运算”、“指针与数组”
文章目录一、指针运算1.指针 - 整数2.指针-指针3.指针关系运算二、指针与数组三、二级指针四、指针数组完结一、指针运算 指针可以进行整数,指针-指针,还有关系运算,其他的运算会被编译器阻止。 1.指针 - 整数 对指针进行的时候一定要注意不…...
乳山网站建设/小熊猫seo博客
1、在/usr/share/applications创建一个名为“eclipse.desktop”的文件 具体命令为: gedit eclipse.desktop 并添加以下内容: [Desktop Entry] EncodingUTF-8 NameEclipse Platfrom CommentEclipse IDE Exec/home/lgh/Desktop/eclipse/eclipse…...
深圳好的网站建设公司/网络外包
ospf全称:OSPF ( Open Shortest Path First )开放式最短路径优先OSPF 知识点:OSPF 基本配置,OSPF 5 种报文 ,7种邻居状态,4 种网络类型,4 种特殊区域,7类LSA,4 种 link type…...
做报告的网站/市场调研的方法有哪些
之前设置了文件夹的共享属性,添加了一个everyone用户,并分配了完全控制的权限,结果文件夹内有很多文件提示没有访问权限,打不开也删不掉,应该是我之前想设置不会被删的时候出了错 解决办法 右键属性>安全>高…...
网站的网页声明怎么做/seo怎么刷关键词排名
java中的异常处理机制 异常在java中以类和对象的形式存在,那么异常的继承结构是怎样的?我们可以使用UML图来描述以下继承结构 画UML图的工具:Rational Rose、starUML等 Object下有Throwable(可抛出的) Throwable下有两…...
个人简介网页设计素材/青岛seo排名公司
RESTful接口URL的格式: http://localhost:9200/<index>/<type>/[<id>] 其中index、type是必须提供的。 id是可选的,不提供es会自动生成。 index、type将信息进行分层,利于管理。 index可以理解为数据库;type理解…...
做医疗网站建设/网络营销推广要求
init()方法中返回的this指向init的实例对象,而init.prototype等于jQuery.prototype,所以也是jQuery的实例对象; 返回this是为了实现链式调用...