k-1

kalman滤波的相关理解及MATLAB程序注解

时光怂恿深爱的人放手 提交于 2020-04-01 16:02:32
以下介绍部分乃网络资料,程序注释和优化乃自己原创: Dr Kalman 的卡尔曼滤波器。下面的 描述 ,会涉及一些基本的概念知识,包括概率(Probability),随机变量(Random Variable),高斯或正态分配(Gaussian Distribution)还有State-space Model等等。但对于卡尔曼滤波器的详细证明,这里不能一一描述。   首先,我们先要引入一个离散控制过程的 系统 。该系统可用一个线性随机微分方程(Linear Stochastic Difference equation)来描述:   X(k)=A X(k-1)+B U(k)+W(k)   再加上系统的测量值:   Z(k)=H X(k)+V(k)   上两式子中,X(k)是k时刻的系统状态,U(k)是k时刻对系统的控制量。A和B是系统参数,对于多模型系统,他们为矩阵。Z(k)是k时刻的测量值,H是测量系统的参数,对于多测量系统,H为矩阵。W(k)和V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声(White Gaussian Noise),他们的COVariance 分别是Q,R(这里我们假设他们不随系统状态变化而变化)。   对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声),卡尔曼滤波器是最优的信息处理器。下面我们来用他们结合他们的covariances

卡尔曼滤波

≯℡__Kan透↙ 提交于 2020-03-23 20:36:30
参考: https://en.wikipedia.org/wiki/Kalman_filter 原文: https://www.cnblogs.com/alantu2018/p/9224001.html 公式: 首先,我们先要引入一个离散控制过程的系统。该 系统可用一个线性随机微分方程( Linear Stochastic Difference equation )来描述: X(k)=A X(k-1)+B U(k)+W(k) 再加上系统的测量值: Z(k)=H X(k)+V(k) 上两式子中 : X(k) 是 k 时刻的系统状态 ; U(k) 是 k 时刻对系统的控制量 ; A 和 B 是系统参数,对于多模型系统,他们为矩阵 ; Z(k) 是 k 时刻的测量值 ; H 是测量系统的参数,对于多测量系统, H 为矩阵 ; W(k) 和 V(k) 分别表示过程和测量的噪声。他们被假设成高斯白噪声 (White Gaussian Noise) ,他们的 covariance 分别是 Q , R (这里我们假设他们不随系统状态变化而变化)。 对于满足上面的条件 ( 线性随机微分系统,过程和测量都是高斯白噪声 ) ,卡尔曼滤波器是最优的信息处理器。 下面我们来用他们结合他们的 covariances 来估算系统的最优化输出(类似上一节那个温度的例子)。 首先我们要利用系统的过程模型

关于矩阵

孤街浪徒 提交于 2020-03-21 22:42:27
本章所写都是通过对《工程学线性代数》和《3D数学基础:图形与游戏开发》理解所写 “不幸的是,没人告诉您矩阵像什么——您必须自己去感受。” 来自《 黑客帝国 》对白 .我们曾宣称矩阵表达坐标转换,多以当我们观察矩阵的时候,我们是在观察转换,观察新的坐标系。打这个转换开起来像什么?特定的3D矩阵(旋转,放射等)和3X3矩阵的9个数字之间有什么关系?怎么样构建一个矩阵来做这个转换(而不是盲目的照搬书上的公式)?——3D数学基础 矩阵分为实矩阵和复矩阵,元素是实数的矩阵为实矩阵,元素是复数的为复矩阵。 关于复数: http://www.cnblogs.com/ThreeThousandBigWorld/archive/2012/07/21/2602588.html 单位矩阵我们记做E 转置矩阵: 用 ' 表示转置因为右上角的小t打不出来,a为实数 1)(A')' = A; 2) (A+B)' = A' + B'; 3) (aA)' = aA'; 4) (AB)' = B'A'. 由n阶方阵A的元素所构成的行列式(个元素的位置不变),称为方阵A的行列式,记做|A|或detA 1)|A'| = |A| 2) |aA| = a^n|A| 3) |AB| = |A||B| 伴随矩阵: 行列式|A|的各个元素的代数余子式Aij所构成的矩阵然后再转置就是矩阵A的 伴随矩阵 , 记做A* AA* = A

[HDU 6683]Rikka with Geometric Sequence

心不动则不痛 提交于 2020-03-17 08:14:15
题目链接 题目要求一个 \(1\) ~ \(n\) 的序列的等比子序列个数,多组询问。 单纯枚举公比显然不可行,因为题目并没有限制公比为整数,因此只能考虑构造一波。 显然,长度小于等于2的可以直接 \(O(1)\) 套公式算。 考虑大于2的。 首先构造一下,设公比 \(\frac{a}{b} \ \ (a > b,\gcd(a,b)=1)\) ,首项是 \(A\) ,长度为 \(k\) ,那么这些量就可以唯一确定一个等比数列。容易发现,这个等比数列的末项 \(x=A\frac{a^{k-1}}{b^{k-1}}\) ,为保证 \(x\) 为整数,则必然满足 \(b^{k-1} | A\) ,从而可知 \(x\) 有因子 \(a^{k-1}\) 。 综上所述,约束条件如下: \(a > b,\gcd(a,b)=1\) 末项 \(x\) 有因子 \(a^{k-1}\) \(k \geq 3\) 满足以上3个条件,就可以确定一个符合题意的等比子序列。 然后 参考题解 可以得到下面的式子: \[ ans = \sum_{a=2}^n \varphi(a) \lfloor \frac{n}{a^{k-1}} \rfloor\] 当 \(k=3\) 时,显然 \(\lfloor \frac{n}{a^2} \rfloor\) 只有 \(\sqrt[3]{n}\) 个,复杂度符合题意。 当 \

UVALive 7040 Color

a 夏天 提交于 2020-03-16 01:44:13
题目链接: LA-7040 题意为用m种颜色给n个格子染色。问正好使用k种颜色的方案有多少。 首先很容易想到的是\( k * (k-1)^{n-1}\),这个算出来的是使用 小于等于k种颜色 给n个方格染色的方案数。 我们希望求得的是使用正好 k种颜色 给n个方格染色的方案数,简单的想法是,直接减去小于等于k-1种颜色的方案数。 但是,要计算使用小于等于k-1种颜色染色的方案数,不能直接减去\(C_{k}^{k-1} * (k-1) * (k-2)^{n-1}\),原因是会有重复的部分。 我们用\(S_{k}\)表示使用小于等于k种颜色给n个格子染色的方案数。 则我们希望求出的答案可以用\(C_m^k * (S_k- \bigcup _{i=1} ^ {C_k^{k-1}} S_{k-1})\)来表示。 于是问题变成了求\( \bigcup _{i=1} ^ {C_k^{k-1}} S_{k-1}\),因为有重复,自然而然的我们想到容斥原理。 仔细思考后(或者列表格), 发现所有\(S_{k-1}\)两两相交的并等于\(S_{k-2}\),所有\(S_{k-1}\)三三相交的并等于\(S_{k-3}\),以此类推 ,减加减加即可。 代码如下: 1 #include<cstring> 2 #include<cstdio> 3 #include<queue> 4 #include

Huffman树总结

落爺英雄遲暮 提交于 2020-03-09 20:05:46
其实我觉得这个东西还是比较玄学,主要是实现起来感觉不是难,重要的是学会如何建模. 定义 构造一棵树使一棵树中点的权值与深度的乘积和最小 \(Min\sum_{i}val[i]*dep[i](i∈V)\) 那么我们如何构造一棵这样的树呢?显然对于每一个点,只有权值是给出的,我们yy一下就发现,只有当权值大的树的深度尽量小那么才能够保证权值和比较小.所以我们可以用优先队列|堆完成这个任务 但是一般的题目不会让你写Huffman树的裸题,那么显然,构造出来的树的分叉也不一定只有两个,所以我们要掌握很多东西. 结论1 若一颗Huffman树是满k叉树,那么显然(n-1)%(k-1)必然为0. 这个的证明其实还是比较简单,因为你将根节点除去后的图必然有k的倍数个分叉,这才满足是一个满k叉树 结论2 权值越大的放到深度小的才能够构成Huffman树. 这个就是依据Huffman树的定义来的. 模板 讲了这么多,那么Huffman树究竟有没有一个固定的模板呢?答案是有的 struct node{ int val,dep; bool operator<(node b){ return val>b.val || val==b.val && dep>b.dep;//显然深度大的如果不先合并它就会变得越来越大! } } priority_queue<node>q; void Huffman(int n

深入理解floyd算法

风格不统一 提交于 2020-03-06 16:40:58
先上floyd算法的代码,本质上是动态规划问题 本质就是DP含有动态规划的思想,满足重叠子问题和最优子结构 dis[k][i][j]=min(dis[k-1][i][j],dis[k-1][i][k]+dis[k-1][k][j]); 我们可以发现他其实是由前k-1的状态来推出第k个点的状态之后你就会发现f[k]只与f[k-1]有关 然后我们可以根据这个性质解决很多问题 for ( k = 1 ; k <= n ; k ++ ) { for ( i = 1 ; i <= n ; i ++ ) { for ( j = 1 ; j <= n ; j ++ ) { if ( dis [ i ] [ k ] + dis [ k ] [ j ] < dis [ i ] [ j ] ) { dis [ i ] [ j ] = dis [ i ] [ k ] + dis [ k ] [ j ] ; } } } } 这个经典代码的难点在于理解为什么k的循环在外面,这里附上一波知乎的高赞解释 可能部分大佬看到这段抽象的解释之后已经豁然开朗,如果还有部分大佬没有看懂的话,本菜鸡尝试用通俗的语言来翻译一下 这里给出一张简单的有向图 1->5,5->6,6->3的距离均为1,如果按照k值在最内部进行循环的话 dist[1][3]的距离无法更新, 因为dist[1][3] = dist[1][6] +

二项堆

无人久伴 提交于 2020-03-03 16:49:24
目录 1.二叉堆(Binary Heap)、二项堆、斐波那契堆(简称Fib堆)的比较: 2. 二项树 2.1 定义 2.2 二项树B_k的性质 3. 二项堆 3.1 定义 3.2 数据结构 3.3 操作 3.3.1 五个基本操作 3.3.2 两个扩展操作 参考 @ 1.二叉堆(Binary Heap)、二项堆、斐波那契堆(简称Fib堆)的比较: 相同: 都是可归并堆(Mergeable Heap); 它们都支持5个基本操作(创建、插入、查找最小值、抽取最小值、合并堆)和2个扩展操作 (结点减值、结点删除)。 不同: 二叉堆是一种结点有序的完全二叉树,可采用数组结构存储,通过数组下标索引结点,分最大 堆和最小堆。 二项堆和Fib堆都是最小堆。 二项堆由二项树组成,结构比二叉堆复杂,但其堆合并操作的时间复杂度较好。当堆合并操作 较多时,可使用二项堆。反之,使用二叉堆即可。 2. 二项树 2.1 定义 仅包含一个结点的有序树是一棵二项树(B_0树)。二项树B_k由两棵B_{k-1}树组成,其中一 棵B_{k-1}树的根作为另一棵B_{k-1}树根的最左孩子(k≥0)。 2.2 二项树B_k的性质 结点数 n = 2{^k} 树高为 k = lgn 深度为i处有k!/(i!(k-i)!)个结点(k>=i>=0)。 根的度最大为k,若根的孩子从左到右编号为k-1,k-2,…,1,0

2-6约瑟夫环

痞子三分冷 提交于 2020-02-29 17:05:30
题目描述 解题方法1 如果链表数据为 10 20 30 40 50 60 70 80 90 。那么按照如上规则,节点的删除顺序应该为 30 60 90 40 80 50 20 70 最后剩下的节点为10。 最常规的方法,我们只需要设置一个计数器count,然后每遍历一个节点count加一,当count==m时删除当前节点并让count=0,不断遍历节点和删除直到剩下最后一个节点退出循环。 需要注意的是这里使用不带头节点的链表,避免头节点对问题的干扰。 每次要遍历m次才能找到一个要删除的节点,链表一共有n个节点,整个过程的时间复杂度为 m*n。 public class Test { public static void main ( String [ ] args ) throws Exception { int [ ] arr = { 10 , 20 , 30 , 40 , 50 , 60 , 70 , 80 , 90 } ; Node head = create ( arr ) ; yuesefu ( head , 2 ) ; } public static Node yuesefu ( Node head , int m ) { if ( head == null || head . next == head || m < 0 ) { return head ; } Node

吃辣椒

女生的网名这么多〃 提交于 2020-02-29 03:53:23
要点:对每个数考虑以它作为最大值的集合个数。 对每个pi统计数组中比他小的数,从这些数中选k-1个组成的k个数中pi最大,可视为这个pi值对答案的贡献。 对每个pi,如果存在,从比它小的数里面挑选k-1个数组成k个数,则这k个数中pi的值最大。(pi 乘以 对应的组合数个数 ) 可看作pi对整个答案的贡献。 即:最大值*C(N-1)(k-1) + 次大值 *C(N-2)(k-1)… 警告!!小心数组越界!! # include <iostream> # include <bits/stdc++.h> using namespace std ; const int maxN = 100001 ; long long int C [ maxN ] [ 51 ] ; long long int d [ maxN ] ; long long int mod = 1000000007 ; int N ; void init ( ) { for ( int i = 0 ; i <= N ; i ++ ) { C [ i ] [ 0 ] = 1 ; if ( i <= 50 ) { //注意数组千万不要越界啊!!! C [ i ] [ i ] = 1 ; } } for ( int i = 2 ; i <= N ; i ++ ) { for ( int j = 1 ; j < i && j <=