Shao Rui
/
Kalman
1
kalmanfilter/kalmanfilter.cpp@0:c55310328157, 2020-02-07 (annotated)
- Committer:
- shaorui
- Date:
- Fri Feb 07 11:34:24 2020 +0000
- Revision:
- 0:c55310328157
1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
shaorui | 0:c55310328157 | 1 | #include"kalmanfilter.h" |
shaorui | 0:c55310328157 | 2 | #include "math.h" |
shaorui | 0:c55310328157 | 3 | /*========================= Mat3Init ====================================*/ |
shaorui | 0:c55310328157 | 4 | Mat3 kalmanfilter::Mat3Init(Mat3 C, double dNum){ |
shaorui | 0:c55310328157 | 5 | /*初始化3维方阵所有分量为指定值 |
shaorui | 0:c55310328157 | 6 | 参数:[in]C: 待初始化的3维方阵 |
shaorui | 0:c55310328157 | 7 | [in]dNum: 指定值 |
shaorui | 0:c55310328157 | 8 | 返回:C |
shaorui | 0:c55310328157 | 9 | */ |
shaorui | 0:c55310328157 | 10 | |
shaorui | 0:c55310328157 | 11 | /*需求: |
shaorui | 0:c55310328157 | 12 | 类型: Mat3 |
shaorui | 0:c55310328157 | 13 | */ |
shaorui | 0:c55310328157 | 14 | |
shaorui | 0:c55310328157 | 15 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 16 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 17 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 18 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 19 | */ |
shaorui | 0:c55310328157 | 20 | |
shaorui | 0:c55310328157 | 21 | int i,j; |
shaorui | 0:c55310328157 | 22 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 23 | for(j=0;i<3;j++){ |
shaorui | 0:c55310328157 | 24 | C[i][j]=dNum; |
shaorui | 0:c55310328157 | 25 | } |
shaorui | 0:c55310328157 | 26 | } |
shaorui | 0:c55310328157 | 27 | return C; |
shaorui | 0:c55310328157 | 28 | } |
shaorui | 0:c55310328157 | 29 | |
shaorui | 0:c55310328157 | 30 | /*========================= MatInit ====================================*/ |
shaorui | 0:c55310328157 | 31 | Mat kalmanfilter:: MatInit(Mat C, int nM,int nN, double dNum){ |
shaorui | 0:c55310328157 | 32 | /*初始化矩阵所有分量为指定值 |
shaorui | 0:c55310328157 | 33 | 参数:[in]C: 待初始化矩阵 |
shaorui | 0:c55310328157 | 34 | [in]nM: 矩阵行数 |
shaorui | 0:c55310328157 | 35 | [in]nN: 矩阵列数 |
shaorui | 0:c55310328157 | 36 | [in]dNum: 指定值 |
shaorui | 0:c55310328157 | 37 | 返回:C |
shaorui | 0:c55310328157 | 38 | */ |
shaorui | 0:c55310328157 | 39 | |
shaorui | 0:c55310328157 | 40 | /*需求: |
shaorui | 0:c55310328157 | 41 | 类型: Mat |
shaorui | 0:c55310328157 | 42 | 宏: MGet |
shaorui | 0:c55310328157 | 43 | */ |
shaorui | 0:c55310328157 | 44 | |
shaorui | 0:c55310328157 | 45 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 46 | 最近更改时间:20091103 |
shaorui | 0:c55310328157 | 47 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 48 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 49 | */ |
shaorui | 0:c55310328157 | 50 | |
shaorui | 0:c55310328157 | 51 | int i,j; |
shaorui | 0:c55310328157 | 52 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 53 | for(j=0;j<nN;j++){ |
shaorui | 0:c55310328157 | 54 | MGet(C,i,j,nN)=dNum; |
shaorui | 0:c55310328157 | 55 | } |
shaorui | 0:c55310328157 | 56 | } |
shaorui | 0:c55310328157 | 57 | return C; |
shaorui | 0:c55310328157 | 58 | } |
shaorui | 0:c55310328157 | 59 | |
shaorui | 0:c55310328157 | 60 | /*========================= Mat3InitI ====================================*/ |
shaorui | 0:c55310328157 | 61 | Mat3 kalmanfilter::Mat3InitI(Mat3 C){ |
shaorui | 0:c55310328157 | 62 | /*初始化3维方阵为单位对角阵 |
shaorui | 0:c55310328157 | 63 | 参数:[in]C: 待初始化的3维方阵 |
shaorui | 0:c55310328157 | 64 | 返回:C |
shaorui | 0:c55310328157 | 65 | */ |
shaorui | 0:c55310328157 | 66 | |
shaorui | 0:c55310328157 | 67 | /*需求: |
shaorui | 0:c55310328157 | 68 | 类型: Mat3 |
shaorui | 0:c55310328157 | 69 | */ |
shaorui | 0:c55310328157 | 70 | |
shaorui | 0:c55310328157 | 71 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 72 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 73 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 74 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 75 | */ |
shaorui | 0:c55310328157 | 76 | |
shaorui | 0:c55310328157 | 77 | int i,j; |
shaorui | 0:c55310328157 | 78 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 79 | for(j=0;i<3;j++){ |
shaorui | 0:c55310328157 | 80 | if (i==j){ |
shaorui | 0:c55310328157 | 81 | C[i][j]=1.0; |
shaorui | 0:c55310328157 | 82 | }else{ |
shaorui | 0:c55310328157 | 83 | C[i][j]=0.0; |
shaorui | 0:c55310328157 | 84 | } |
shaorui | 0:c55310328157 | 85 | } |
shaorui | 0:c55310328157 | 86 | } |
shaorui | 0:c55310328157 | 87 | return C; |
shaorui | 0:c55310328157 | 88 | } |
shaorui | 0:c55310328157 | 89 | |
shaorui | 0:c55310328157 | 90 | |
shaorui | 0:c55310328157 | 91 | /*========================= MatInitI ====================================*/ |
shaorui | 0:c55310328157 | 92 | Mat kalmanfilter::MatInitI(Mat C, int nOrder){ |
shaorui | 0:c55310328157 | 93 | /*方阵初始化为单位对角阵 |
shaorui | 0:c55310328157 | 94 | 参数:[in]C: 待初始化的方阵 |
shaorui | 0:c55310328157 | 95 | [in]nOrder: 方阵维数 |
shaorui | 0:c55310328157 | 96 | 返回:C |
shaorui | 0:c55310328157 | 97 | */ |
shaorui | 0:c55310328157 | 98 | |
shaorui | 0:c55310328157 | 99 | /*需求: |
shaorui | 0:c55310328157 | 100 | 类型: Mat |
shaorui | 0:c55310328157 | 101 | 宏: MGet |
shaorui | 0:c55310328157 | 102 | */ |
shaorui | 0:c55310328157 | 103 | |
shaorui | 0:c55310328157 | 104 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 105 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 106 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 107 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 108 | */ |
shaorui | 0:c55310328157 | 109 | |
shaorui | 0:c55310328157 | 110 | int i,j; |
shaorui | 0:c55310328157 | 111 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 112 | for(j=0;j<nOrder;j++){ |
shaorui | 0:c55310328157 | 113 | if (i==j){ |
shaorui | 0:c55310328157 | 114 | MGet(C,i,j,nOrder)=1.0; |
shaorui | 0:c55310328157 | 115 | }else{ |
shaorui | 0:c55310328157 | 116 | MGet(C,i,j,nOrder)=0.0; |
shaorui | 0:c55310328157 | 117 | } |
shaorui | 0:c55310328157 | 118 | } |
shaorui | 0:c55310328157 | 119 | } |
shaorui | 0:c55310328157 | 120 | return C; |
shaorui | 0:c55310328157 | 121 | } |
shaorui | 0:c55310328157 | 122 | |
shaorui | 0:c55310328157 | 123 | |
shaorui | 0:c55310328157 | 124 | /*========================= Diag ====================================*/ |
shaorui | 0:c55310328157 | 125 | Mat kalmanfilter::Diag(cVec V, Mat Mout, int nOrder){ |
shaorui | 0:c55310328157 | 126 | /* 通过向量初始化对角方阵 |
shaorui | 0:c55310328157 | 127 | 参数:[in]V: 向量V |
shaorui | 0:c55310328157 | 128 | [out]Mout: 待初始化方阵 |
shaorui | 0:c55310328157 | 129 | [in]nOrder: 向量维数 |
shaorui | 0:c55310328157 | 130 | 返回:Mout |
shaorui | 0:c55310328157 | 131 | */ |
shaorui | 0:c55310328157 | 132 | |
shaorui | 0:c55310328157 | 133 | /*需求: |
shaorui | 0:c55310328157 | 134 | 类型: Mat, cVec |
shaorui | 0:c55310328157 | 135 | 宏: MGet |
shaorui | 0:c55310328157 | 136 | */ |
shaorui | 0:c55310328157 | 137 | |
shaorui | 0:c55310328157 | 138 | /*创建时间: 20080509 |
shaorui | 0:c55310328157 | 139 | 最近更改时间:20080509 |
shaorui | 0:c55310328157 | 140 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 141 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 142 | */ |
shaorui | 0:c55310328157 | 143 | |
shaorui | 0:c55310328157 | 144 | int i,j; |
shaorui | 0:c55310328157 | 145 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 146 | for(j=0;j<nOrder;j++){ |
shaorui | 0:c55310328157 | 147 | if (i==j){ |
shaorui | 0:c55310328157 | 148 | MGet(Mout,i,j,nOrder)=V[i]; |
shaorui | 0:c55310328157 | 149 | }else{ |
shaorui | 0:c55310328157 | 150 | MGet(Mout,i,j,nOrder)=0.0; |
shaorui | 0:c55310328157 | 151 | } |
shaorui | 0:c55310328157 | 152 | } |
shaorui | 0:c55310328157 | 153 | } |
shaorui | 0:c55310328157 | 154 | return Mout; |
shaorui | 0:c55310328157 | 155 | } |
shaorui | 0:c55310328157 | 156 | |
shaorui | 0:c55310328157 | 157 | /******************************************************************************************************************/ |
shaorui | 0:c55310328157 | 158 | |
shaorui | 0:c55310328157 | 159 | /*============================ Mat3Sum=================================*/ |
shaorui | 0:c55310328157 | 160 | Mat3 kalmanfilter::Mat3Sum(cMat3 C1, cMat3 C2, Mat3 C){ |
shaorui | 0:c55310328157 | 161 | /*3*3矩阵加法 |
shaorui | 0:c55310328157 | 162 | 参数:[in]C1:3*3 C1矩阵 |
shaorui | 0:c55310328157 | 163 | [in]C2:3*3 C2矩阵 |
shaorui | 0:c55310328157 | 164 | [out]C: C1+C2 |
shaorui | 0:c55310328157 | 165 | 返回:C |
shaorui | 0:c55310328157 | 166 | */ |
shaorui | 0:c55310328157 | 167 | |
shaorui | 0:c55310328157 | 168 | /*需求: |
shaorui | 0:c55310328157 | 169 | 类型: Mat3,cMat3 |
shaorui | 0:c55310328157 | 170 | */ |
shaorui | 0:c55310328157 | 171 | |
shaorui | 0:c55310328157 | 172 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 173 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 174 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 175 | */ |
shaorui | 0:c55310328157 | 176 | int i,j; |
shaorui | 0:c55310328157 | 177 | for (i=0;i<3;i++) |
shaorui | 0:c55310328157 | 178 | { |
shaorui | 0:c55310328157 | 179 | for(j=0;j<3;j++) C[i][j] = C1[i][j] + C2[i][j]; |
shaorui | 0:c55310328157 | 180 | } |
shaorui | 0:c55310328157 | 181 | return C; |
shaorui | 0:c55310328157 | 182 | } |
shaorui | 0:c55310328157 | 183 | |
shaorui | 0:c55310328157 | 184 | |
shaorui | 0:c55310328157 | 185 | /*============================ Mat3Sum3=================================*/ |
shaorui | 0:c55310328157 | 186 | Mat3 kalmanfilter::Mat3Sum3(cMat3 C1, cMat3 C2, cMat3 C3, Mat3 C){ |
shaorui | 0:c55310328157 | 187 | /*3*3矩阵加法(三个矩阵) |
shaorui | 0:c55310328157 | 188 | 参数:[in]C1:3*3 C1矩阵 |
shaorui | 0:c55310328157 | 189 | [in]C2:3*3 C2矩阵 |
shaorui | 0:c55310328157 | 190 | [in]C3:3*3 C3矩阵 |
shaorui | 0:c55310328157 | 191 | [out]C: C1+C2+C3 |
shaorui | 0:c55310328157 | 192 | 返回:C |
shaorui | 0:c55310328157 | 193 | */ |
shaorui | 0:c55310328157 | 194 | |
shaorui | 0:c55310328157 | 195 | /*需求: |
shaorui | 0:c55310328157 | 196 | 类型: Mat3,cMat3 |
shaorui | 0:c55310328157 | 197 | */ |
shaorui | 0:c55310328157 | 198 | |
shaorui | 0:c55310328157 | 199 | /* 创建时间: 20080410 |
shaorui | 0:c55310328157 | 200 | 最近更改时间:20080410 |
shaorui | 0:c55310328157 | 201 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 202 | */ |
shaorui | 0:c55310328157 | 203 | int i,j; |
shaorui | 0:c55310328157 | 204 | for (i=0;i<3;i++) |
shaorui | 0:c55310328157 | 205 | { |
shaorui | 0:c55310328157 | 206 | for(j=0;j<3;j++) C[i][j] = C1[i][j] + C2[i][j]+ C3[i][j]; |
shaorui | 0:c55310328157 | 207 | } |
shaorui | 0:c55310328157 | 208 | return C; |
shaorui | 0:c55310328157 | 209 | } |
shaorui | 0:c55310328157 | 210 | |
shaorui | 0:c55310328157 | 211 | |
shaorui | 0:c55310328157 | 212 | /*============================ MatSum=================================*/ |
shaorui | 0:c55310328157 | 213 | Mat kalmanfilter::MatSum(cMat C1, cMat C2, Mat C, int nM, int nN){ |
shaorui | 0:c55310328157 | 214 | /*矩阵加法 |
shaorui | 0:c55310328157 | 215 | 参数:[in]C1: C1矩阵 |
shaorui | 0:c55310328157 | 216 | [in]C2: C2矩阵 |
shaorui | 0:c55310328157 | 217 | [out]C: C1+C2 |
shaorui | 0:c55310328157 | 218 | [in]nM: 矩阵行数 |
shaorui | 0:c55310328157 | 219 | [in]nN: 矩阵列数 |
shaorui | 0:c55310328157 | 220 | 返回:C |
shaorui | 0:c55310328157 | 221 | */ |
shaorui | 0:c55310328157 | 222 | |
shaorui | 0:c55310328157 | 223 | /*需求: |
shaorui | 0:c55310328157 | 224 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 225 | 宏: MGet |
shaorui | 0:c55310328157 | 226 | */ |
shaorui | 0:c55310328157 | 227 | |
shaorui | 0:c55310328157 | 228 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 229 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 230 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 231 | */ |
shaorui | 0:c55310328157 | 232 | |
shaorui | 0:c55310328157 | 233 | int i,j; |
shaorui | 0:c55310328157 | 234 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 235 | for(j=0;j<nN;j++){ |
shaorui | 0:c55310328157 | 236 | MGet(C,i,j,nN)=MGet(C1,i,j,nN)+MGet(C2,i,j,nN); |
shaorui | 0:c55310328157 | 237 | } |
shaorui | 0:c55310328157 | 238 | } |
shaorui | 0:c55310328157 | 239 | return C; |
shaorui | 0:c55310328157 | 240 | } |
shaorui | 0:c55310328157 | 241 | |
shaorui | 0:c55310328157 | 242 | |
shaorui | 0:c55310328157 | 243 | /*============================ MatSum3=================================*/ |
shaorui | 0:c55310328157 | 244 | Mat kalmanfilter::MatSum3(cMat C1, cMat C2, cMat C3, Mat C, int nM, int nN){ |
shaorui | 0:c55310328157 | 245 | /*矩阵加法(三个矩阵) |
shaorui | 0:c55310328157 | 246 | 参数:[in]C1: C1矩阵 |
shaorui | 0:c55310328157 | 247 | [in]C2: C2矩阵 |
shaorui | 0:c55310328157 | 248 | [in]C3: C3矩阵 |
shaorui | 0:c55310328157 | 249 | [out]C: C1+C2+C3 |
shaorui | 0:c55310328157 | 250 | [in]nM: 矩阵行数 |
shaorui | 0:c55310328157 | 251 | [in]nN: 矩阵列数 |
shaorui | 0:c55310328157 | 252 | 返回:C |
shaorui | 0:c55310328157 | 253 | */ |
shaorui | 0:c55310328157 | 254 | |
shaorui | 0:c55310328157 | 255 | /*需求: |
shaorui | 0:c55310328157 | 256 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 257 | 宏: MGet |
shaorui | 0:c55310328157 | 258 | */ |
shaorui | 0:c55310328157 | 259 | |
shaorui | 0:c55310328157 | 260 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 261 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 262 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 263 | */ |
shaorui | 0:c55310328157 | 264 | |
shaorui | 0:c55310328157 | 265 | int i,j; |
shaorui | 0:c55310328157 | 266 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 267 | for(j=0;j<nN;j++){ |
shaorui | 0:c55310328157 | 268 | MGet(C,i,j,nN)=MGet(C1,i,j,nN)+MGet(C2,i,j,nN)+MGet(C3,i,j,nN); |
shaorui | 0:c55310328157 | 269 | } |
shaorui | 0:c55310328157 | 270 | } |
shaorui | 0:c55310328157 | 271 | return C; |
shaorui | 0:c55310328157 | 272 | } |
shaorui | 0:c55310328157 | 273 | |
shaorui | 0:c55310328157 | 274 | |
shaorui | 0:c55310328157 | 275 | /*************************************************************************************************/ |
shaorui | 0:c55310328157 | 276 | |
shaorui | 0:c55310328157 | 277 | /*============================ Mat3Minus =================================*/ |
shaorui | 0:c55310328157 | 278 | Mat3 kalmanfilter::Mat3Minus(cMat3 C1, cMat3 C2, Mat3 C){ |
shaorui | 0:c55310328157 | 279 | /*3*3矩阵减法 |
shaorui | 0:c55310328157 | 280 | 参数:[in]C1:3*3 C1矩阵 |
shaorui | 0:c55310328157 | 281 | [in]C2:3*3 C2矩阵 |
shaorui | 0:c55310328157 | 282 | [out]C: C1-C2 |
shaorui | 0:c55310328157 | 283 | 返回:C |
shaorui | 0:c55310328157 | 284 | */ |
shaorui | 0:c55310328157 | 285 | |
shaorui | 0:c55310328157 | 286 | /*需求: |
shaorui | 0:c55310328157 | 287 | 类型: Mat3,cMat3 |
shaorui | 0:c55310328157 | 288 | */ |
shaorui | 0:c55310328157 | 289 | |
shaorui | 0:c55310328157 | 290 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 291 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 292 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 293 | */ |
shaorui | 0:c55310328157 | 294 | int i,j; |
shaorui | 0:c55310328157 | 295 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 296 | for(j=0;j<3;j++) C[i][j] = C1[i][j] - C2[i][j]; |
shaorui | 0:c55310328157 | 297 | } |
shaorui | 0:c55310328157 | 298 | return C; |
shaorui | 0:c55310328157 | 299 | } |
shaorui | 0:c55310328157 | 300 | |
shaorui | 0:c55310328157 | 301 | |
shaorui | 0:c55310328157 | 302 | /*============================ MatMinus =================================*/ |
shaorui | 0:c55310328157 | 303 | Mat kalmanfilter::MatMinus(cMat C1, cMat C2, Mat C, int nM, int nN){ |
shaorui | 0:c55310328157 | 304 | /*矩阵减法 |
shaorui | 0:c55310328157 | 305 | 参数:[in]C1: C1矩阵 |
shaorui | 0:c55310328157 | 306 | [in]C2: C2矩阵 |
shaorui | 0:c55310328157 | 307 | [out]C: C1-C2 |
shaorui | 0:c55310328157 | 308 | [in]nM: 矩阵行数 |
shaorui | 0:c55310328157 | 309 | [in]nN: 矩阵列数 |
shaorui | 0:c55310328157 | 310 | 返回:C |
shaorui | 0:c55310328157 | 311 | */ |
shaorui | 0:c55310328157 | 312 | |
shaorui | 0:c55310328157 | 313 | /*需求: |
shaorui | 0:c55310328157 | 314 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 315 | */ |
shaorui | 0:c55310328157 | 316 | |
shaorui | 0:c55310328157 | 317 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 318 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 319 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 320 | */ |
shaorui | 0:c55310328157 | 321 | int i; |
shaorui | 0:c55310328157 | 322 | for (i=0;i<nM*nN;i++){ |
shaorui | 0:c55310328157 | 323 | C[i]=C1[i]-C2[i]; |
shaorui | 0:c55310328157 | 324 | } |
shaorui | 0:c55310328157 | 325 | |
shaorui | 0:c55310328157 | 326 | return C; |
shaorui | 0:c55310328157 | 327 | } |
shaorui | 0:c55310328157 | 328 | /*********************************************************************************************************/ |
shaorui | 0:c55310328157 | 329 | |
shaorui | 0:c55310328157 | 330 | /*========================= Mat3Cpy ====================================*/ |
shaorui | 0:c55310328157 | 331 | Mat3 kalmanfilter::Mat3Cpy(Mat3 dest,cMat3 source){ |
shaorui | 0:c55310328157 | 332 | /*3*3矩阵拷贝 |
shaorui | 0:c55310328157 | 333 | 参数:[out]dest:3*3目标矩阵 |
shaorui | 0:c55310328157 | 334 | [in]source:3*3源矩阵 |
shaorui | 0:c55310328157 | 335 | 返回:dest |
shaorui | 0:c55310328157 | 336 | */ |
shaorui | 0:c55310328157 | 337 | |
shaorui | 0:c55310328157 | 338 | /*需求: |
shaorui | 0:c55310328157 | 339 | 类型: Mat3,cMat3 |
shaorui | 0:c55310328157 | 340 | */ |
shaorui | 0:c55310328157 | 341 | |
shaorui | 0:c55310328157 | 342 | /*创建时间: 20070527 |
shaorui | 0:c55310328157 | 343 | 最近更改时间:20070527 |
shaorui | 0:c55310328157 | 344 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 345 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 346 | */ |
shaorui | 0:c55310328157 | 347 | |
shaorui | 0:c55310328157 | 348 | dest[0][0]=source[0][0]; |
shaorui | 0:c55310328157 | 349 | dest[0][1]=source[0][1]; |
shaorui | 0:c55310328157 | 350 | dest[0][2]=source[0][2]; |
shaorui | 0:c55310328157 | 351 | dest[1][0]=source[1][0]; |
shaorui | 0:c55310328157 | 352 | dest[1][1]=source[1][1]; |
shaorui | 0:c55310328157 | 353 | dest[1][2]=source[1][2]; |
shaorui | 0:c55310328157 | 354 | dest[2][0]=source[2][0]; |
shaorui | 0:c55310328157 | 355 | dest[2][1]=source[2][1]; |
shaorui | 0:c55310328157 | 356 | dest[2][2]=source[2][2]; |
shaorui | 0:c55310328157 | 357 | return dest; |
shaorui | 0:c55310328157 | 358 | } |
shaorui | 0:c55310328157 | 359 | |
shaorui | 0:c55310328157 | 360 | |
shaorui | 0:c55310328157 | 361 | /*========================= MatCpy ====================================*/ |
shaorui | 0:c55310328157 | 362 | Mat kalmanfilter::MatCpy(Mat dest, cMat source, int nM, int nN){ |
shaorui | 0:c55310328157 | 363 | /*矩阵拷贝 |
shaorui | 0:c55310328157 | 364 | 参数:[out]dest: 目标矩阵 |
shaorui | 0:c55310328157 | 365 | [in]source: 源矩阵 |
shaorui | 0:c55310328157 | 366 | [in]nM: 矩阵行数 |
shaorui | 0:c55310328157 | 367 | [in]nN: 矩阵列数 |
shaorui | 0:c55310328157 | 368 | 返回:dest |
shaorui | 0:c55310328157 | 369 | */ |
shaorui | 0:c55310328157 | 370 | |
shaorui | 0:c55310328157 | 371 | /*需求: |
shaorui | 0:c55310328157 | 372 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 373 | */ |
shaorui | 0:c55310328157 | 374 | |
shaorui | 0:c55310328157 | 375 | /*创建时间: 20080402 |
shaorui | 0:c55310328157 | 376 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 377 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 378 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 379 | */ |
shaorui | 0:c55310328157 | 380 | |
shaorui | 0:c55310328157 | 381 | int i; |
shaorui | 0:c55310328157 | 382 | for(i=0;i<nM*nN;i++){ |
shaorui | 0:c55310328157 | 383 | dest[i]=source[i]; |
shaorui | 0:c55310328157 | 384 | } |
shaorui | 0:c55310328157 | 385 | return dest; |
shaorui | 0:c55310328157 | 386 | } |
shaorui | 0:c55310328157 | 387 | /***************************************************************************************************/ |
shaorui | 0:c55310328157 | 388 | |
shaorui | 0:c55310328157 | 389 | /*============================ Mat3Prod =================================*/ |
shaorui | 0:c55310328157 | 390 | Mat3 kalmanfilter::Mat3Prod(cMat3 C1, cMat3 C2, Mat3 C){ |
shaorui | 0:c55310328157 | 391 | /*3*3矩阵乘法 |
shaorui | 0:c55310328157 | 392 | 参数:[in]C1:3*3 C1矩阵 |
shaorui | 0:c55310328157 | 393 | [in]C2:3*3 C2矩阵 |
shaorui | 0:c55310328157 | 394 | [out]C: C1*C2 |
shaorui | 0:c55310328157 | 395 | 返回:C |
shaorui | 0:c55310328157 | 396 | */ |
shaorui | 0:c55310328157 | 397 | |
shaorui | 0:c55310328157 | 398 | /*需求: |
shaorui | 0:c55310328157 | 399 | 类型:Mat3,cMat3 |
shaorui | 0:c55310328157 | 400 | */ |
shaorui | 0:c55310328157 | 401 | |
shaorui | 0:c55310328157 | 402 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 403 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 404 | Copyright 2005-2010 HLW |
shaorui | 0:c55310328157 | 405 | */ |
shaorui | 0:c55310328157 | 406 | |
shaorui | 0:c55310328157 | 407 | int i,j,k; |
shaorui | 0:c55310328157 | 408 | double Ctemp[3][3]; |
shaorui | 0:c55310328157 | 409 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 410 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 411 | Ctemp[i][j] = 0.0; |
shaorui | 0:c55310328157 | 412 | for (k=0;k<3;k++){ |
shaorui | 0:c55310328157 | 413 | Ctemp[i][j] = Ctemp[i][j] + C1[i][k]*C2[k][j]; |
shaorui | 0:c55310328157 | 414 | } |
shaorui | 0:c55310328157 | 415 | } |
shaorui | 0:c55310328157 | 416 | } |
shaorui | 0:c55310328157 | 417 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 418 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 419 | C[i][j]=Ctemp[i][j]; |
shaorui | 0:c55310328157 | 420 | } |
shaorui | 0:c55310328157 | 421 | } |
shaorui | 0:c55310328157 | 422 | return C; |
shaorui | 0:c55310328157 | 423 | } |
shaorui | 0:c55310328157 | 424 | |
shaorui | 0:c55310328157 | 425 | |
shaorui | 0:c55310328157 | 426 | /*============================ Mat3Prod3 =================================*/ |
shaorui | 0:c55310328157 | 427 | Mat3 kalmanfilter::Mat3Prod3(cMat3 C1, cMat3 C2, cMat3 C3, Mat3 C){ |
shaorui | 0:c55310328157 | 428 | /*3*3矩阵乘法(三个矩阵) |
shaorui | 0:c55310328157 | 429 | 参数:[in]C1:3*3 C1矩阵 |
shaorui | 0:c55310328157 | 430 | [in]C2:3*3 C2矩阵 |
shaorui | 0:c55310328157 | 431 | [in]C3:3*3 C3矩阵 |
shaorui | 0:c55310328157 | 432 | [out]C: C1*C2*C3 |
shaorui | 0:c55310328157 | 433 | 返回:C |
shaorui | 0:c55310328157 | 434 | */ |
shaorui | 0:c55310328157 | 435 | |
shaorui | 0:c55310328157 | 436 | /*需求: |
shaorui | 0:c55310328157 | 437 | 类型:Mat3,cMat3 |
shaorui | 0:c55310328157 | 438 | */ |
shaorui | 0:c55310328157 | 439 | |
shaorui | 0:c55310328157 | 440 | /* 创建时间: 20080410 |
shaorui | 0:c55310328157 | 441 | 最近更改时间: 20080410 |
shaorui | 0:c55310328157 | 442 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 443 | */ |
shaorui | 0:c55310328157 | 444 | |
shaorui | 0:c55310328157 | 445 | int i,j,k; |
shaorui | 0:c55310328157 | 446 | double Ctemp[3][3],Ctemp2[3][3]; |
shaorui | 0:c55310328157 | 447 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 448 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 449 | Ctemp[i][j] = 0.0; |
shaorui | 0:c55310328157 | 450 | for (k=0;k<3;k++){ |
shaorui | 0:c55310328157 | 451 | Ctemp[i][j] = Ctemp[i][j] + C1[i][k]*C2[k][j]; |
shaorui | 0:c55310328157 | 452 | } |
shaorui | 0:c55310328157 | 453 | } |
shaorui | 0:c55310328157 | 454 | } |
shaorui | 0:c55310328157 | 455 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 456 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 457 | Ctemp2[i][j] = 0.0; |
shaorui | 0:c55310328157 | 458 | for (k=0;k<3;k++){ |
shaorui | 0:c55310328157 | 459 | Ctemp2[i][j] = Ctemp2[i][j] + Ctemp[i][k]*C3[k][j]; |
shaorui | 0:c55310328157 | 460 | } |
shaorui | 0:c55310328157 | 461 | } |
shaorui | 0:c55310328157 | 462 | } |
shaorui | 0:c55310328157 | 463 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 464 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 465 | C[i][j]=Ctemp2[i][j]; |
shaorui | 0:c55310328157 | 466 | } |
shaorui | 0:c55310328157 | 467 | } |
shaorui | 0:c55310328157 | 468 | return C; |
shaorui | 0:c55310328157 | 469 | } |
shaorui | 0:c55310328157 | 470 | |
shaorui | 0:c55310328157 | 471 | |
shaorui | 0:c55310328157 | 472 | /*============================ MatProd =================================*/ |
shaorui | 0:c55310328157 | 473 | Mat kalmanfilter::MatProd(cMat C1, cMat C2, Mat C, int nM, int nN, int nP){ |
shaorui | 0:c55310328157 | 474 | /*矩阵乘法 |
shaorui | 0:c55310328157 | 475 | 参数:[in]C1: C1矩阵(nM*nN) |
shaorui | 0:c55310328157 | 476 | [in]C2: C2矩阵(nN*nP) |
shaorui | 0:c55310328157 | 477 | [out]C: C1*C2 |
shaorui | 0:c55310328157 | 478 | [in]nM: C1行数 |
shaorui | 0:c55310328157 | 479 | [in]nN: C1列数(C2行数) |
shaorui | 0:c55310328157 | 480 | [in]nP: C2列数 |
shaorui | 0:c55310328157 | 481 | 返回:C |
shaorui | 0:c55310328157 | 482 | */ |
shaorui | 0:c55310328157 | 483 | |
shaorui | 0:c55310328157 | 484 | /*需求: |
shaorui | 0:c55310328157 | 485 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 486 | 头文件: stdlib.h |
shaorui | 0:c55310328157 | 487 | 宏: MGet |
shaorui | 0:c55310328157 | 488 | */ |
shaorui | 0:c55310328157 | 489 | |
shaorui | 0:c55310328157 | 490 | /* 创建时间: 20080403 |
shaorui | 0:c55310328157 | 491 | 最近更改时间:20080403 |
shaorui | 0:c55310328157 | 492 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 493 | */ |
shaorui | 0:c55310328157 | 494 | |
shaorui | 0:c55310328157 | 495 | int i,j,k; |
shaorui | 0:c55310328157 | 496 | Mat Ctemp=(Mat)malloc(sizeof(double)*nM*nP); |
shaorui | 0:c55310328157 | 497 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 498 | for(j=0;j<nP;j++){ |
shaorui | 0:c55310328157 | 499 | MGet(Ctemp,i,j,nP) = 0.0; |
shaorui | 0:c55310328157 | 500 | for (k=0;k<nN;k++){ |
shaorui | 0:c55310328157 | 501 | MGet(Ctemp,i,j,nP) = MGet(Ctemp,i,j,nP) + MGet(C1,i,k,nN)*MGet(C2,k,j,nP); |
shaorui | 0:c55310328157 | 502 | } |
shaorui | 0:c55310328157 | 503 | } |
shaorui | 0:c55310328157 | 504 | } |
shaorui | 0:c55310328157 | 505 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 506 | for(j=0;j<nP;j++){ |
shaorui | 0:c55310328157 | 507 | MGet(C,i,j,nP)=MGet(Ctemp,i,j,nP); |
shaorui | 0:c55310328157 | 508 | } |
shaorui | 0:c55310328157 | 509 | } |
shaorui | 0:c55310328157 | 510 | free(Ctemp); |
shaorui | 0:c55310328157 | 511 | return C; |
shaorui | 0:c55310328157 | 512 | } |
shaorui | 0:c55310328157 | 513 | |
shaorui | 0:c55310328157 | 514 | |
shaorui | 0:c55310328157 | 515 | /*============================ MatProd3 =================================*/ |
shaorui | 0:c55310328157 | 516 | Mat kalmanfilter::MatProd3(cMat C1, cMat C2, cMat C3, Mat C, int nM, int nN, int nP, int nQ){ |
shaorui | 0:c55310328157 | 517 | /*矩阵乘法(三个矩阵) |
shaorui | 0:c55310328157 | 518 | 参数:[in]C1: C1矩阵(nM*nN) |
shaorui | 0:c55310328157 | 519 | [in]C2: C2矩阵(nN*nP) |
shaorui | 0:c55310328157 | 520 | [in]C3: C3矩阵(nP*nQ) |
shaorui | 0:c55310328157 | 521 | [out]C: C1*C2*C3 |
shaorui | 0:c55310328157 | 522 | [in]nM: C1行数 |
shaorui | 0:c55310328157 | 523 | [in]nN: C1列数(C2行数) |
shaorui | 0:c55310328157 | 524 | [in]nP: C2列数(C3行数) |
shaorui | 0:c55310328157 | 525 | [in]nQ: C3列数 |
shaorui | 0:c55310328157 | 526 | 返回:C |
shaorui | 0:c55310328157 | 527 | */ |
shaorui | 0:c55310328157 | 528 | |
shaorui | 0:c55310328157 | 529 | /*需求: |
shaorui | 0:c55310328157 | 530 | 类型: Mat,cMat |
shaorui | 0:c55310328157 | 531 | 头文件: stdlib.h |
shaorui | 0:c55310328157 | 532 | 宏: MGet |
shaorui | 0:c55310328157 | 533 | */ |
shaorui | 0:c55310328157 | 534 | |
shaorui | 0:c55310328157 | 535 | /* 创建时间: 20080410 |
shaorui | 0:c55310328157 | 536 | 最近更改时间:20080410 |
shaorui | 0:c55310328157 | 537 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 538 | */ |
shaorui | 0:c55310328157 | 539 | |
shaorui | 0:c55310328157 | 540 | int i,j,k; |
shaorui | 0:c55310328157 | 541 | Mat Ctemp=(Mat)malloc(sizeof(double)*nM*nP); |
shaorui | 0:c55310328157 | 542 | Mat Ctemp2=(Mat)malloc(sizeof(double)*nM*nQ); |
shaorui | 0:c55310328157 | 543 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 544 | for(j=0;j<nP;j++){ |
shaorui | 0:c55310328157 | 545 | MGet(Ctemp,i,j,nP) = 0.0; |
shaorui | 0:c55310328157 | 546 | for (k=0;k<nN;k++){ |
shaorui | 0:c55310328157 | 547 | MGet(Ctemp,i,j,nP) = MGet(Ctemp,i,j,nP) + MGet(C1,i,k,nN)*MGet(C2,k,j,nP); |
shaorui | 0:c55310328157 | 548 | } |
shaorui | 0:c55310328157 | 549 | } |
shaorui | 0:c55310328157 | 550 | } |
shaorui | 0:c55310328157 | 551 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 552 | for(j=0;j<nQ;j++){ |
shaorui | 0:c55310328157 | 553 | MGet(Ctemp2,i,j,nQ) = 0.0; |
shaorui | 0:c55310328157 | 554 | for (k=0;k<nP;k++){ |
shaorui | 0:c55310328157 | 555 | MGet(Ctemp2,i,j,nQ) = MGet(Ctemp2,i,j,nQ) + MGet(Ctemp,i,k,nP)*MGet(C3,k,j,nQ); |
shaorui | 0:c55310328157 | 556 | } |
shaorui | 0:c55310328157 | 557 | } |
shaorui | 0:c55310328157 | 558 | } |
shaorui | 0:c55310328157 | 559 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 560 | for(j=0;j<nQ;j++){ |
shaorui | 0:c55310328157 | 561 | MGet(C,i,j,nQ)=MGet(Ctemp2,i,j,nQ); |
shaorui | 0:c55310328157 | 562 | } |
shaorui | 0:c55310328157 | 563 | } |
shaorui | 0:c55310328157 | 564 | free(Ctemp); |
shaorui | 0:c55310328157 | 565 | free(Ctemp2); |
shaorui | 0:c55310328157 | 566 | return C; |
shaorui | 0:c55310328157 | 567 | } |
shaorui | 0:c55310328157 | 568 | /***************************************************************************************************/ |
shaorui | 0:c55310328157 | 569 | |
shaorui | 0:c55310328157 | 570 | /*============================ Mat3Trans =================================*/ |
shaorui | 0:c55310328157 | 571 | Mat3 kalmanfilter::Mat3Trans(cMat3 C,Mat3 CT){ |
shaorui | 0:c55310328157 | 572 | /*3*3矩阵转置 |
shaorui | 0:c55310328157 | 573 | 参数:[in]C: 3*3 C矩阵 |
shaorui | 0:c55310328157 | 574 | [out]CT: C的转置 |
shaorui | 0:c55310328157 | 575 | 返回:CT |
shaorui | 0:c55310328157 | 576 | */ |
shaorui | 0:c55310328157 | 577 | |
shaorui | 0:c55310328157 | 578 | /*需求: |
shaorui | 0:c55310328157 | 579 | 类型:Mat3,cMat3 |
shaorui | 0:c55310328157 | 580 | */ |
shaorui | 0:c55310328157 | 581 | |
shaorui | 0:c55310328157 | 582 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 583 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 584 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 585 | */ |
shaorui | 0:c55310328157 | 586 | |
shaorui | 0:c55310328157 | 587 | int i,j; |
shaorui | 0:c55310328157 | 588 | double Ctemp[3][3]; |
shaorui | 0:c55310328157 | 589 | for(i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 590 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 591 | Ctemp[i][j] = C[j][i]; |
shaorui | 0:c55310328157 | 592 | } |
shaorui | 0:c55310328157 | 593 | } |
shaorui | 0:c55310328157 | 594 | for(i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 595 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 596 | CT[i][j] = Ctemp[i][j]; |
shaorui | 0:c55310328157 | 597 | } |
shaorui | 0:c55310328157 | 598 | } |
shaorui | 0:c55310328157 | 599 | return CT; |
shaorui | 0:c55310328157 | 600 | } |
shaorui | 0:c55310328157 | 601 | |
shaorui | 0:c55310328157 | 602 | |
shaorui | 0:c55310328157 | 603 | /*============================ MatTrans =================================*/ |
shaorui | 0:c55310328157 | 604 | Mat kalmanfilter::MatTrans(cMat C,Mat CT,int nM,int nN){ |
shaorui | 0:c55310328157 | 605 | /*矩阵转置 |
shaorui | 0:c55310328157 | 606 | 参数:[in]C: C矩阵 |
shaorui | 0:c55310328157 | 607 | [out]CT: C的转置 |
shaorui | 0:c55310328157 | 608 | [in]nM: C矩阵行数 |
shaorui | 0:c55310328157 | 609 | [in]nN: C矩阵列数 |
shaorui | 0:c55310328157 | 610 | 返回:CT |
shaorui | 0:c55310328157 | 611 | */ |
shaorui | 0:c55310328157 | 612 | |
shaorui | 0:c55310328157 | 613 | /*需求: |
shaorui | 0:c55310328157 | 614 | 类型:Mat,cMat |
shaorui | 0:c55310328157 | 615 | 头文件:stdlib.h |
shaorui | 0:c55310328157 | 616 | 宏:MGet |
shaorui | 0:c55310328157 | 617 | */ |
shaorui | 0:c55310328157 | 618 | |
shaorui | 0:c55310328157 | 619 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 620 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 621 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 622 | */ |
shaorui | 0:c55310328157 | 623 | |
shaorui | 0:c55310328157 | 624 | int i,j; |
shaorui | 0:c55310328157 | 625 | Mat Ctemp=(Mat)malloc(sizeof(double)*nM*nN); |
shaorui | 0:c55310328157 | 626 | for(i=0;i<nN;i++){ |
shaorui | 0:c55310328157 | 627 | for(j=0;j<nM;j++){ |
shaorui | 0:c55310328157 | 628 | MGet(Ctemp,i,j,nM)=MGet(C,j,i,nN); |
shaorui | 0:c55310328157 | 629 | } |
shaorui | 0:c55310328157 | 630 | } |
shaorui | 0:c55310328157 | 631 | for(i=0;i<nM*nN;i++){ |
shaorui | 0:c55310328157 | 632 | CT[i] = Ctemp[i]; |
shaorui | 0:c55310328157 | 633 | } |
shaorui | 0:c55310328157 | 634 | free(Ctemp); |
shaorui | 0:c55310328157 | 635 | return CT; |
shaorui | 0:c55310328157 | 636 | } |
shaorui | 0:c55310328157 | 637 | /**************************************************************************************************/ |
shaorui | 0:c55310328157 | 638 | |
shaorui | 0:c55310328157 | 639 | /*============================ MatInv =================================*/ |
shaorui | 0:c55310328157 | 640 | Mat kalmanfilter::MatInv(cMat C,Mat IC,int n){ |
shaorui | 0:c55310328157 | 641 | /*方阵的逆 |
shaorui | 0:c55310328157 | 642 | 参数:[in]C:方阵C |
shaorui | 0:c55310328157 | 643 | [out]IC:方阵C的逆 |
shaorui | 0:c55310328157 | 644 | [in]n:方阵C的维数 |
shaorui | 0:c55310328157 | 645 | 返回:IC,若不可逆或失败则返回NULL |
shaorui | 0:c55310328157 | 646 | */ |
shaorui | 0:c55310328157 | 647 | |
shaorui | 0:c55310328157 | 648 | /*需求: |
shaorui | 0:c55310328157 | 649 | 头文件:math.h,stdlib.h |
shaorui | 0:c55310328157 | 650 | 类型:Mat,cMat |
shaorui | 0:c55310328157 | 651 | 宏:NULL |
shaorui | 0:c55310328157 | 652 | */ |
shaorui | 0:c55310328157 | 653 | |
shaorui | 0:c55310328157 | 654 | /* 创建时间: 20070615 |
shaorui | 0:c55310328157 | 655 | 最近更改时间: 20070615 |
shaorui | 0:c55310328157 | 656 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 657 | */ |
shaorui | 0:c55310328157 | 658 | |
shaorui | 0:c55310328157 | 659 | int i,j,k,l; |
shaorui | 0:c55310328157 | 660 | double *cpyC; |
shaorui | 0:c55310328157 | 661 | |
shaorui | 0:c55310328157 | 662 | cpyC=(double*)malloc(n*n*sizeof(double)); |
shaorui | 0:c55310328157 | 663 | if (cpyC==NULL){ |
shaorui | 0:c55310328157 | 664 | return NULL; |
shaorui | 0:c55310328157 | 665 | } |
shaorui | 0:c55310328157 | 666 | |
shaorui | 0:c55310328157 | 667 | for (i=0;i<n*n;i++){ |
shaorui | 0:c55310328157 | 668 | cpyC[i]=C[i]; |
shaorui | 0:c55310328157 | 669 | } |
shaorui | 0:c55310328157 | 670 | /* 单位阵*/ |
shaorui | 0:c55310328157 | 671 | for (i=0; i<n; i++){ |
shaorui | 0:c55310328157 | 672 | for (j=0; j<n; j++){ |
shaorui | 0:c55310328157 | 673 | *(IC+i*n+j) = 0.0; |
shaorui | 0:c55310328157 | 674 | } |
shaorui | 0:c55310328157 | 675 | *(IC+i*n+i) = 1.0; |
shaorui | 0:c55310328157 | 676 | } |
shaorui | 0:c55310328157 | 677 | |
shaorui | 0:c55310328157 | 678 | /* 化上三角阵*/ |
shaorui | 0:c55310328157 | 679 | for (j=0; j<n; j++) { |
shaorui | 0:c55310328157 | 680 | if(fabs(*(cpyC+j*n+j))>1.0e-25){/* C[j][j]不等于0*/ |
shaorui | 0:c55310328157 | 681 | /* IC阵的第j行除以C[j][j]*/ |
shaorui | 0:c55310328157 | 682 | for(k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 683 | *(IC+j*n+k) /= *(cpyC+j*n+j); |
shaorui | 0:c55310328157 | 684 | } |
shaorui | 0:c55310328157 | 685 | /* C阵的第j行除以C[j][j]*/ |
shaorui | 0:c55310328157 | 686 | for(k=n-1; k>=j; k--){ |
shaorui | 0:c55310328157 | 687 | *(cpyC+j*n+k) /= *(cpyC+j*n+j); |
shaorui | 0:c55310328157 | 688 | } |
shaorui | 0:c55310328157 | 689 | |
shaorui | 0:c55310328157 | 690 | for(i=j+1; i<n; i++){ |
shaorui | 0:c55310328157 | 691 | /* IC阵的第i行 - C[i][j]*IC阵的第j行*/ |
shaorui | 0:c55310328157 | 692 | for(k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 693 | *(IC+i*n+k) -= *(cpyC+i*n+j) * *(IC+j*n+k); |
shaorui | 0:c55310328157 | 694 | } |
shaorui | 0:c55310328157 | 695 | /* C阵的第i行 - C[i][j]*C阵的第j行*/ |
shaorui | 0:c55310328157 | 696 | for (k=n-1; k>=j; k--){ |
shaorui | 0:c55310328157 | 697 | *(cpyC+i*n+k) -= *(cpyC+i*n+j) * *(cpyC+j*n+k); |
shaorui | 0:c55310328157 | 698 | } |
shaorui | 0:c55310328157 | 699 | } |
shaorui | 0:c55310328157 | 700 | }else if (j<n-1){ |
shaorui | 0:c55310328157 | 701 | for(l=j+1; l<n; l++){ |
shaorui | 0:c55310328157 | 702 | /* 若C阵第j行后的C[l][j]不等于0,第j行加上第l行*/ |
shaorui | 0:c55310328157 | 703 | if (fabs(*(cpyC+l*n+j)) > 1.0e-25) { |
shaorui | 0:c55310328157 | 704 | for (k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 705 | *(IC+j*n+k) += *(IC+l*n+k); |
shaorui | 0:c55310328157 | 706 | } |
shaorui | 0:c55310328157 | 707 | for (k=n-1; k>=j; k--){ |
shaorui | 0:c55310328157 | 708 | *(cpyC+j*n+k) += *(cpyC+l*n+k); |
shaorui | 0:c55310328157 | 709 | } |
shaorui | 0:c55310328157 | 710 | /* IC阵的第j行除以C[j][j]*/ |
shaorui | 0:c55310328157 | 711 | for (k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 712 | *(IC+j*n+k) /= *(cpyC+j*n+j); |
shaorui | 0:c55310328157 | 713 | } |
shaorui | 0:c55310328157 | 714 | /* C阵的第j行除以C[j][j]*/ |
shaorui | 0:c55310328157 | 715 | for (k=n-1; k>=j; k--){ |
shaorui | 0:c55310328157 | 716 | *(cpyC+j*n+k) /= *(cpyC+j*n+j); |
shaorui | 0:c55310328157 | 717 | } |
shaorui | 0:c55310328157 | 718 | /* 第i行 - C[i][j]*第j行*/ |
shaorui | 0:c55310328157 | 719 | for (i=j+1; i<n; i++){ |
shaorui | 0:c55310328157 | 720 | for (k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 721 | *(IC+i*n+k) -= *(cpyC+i*n+j) * *(IC+j*n+k); |
shaorui | 0:c55310328157 | 722 | } |
shaorui | 0:c55310328157 | 723 | for (k=n-1; k>=j; k--){ |
shaorui | 0:c55310328157 | 724 | *(cpyC+i*n+k) -= *(cpyC+i*n+j) * *(cpyC+j*n+k); |
shaorui | 0:c55310328157 | 725 | } |
shaorui | 0:c55310328157 | 726 | } |
shaorui | 0:c55310328157 | 727 | break; |
shaorui | 0:c55310328157 | 728 | } |
shaorui | 0:c55310328157 | 729 | } |
shaorui | 0:c55310328157 | 730 | |
shaorui | 0:c55310328157 | 731 | if (l == n){ /* C[l][j] 全等于0*/ |
shaorui | 0:c55310328157 | 732 | free(cpyC); |
shaorui | 0:c55310328157 | 733 | return NULL; /* 矩阵的行列式为零,不可求逆*/ |
shaorui | 0:c55310328157 | 734 | } |
shaorui | 0:c55310328157 | 735 | }else{ /* C[n][n]等于0*/ |
shaorui | 0:c55310328157 | 736 | free(cpyC); |
shaorui | 0:c55310328157 | 737 | return NULL; /* 矩阵的行列式为零,不可求逆*/ |
shaorui | 0:c55310328157 | 738 | } |
shaorui | 0:c55310328157 | 739 | } |
shaorui | 0:c55310328157 | 740 | /* 化成单位阵*/ |
shaorui | 0:c55310328157 | 741 | for(j=n-1; j>=1; j--){ |
shaorui | 0:c55310328157 | 742 | for(i=j-1; i>=0; i--){ |
shaorui | 0:c55310328157 | 743 | for(k=0; k<n; k++){ |
shaorui | 0:c55310328157 | 744 | *(IC+i*n+k) -= *(cpyC+i*n+j) * *(IC+j*n+k); |
shaorui | 0:c55310328157 | 745 | } |
shaorui | 0:c55310328157 | 746 | *(cpyC+i*n+j) = 0; |
shaorui | 0:c55310328157 | 747 | } |
shaorui | 0:c55310328157 | 748 | } |
shaorui | 0:c55310328157 | 749 | free(cpyC); |
shaorui | 0:c55310328157 | 750 | return IC; |
shaorui | 0:c55310328157 | 751 | } |
shaorui | 0:c55310328157 | 752 | |
shaorui | 0:c55310328157 | 753 | |
shaorui | 0:c55310328157 | 754 | /*============================ Mat3Inv =================================*/ |
shaorui | 0:c55310328157 | 755 | Mat3 kalmanfilter::Mat3Inv(cMat3 CM,Mat3 ICM){ |
shaorui | 0:c55310328157 | 756 | /*3*3矩阵的逆 |
shaorui | 0:c55310328157 | 757 | 参数:[in]CM:3*3 CM矩阵 |
shaorui | 0:c55310328157 | 758 | [out]ICM:3*3 ICM矩阵 |
shaorui | 0:c55310328157 | 759 | 返回:ICM,若不可逆则返回NULL |
shaorui | 0:c55310328157 | 760 | */ |
shaorui | 0:c55310328157 | 761 | |
shaorui | 0:c55310328157 | 762 | /*需求: |
shaorui | 0:c55310328157 | 763 | 类型:Mat3,cMat3 |
shaorui | 0:c55310328157 | 764 | 宏:NULL, EPS |
shaorui | 0:c55310328157 | 765 | 头文件: math.h |
shaorui | 0:c55310328157 | 766 | */ |
shaorui | 0:c55310328157 | 767 | |
shaorui | 0:c55310328157 | 768 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 769 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 770 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 771 | */ |
shaorui | 0:c55310328157 | 772 | |
shaorui | 0:c55310328157 | 773 | |
shaorui | 0:c55310328157 | 774 | double det; |
shaorui | 0:c55310328157 | 775 | double Ctemp[3][3]; |
shaorui | 0:c55310328157 | 776 | int i,j; |
shaorui | 0:c55310328157 | 777 | det=CM[0][0]*CM[1][1]*CM[2][2]+CM[0][1]*CM[1][2]*CM[2][0]+CM[1][0]*CM[2][1]*CM[0][2]-CM[0][2]*CM[1][1]*CM[2][0]-CM[0][1]*CM[1][0]*CM[2][2]-CM[2][1]*CM[1][2]*CM[0][0]; |
shaorui | 0:c55310328157 | 778 | |
shaorui | 0:c55310328157 | 779 | if (fabs(det)<1.0e-16){ |
shaorui | 0:c55310328157 | 780 | return NULL; |
shaorui | 0:c55310328157 | 781 | } |
shaorui | 0:c55310328157 | 782 | |
shaorui | 0:c55310328157 | 783 | Ctemp[0][0] = (CM[1][1]*CM[2][2] - CM[2][1]*CM[1][2])/det; |
shaorui | 0:c55310328157 | 784 | Ctemp[0][1] = -(CM[0][1]*CM[2][2] - CM[2][1]*CM[0][2])/det; |
shaorui | 0:c55310328157 | 785 | Ctemp[0][2] = (CM[0][1]*CM[1][2] - CM[1][1]*CM[0][2])/det; |
shaorui | 0:c55310328157 | 786 | Ctemp[1][0] = -(CM[1][0]*CM[2][2] - CM[2][0]*CM[1][2])/det; |
shaorui | 0:c55310328157 | 787 | Ctemp[1][1] = (CM[0][0]*CM[2][2] - CM[2][0]*CM[0][2])/det; |
shaorui | 0:c55310328157 | 788 | Ctemp[1][2] = -(CM[0][0]*CM[1][2] - CM[1][0]*CM[0][2])/det; |
shaorui | 0:c55310328157 | 789 | Ctemp[2][0] = (CM[1][0]*CM[2][1] - CM[2][0]*CM[1][1])/det; |
shaorui | 0:c55310328157 | 790 | Ctemp[2][1] = -(CM[0][0]*CM[2][1] - CM[2][0]*CM[0][1])/det; |
shaorui | 0:c55310328157 | 791 | Ctemp[2][2] = (CM[0][0]*CM[1][1] - CM[0][1]*CM[1][0])/det; |
shaorui | 0:c55310328157 | 792 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 793 | for(j=0;j<3;j++){ |
shaorui | 0:c55310328157 | 794 | ICM[i][j]=Ctemp[i][j]; |
shaorui | 0:c55310328157 | 795 | } |
shaorui | 0:c55310328157 | 796 | } |
shaorui | 0:c55310328157 | 797 | return ICM; |
shaorui | 0:c55310328157 | 798 | } |
shaorui | 0:c55310328157 | 799 | |
shaorui | 0:c55310328157 | 800 | |
shaorui | 0:c55310328157 | 801 | /*============================ MatInvDiag =================================*/ |
shaorui | 0:c55310328157 | 802 | Mat kalmanfilter::MatInvDiag(cMat C,Mat IC,int n){ |
shaorui | 0:c55310328157 | 803 | /*方阵的对角逆 |
shaorui | 0:c55310328157 | 804 | 参数:[in]C:方阵C |
shaorui | 0:c55310328157 | 805 | [out]IC:方阵C的对角逆 |
shaorui | 0:c55310328157 | 806 | [in]n:方阵C的维数 |
shaorui | 0:c55310328157 | 807 | 返回:IC,对角元素取倒数,其他元素置0,对角元素若为0则仍保持0 |
shaorui | 0:c55310328157 | 808 | */ |
shaorui | 0:c55310328157 | 809 | |
shaorui | 0:c55310328157 | 810 | /*需求: |
shaorui | 0:c55310328157 | 811 | 头文件:math.h,stdlib.h |
shaorui | 0:c55310328157 | 812 | 类型:Mat,cMat |
shaorui | 0:c55310328157 | 813 | 宏:MGet |
shaorui | 0:c55310328157 | 814 | */ |
shaorui | 0:c55310328157 | 815 | |
shaorui | 0:c55310328157 | 816 | /* 创建时间: 20091104 |
shaorui | 0:c55310328157 | 817 | 最近更改时间: 20091104 |
shaorui | 0:c55310328157 | 818 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 819 | */ |
shaorui | 0:c55310328157 | 820 | |
shaorui | 0:c55310328157 | 821 | int i,j; |
shaorui | 0:c55310328157 | 822 | for (i=0;i<n;i++){ |
shaorui | 0:c55310328157 | 823 | for (j=0;j<n;j++){ |
shaorui | 0:c55310328157 | 824 | if(i!=j){ |
shaorui | 0:c55310328157 | 825 | MGet(IC,i,j,n)=0; |
shaorui | 0:c55310328157 | 826 | }else{ |
shaorui | 0:c55310328157 | 827 | if (MGet(C,i,j,n)!=0){ |
shaorui | 0:c55310328157 | 828 | MGet(IC,i,j,n)=1.0/MGet(C,i,j,n); |
shaorui | 0:c55310328157 | 829 | }else{ |
shaorui | 0:c55310328157 | 830 | MGet(IC,i,j,n)=0; |
shaorui | 0:c55310328157 | 831 | } |
shaorui | 0:c55310328157 | 832 | } |
shaorui | 0:c55310328157 | 833 | } |
shaorui | 0:c55310328157 | 834 | } |
shaorui | 0:c55310328157 | 835 | return IC; |
shaorui | 0:c55310328157 | 836 | } |
shaorui | 0:c55310328157 | 837 | |
shaorui | 0:c55310328157 | 838 | /*****************************************************************************************************************************/ |
shaorui | 0:c55310328157 | 839 | |
shaorui | 0:c55310328157 | 840 | /*============================ MV3Prod =================================*/ |
shaorui | 0:c55310328157 | 841 | Vec3 kalmanfilter::MV3Prod(cMat3 C, cVec3 V, Vec3 Vout){ |
shaorui | 0:c55310328157 | 842 | /*3*3矩阵与3维向量乘法 |
shaorui | 0:c55310328157 | 843 | 参数:[in]C:3*3 C矩阵 |
shaorui | 0:c55310328157 | 844 | [in]V:3维向量V |
shaorui | 0:c55310328157 | 845 | [out]Vout: C*V(V视为列向量) |
shaorui | 0:c55310328157 | 846 | 返回:Vout |
shaorui | 0:c55310328157 | 847 | */ |
shaorui | 0:c55310328157 | 848 | |
shaorui | 0:c55310328157 | 849 | /*需求: |
shaorui | 0:c55310328157 | 850 | 类型: Mat3,Vec3,cMat3,cVec3 |
shaorui | 0:c55310328157 | 851 | */ |
shaorui | 0:c55310328157 | 852 | |
shaorui | 0:c55310328157 | 853 | /* 创建时间: 20070528 |
shaorui | 0:c55310328157 | 854 | 最近更改时间:20070528 |
shaorui | 0:c55310328157 | 855 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 856 | */ |
shaorui | 0:c55310328157 | 857 | double Vtemp[3]; |
shaorui | 0:c55310328157 | 858 | int i; |
shaorui | 0:c55310328157 | 859 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 860 | Vtemp[i] = C[i][0]*V[0] + C[i][1]*V[1] + C[i][2]*V[2]; |
shaorui | 0:c55310328157 | 861 | } |
shaorui | 0:c55310328157 | 862 | Vout[0]=Vtemp[0]; |
shaorui | 0:c55310328157 | 863 | Vout[1]=Vtemp[1]; |
shaorui | 0:c55310328157 | 864 | Vout[2]=Vtemp[2]; |
shaorui | 0:c55310328157 | 865 | return Vout; |
shaorui | 0:c55310328157 | 866 | } |
shaorui | 0:c55310328157 | 867 | |
shaorui | 0:c55310328157 | 868 | |
shaorui | 0:c55310328157 | 869 | /*============================ VM3Prod =================================*/ |
shaorui | 0:c55310328157 | 870 | Vec3 kalmanfilter::VM3Prod(cVec3 V, cMat3 C, Vec3 Vout){ |
shaorui | 0:c55310328157 | 871 | /*3维向量与3*3矩阵乘法 |
shaorui | 0:c55310328157 | 872 | 参数:[in]V:3维向量V |
shaorui | 0:c55310328157 | 873 | [in]C:3*3 C矩阵 |
shaorui | 0:c55310328157 | 874 | [out]Vout: V*C(V视为行向量) |
shaorui | 0:c55310328157 | 875 | 返回:Vout |
shaorui | 0:c55310328157 | 876 | */ |
shaorui | 0:c55310328157 | 877 | |
shaorui | 0:c55310328157 | 878 | /*需求: |
shaorui | 0:c55310328157 | 879 | 类型: Mat3,Vec3,cMat3,cVec3 |
shaorui | 0:c55310328157 | 880 | */ |
shaorui | 0:c55310328157 | 881 | |
shaorui | 0:c55310328157 | 882 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 883 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 884 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 885 | */ |
shaorui | 0:c55310328157 | 886 | double Vtemp[3]; |
shaorui | 0:c55310328157 | 887 | int i; |
shaorui | 0:c55310328157 | 888 | for (i=0;i<3;i++){ |
shaorui | 0:c55310328157 | 889 | Vtemp[i] = C[0][i]*V[0] + C[1][i]*V[1] + C[2][i]*V[2]; |
shaorui | 0:c55310328157 | 890 | } |
shaorui | 0:c55310328157 | 891 | Vout[0]=Vtemp[0]; |
shaorui | 0:c55310328157 | 892 | Vout[1]=Vtemp[1]; |
shaorui | 0:c55310328157 | 893 | Vout[2]=Vtemp[2]; |
shaorui | 0:c55310328157 | 894 | return Vout; |
shaorui | 0:c55310328157 | 895 | } |
shaorui | 0:c55310328157 | 896 | |
shaorui | 0:c55310328157 | 897 | |
shaorui | 0:c55310328157 | 898 | /*============================ MVProd =================================*/ |
shaorui | 0:c55310328157 | 899 | Vec kalmanfilter::MVProd(cMat C, cVec V, Vec Vout, int nM, int nN){ |
shaorui | 0:c55310328157 | 900 | /*矩阵与向量乘法 |
shaorui | 0:c55310328157 | 901 | 参数:[in]C: C矩阵 |
shaorui | 0:c55310328157 | 902 | [in]V: 向量V |
shaorui | 0:c55310328157 | 903 | [out]Vout: C*V(V视为列向量) |
shaorui | 0:c55310328157 | 904 | [in]nM: C行数 |
shaorui | 0:c55310328157 | 905 | [in]nN: C列数,即V的维数 |
shaorui | 0:c55310328157 | 906 | 返回:Vout |
shaorui | 0:c55310328157 | 907 | */ |
shaorui | 0:c55310328157 | 908 | |
shaorui | 0:c55310328157 | 909 | /*需求: |
shaorui | 0:c55310328157 | 910 | 类型: Mat,Vec,cMat,cVec |
shaorui | 0:c55310328157 | 911 | 宏: MGet |
shaorui | 0:c55310328157 | 912 | 头文件: stdlib.h |
shaorui | 0:c55310328157 | 913 | */ |
shaorui | 0:c55310328157 | 914 | |
shaorui | 0:c55310328157 | 915 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 916 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 917 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 918 | */ |
shaorui | 0:c55310328157 | 919 | Vec Vtemp=(Vec)malloc(sizeof(double)*nM); |
shaorui | 0:c55310328157 | 920 | int i,j; |
shaorui | 0:c55310328157 | 921 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 922 | Vtemp[i]=0.0; |
shaorui | 0:c55310328157 | 923 | for(j=0;j<nN;j++){ |
shaorui | 0:c55310328157 | 924 | Vtemp[i] = Vtemp[i]+MGet(C,i,j,nN)*V[j]; |
shaorui | 0:c55310328157 | 925 | } |
shaorui | 0:c55310328157 | 926 | } |
shaorui | 0:c55310328157 | 927 | for (i=0;i<nM;i++){ |
shaorui | 0:c55310328157 | 928 | Vout[i]=Vtemp[i]; |
shaorui | 0:c55310328157 | 929 | } |
shaorui | 0:c55310328157 | 930 | free(Vtemp); |
shaorui | 0:c55310328157 | 931 | return Vout; |
shaorui | 0:c55310328157 | 932 | } |
shaorui | 0:c55310328157 | 933 | |
shaorui | 0:c55310328157 | 934 | |
shaorui | 0:c55310328157 | 935 | /*============================ VMProd =================================*/ |
shaorui | 0:c55310328157 | 936 | Vec kalmanfilter::VMProd(cVec V, cMat C, Vec Vout, int nM, int nN){ |
shaorui | 0:c55310328157 | 937 | /*向量与矩阵乘法 |
shaorui | 0:c55310328157 | 938 | 参数:[in]V: 向量V |
shaorui | 0:c55310328157 | 939 | [in]C: 矩阵C |
shaorui | 0:c55310328157 | 940 | [out]Vout: V*C(V视为行向量) |
shaorui | 0:c55310328157 | 941 | [in]nM: C行数,即V的维数 |
shaorui | 0:c55310328157 | 942 | [in]nN: C列数 |
shaorui | 0:c55310328157 | 943 | 返回:Vout |
shaorui | 0:c55310328157 | 944 | */ |
shaorui | 0:c55310328157 | 945 | |
shaorui | 0:c55310328157 | 946 | /*需求: |
shaorui | 0:c55310328157 | 947 | 类型: Mat,Vec,cMat,cVec |
shaorui | 0:c55310328157 | 948 | 宏: MGet |
shaorui | 0:c55310328157 | 949 | 头文件: stdlib.h |
shaorui | 0:c55310328157 | 950 | */ |
shaorui | 0:c55310328157 | 951 | |
shaorui | 0:c55310328157 | 952 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 953 | 最近更改时间:20080402 |
shaorui | 0:c55310328157 | 954 | Copyright 2005-2010 SSTC |
shaorui | 0:c55310328157 | 955 | */ |
shaorui | 0:c55310328157 | 956 | |
shaorui | 0:c55310328157 | 957 | Vec Vtemp=(Vec)malloc(sizeof(double)*nN); |
shaorui | 0:c55310328157 | 958 | int i,j; |
shaorui | 0:c55310328157 | 959 | for (i=0;i<nN;i++){ |
shaorui | 0:c55310328157 | 960 | Vtemp[i]=0.0; |
shaorui | 0:c55310328157 | 961 | for(j=0;j<nM;j++){ |
shaorui | 0:c55310328157 | 962 | Vtemp[i] = Vtemp[i]+MGet(C,j,i,nN)*V[j]; |
shaorui | 0:c55310328157 | 963 | } |
shaorui | 0:c55310328157 | 964 | } |
shaorui | 0:c55310328157 | 965 | for (i=0;i<nN;i++){ |
shaorui | 0:c55310328157 | 966 | Vout[i]=Vtemp[i]; |
shaorui | 0:c55310328157 | 967 | } |
shaorui | 0:c55310328157 | 968 | free(Vtemp); |
shaorui | 0:c55310328157 | 969 | return Vout; |
shaorui | 0:c55310328157 | 970 | } |
shaorui | 0:c55310328157 | 971 | /**************************************************************************************************************/ |
shaorui | 0:c55310328157 | 972 | |
shaorui | 0:c55310328157 | 973 | /*========================= VecCpy =================================*/ |
shaorui | 0:c55310328157 | 974 | Vec kalmanfilter::VecCpy(Vec dest, cVec source, int nOrder){ |
shaorui | 0:c55310328157 | 975 | /*向量拷贝 |
shaorui | 0:c55310328157 | 976 | 参数:[out]dest: 目标向量 |
shaorui | 0:c55310328157 | 977 | [in]source: 源向量 |
shaorui | 0:c55310328157 | 978 | [in]nOrder: 向量维数 |
shaorui | 0:c55310328157 | 979 | 返回:dest |
shaorui | 0:c55310328157 | 980 | */ |
shaorui | 0:c55310328157 | 981 | |
shaorui | 0:c55310328157 | 982 | /*需求: |
shaorui | 0:c55310328157 | 983 | 类型: Vec,cVec |
shaorui | 0:c55310328157 | 984 | */ |
shaorui | 0:c55310328157 | 985 | |
shaorui | 0:c55310328157 | 986 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 987 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 988 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 989 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 990 | */ |
shaorui | 0:c55310328157 | 991 | int i; |
shaorui | 0:c55310328157 | 992 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 993 | dest[i]=source[i]; |
shaorui | 0:c55310328157 | 994 | } |
shaorui | 0:c55310328157 | 995 | return dest; |
shaorui | 0:c55310328157 | 996 | } |
shaorui | 0:c55310328157 | 997 | |
shaorui | 0:c55310328157 | 998 | |
shaorui | 0:c55310328157 | 999 | /*========================= nVecCpy =================================*/ |
shaorui | 0:c55310328157 | 1000 | nVec kalmanfilter::nVecCpy(nVec dest, cnVec source, int nOrder){ |
shaorui | 0:c55310328157 | 1001 | /*整型向量拷贝 |
shaorui | 0:c55310328157 | 1002 | 参数:[out]dest: 目标向量 |
shaorui | 0:c55310328157 | 1003 | [in]source: 源向量 |
shaorui | 0:c55310328157 | 1004 | [in]nOrder: 向量维数 |
shaorui | 0:c55310328157 | 1005 | 返回:dest |
shaorui | 0:c55310328157 | 1006 | */ |
shaorui | 0:c55310328157 | 1007 | |
shaorui | 0:c55310328157 | 1008 | /*需求: |
shaorui | 0:c55310328157 | 1009 | 类型: nVec,cnVec |
shaorui | 0:c55310328157 | 1010 | */ |
shaorui | 0:c55310328157 | 1011 | |
shaorui | 0:c55310328157 | 1012 | /*创建时间: 20080512 |
shaorui | 0:c55310328157 | 1013 | 最近更改时间:20080512 |
shaorui | 0:c55310328157 | 1014 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1015 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1016 | */ |
shaorui | 0:c55310328157 | 1017 | int i; |
shaorui | 0:c55310328157 | 1018 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 1019 | dest[i]=source[i]; |
shaorui | 0:c55310328157 | 1020 | } |
shaorui | 0:c55310328157 | 1021 | return dest; |
shaorui | 0:c55310328157 | 1022 | } |
shaorui | 0:c55310328157 | 1023 | /*********************************************************************************************************/ |
shaorui | 0:c55310328157 | 1024 | |
shaorui | 0:c55310328157 | 1025 | /*========================= VecSum ====================================*/ |
shaorui | 0:c55310328157 | 1026 | Vec kalmanfilter::VecSum(cVec V1, cVec V2, int nOrder, Vec Vout){ |
shaorui | 0:c55310328157 | 1027 | /*向量加法 |
shaorui | 0:c55310328157 | 1028 | 参数:[in]V1: 向量1 |
shaorui | 0:c55310328157 | 1029 | [in]V2: 向量2 |
shaorui | 0:c55310328157 | 1030 | [in]nOrder: 向量1与向量2的维数 |
shaorui | 0:c55310328157 | 1031 | [out]Vout: 向量1与向量2的和 |
shaorui | 0:c55310328157 | 1032 | 返回:Vout |
shaorui | 0:c55310328157 | 1033 | */ |
shaorui | 0:c55310328157 | 1034 | |
shaorui | 0:c55310328157 | 1035 | /*需求: |
shaorui | 0:c55310328157 | 1036 | 类型: Vec,cVec |
shaorui | 0:c55310328157 | 1037 | */ |
shaorui | 0:c55310328157 | 1038 | |
shaorui | 0:c55310328157 | 1039 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 1040 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 1041 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1042 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1043 | */ |
shaorui | 0:c55310328157 | 1044 | int i; |
shaorui | 0:c55310328157 | 1045 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 1046 | Vout[i]=V1[i]+V2[i]; |
shaorui | 0:c55310328157 | 1047 | } |
shaorui | 0:c55310328157 | 1048 | return Vout; |
shaorui | 0:c55310328157 | 1049 | } |
shaorui | 0:c55310328157 | 1050 | |
shaorui | 0:c55310328157 | 1051 | |
shaorui | 0:c55310328157 | 1052 | /*========================= nVecSum ====================================*/ |
shaorui | 0:c55310328157 | 1053 | nVec kalmanfilter::nVecSum(cnVec V1, cnVec V2, int nOrder, nVec Vout){ |
shaorui | 0:c55310328157 | 1054 | /*整型向量加法 |
shaorui | 0:c55310328157 | 1055 | 参数:[in]V1: 整型向量1 |
shaorui | 0:c55310328157 | 1056 | [in]V2: 整型向量2 |
shaorui | 0:c55310328157 | 1057 | [in]nOrder: 向量1与向量2的维数 |
shaorui | 0:c55310328157 | 1058 | [out]Vout: 向量1与向量2的和 |
shaorui | 0:c55310328157 | 1059 | 返回:Vout |
shaorui | 0:c55310328157 | 1060 | */ |
shaorui | 0:c55310328157 | 1061 | |
shaorui | 0:c55310328157 | 1062 | /*需求: |
shaorui | 0:c55310328157 | 1063 | 类型: nVec,cnVec |
shaorui | 0:c55310328157 | 1064 | */ |
shaorui | 0:c55310328157 | 1065 | |
shaorui | 0:c55310328157 | 1066 | /*创建时间: 20080512 |
shaorui | 0:c55310328157 | 1067 | 最近更改时间:20080512 |
shaorui | 0:c55310328157 | 1068 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1069 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1070 | */ |
shaorui | 0:c55310328157 | 1071 | int i; |
shaorui | 0:c55310328157 | 1072 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 1073 | Vout[i]=V1[i]+V2[i]; |
shaorui | 0:c55310328157 | 1074 | } |
shaorui | 0:c55310328157 | 1075 | return Vout; |
shaorui | 0:c55310328157 | 1076 | } |
shaorui | 0:c55310328157 | 1077 | /*******************************************************************************************************************/ |
shaorui | 0:c55310328157 | 1078 | |
shaorui | 0:c55310328157 | 1079 | /*========================= VecMinus =================================*/ |
shaorui | 0:c55310328157 | 1080 | Vec kalmanfilter::VecMinus(cVec V1, cVec V2, int nOrder, Vec Vout){ |
shaorui | 0:c55310328157 | 1081 | /*向量减法 |
shaorui | 0:c55310328157 | 1082 | 参数:[in]V1: 向量1 |
shaorui | 0:c55310328157 | 1083 | [in]V2: 向量2 |
shaorui | 0:c55310328157 | 1084 | [in]nOrder: 向量1与向量2的维数 |
shaorui | 0:c55310328157 | 1085 | [out]Vout: 向量1与向量2的差 |
shaorui | 0:c55310328157 | 1086 | 返回:Vout |
shaorui | 0:c55310328157 | 1087 | */ |
shaorui | 0:c55310328157 | 1088 | |
shaorui | 0:c55310328157 | 1089 | /*需求: |
shaorui | 0:c55310328157 | 1090 | 类型: Vec,cVec |
shaorui | 0:c55310328157 | 1091 | */ |
shaorui | 0:c55310328157 | 1092 | |
shaorui | 0:c55310328157 | 1093 | /*创建时间: 20070530 |
shaorui | 0:c55310328157 | 1094 | 最近更改时间:20070530 |
shaorui | 0:c55310328157 | 1095 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1096 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1097 | */ |
shaorui | 0:c55310328157 | 1098 | int i; |
shaorui | 0:c55310328157 | 1099 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 1100 | Vout[i]=V1[i]-V2[i]; |
shaorui | 0:c55310328157 | 1101 | } |
shaorui | 0:c55310328157 | 1102 | return Vout; |
shaorui | 0:c55310328157 | 1103 | } |
shaorui | 0:c55310328157 | 1104 | |
shaorui | 0:c55310328157 | 1105 | |
shaorui | 0:c55310328157 | 1106 | /*========================= nVecMinus =================================*/ |
shaorui | 0:c55310328157 | 1107 | nVec kalmanfilter::nVecMinus(cnVec V1, cnVec V2, int nOrder, nVec Vout){ |
shaorui | 0:c55310328157 | 1108 | /*整型向量减法 |
shaorui | 0:c55310328157 | 1109 | 参数:[in]V1: 整型向量1 |
shaorui | 0:c55310328157 | 1110 | [in]V2: 整型向量2 |
shaorui | 0:c55310328157 | 1111 | [in]nOrder: 向量1与向量2的维数 |
shaorui | 0:c55310328157 | 1112 | [out]Vout: 向量1与向量2的差 |
shaorui | 0:c55310328157 | 1113 | 返回:Vout |
shaorui | 0:c55310328157 | 1114 | */ |
shaorui | 0:c55310328157 | 1115 | |
shaorui | 0:c55310328157 | 1116 | /*需求: |
shaorui | 0:c55310328157 | 1117 | 类型: nVec,cnVec |
shaorui | 0:c55310328157 | 1118 | */ |
shaorui | 0:c55310328157 | 1119 | |
shaorui | 0:c55310328157 | 1120 | /*创建时间: 20080512 |
shaorui | 0:c55310328157 | 1121 | 最近更改时间:20080512 |
shaorui | 0:c55310328157 | 1122 | Copyright 2006-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1123 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1124 | */ |
shaorui | 0:c55310328157 | 1125 | int i; |
shaorui | 0:c55310328157 | 1126 | for (i=0;i<nOrder;i++){ |
shaorui | 0:c55310328157 | 1127 | Vout[i]=V1[i]-V2[i]; |
shaorui | 0:c55310328157 | 1128 | } |
shaorui | 0:c55310328157 | 1129 | return Vout; |
shaorui | 0:c55310328157 | 1130 | } |
shaorui | 0:c55310328157 | 1131 | |
shaorui | 0:c55310328157 | 1132 | /*******************************************************************************************************************/ |
shaorui | 0:c55310328157 | 1133 | |
shaorui | 0:c55310328157 | 1134 | /*========================= Kalman1 ====================================*/ |
shaorui | 0:c55310328157 | 1135 | Vec kalmanfilter::Kalman1(cMat Phik_, cMat Gamak_1, cMat Hk, cMat Qk_1, cMat Rk, cMat Pk_1, cVec Xk_1, cVec Zk, cMat Bk_1, cVec Uk_1, |
shaorui | 0:c55310328157 | 1136 | int n, int m, int q, int p, Vec Xk, Mat Pk, Mat Kk, Mat Pk_, Vec Xk_){ |
shaorui | 0:c55310328157 | 1137 | /*离散卡尔曼滤波的一步递推,系统方程:X(k+1)=Φ(k+1,k)X(k)+B(k)U(k)+Γ(k)W(k),Z(k+1)=H(k+1)X(k+1)+V(k+1) |
shaorui | 0:c55310328157 | 1138 | 参数:[in]Phik_: Φ(k+1,k);n*n,n为阶数 |
shaorui | 0:c55310328157 | 1139 | [in]Gamak_1: Γ(k);n*q,q为驱动噪声W(k)维数 |
shaorui | 0:c55310328157 | 1140 | [in]Hk: H(k+1);m*n,m为观测维数 |
shaorui | 0:c55310328157 | 1141 | [in]Qk_1: Q(k);q*q,驱动噪声W(k)协方差阵 |
shaorui | 0:c55310328157 | 1142 | [in]Rk: R(k+1);m*m,观测噪声V(k+1)协方差阵 |
shaorui | 0:c55310328157 | 1143 | [in]Pk_1: P(k,k);n*n |
shaorui | 0:c55310328157 | 1144 | [in]Xk_1: X(k,k);n维向量 |
shaorui | 0:c55310328157 | 1145 | [in]Zk: Z(k+1);m维向量 |
shaorui | 0:c55310328157 | 1146 | [in]Bk_1: B(k);n*p,p为输入维数 |
shaorui | 0:c55310328157 | 1147 | [in]Uk_1: U(k);p维向量 |
shaorui | 0:c55310328157 | 1148 | [in]n: 系统阶数 |
shaorui | 0:c55310328157 | 1149 | [in]m: 观测维数 |
shaorui | 0:c55310328157 | 1150 | [in]p: 输入维数 |
shaorui | 0:c55310328157 | 1151 | [in]q: 驱动噪声维数 |
shaorui | 0:c55310328157 | 1152 | [out]Xk: X(k+1,k+1);n维向量,若不需输出设为NULL |
shaorui | 0:c55310328157 | 1153 | [out]Pk: P(k+1,k+1);n*n,若不需输出设为NULL |
shaorui | 0:c55310328157 | 1154 | [out]Kk: K(k+1);n*m,若不需输出设为NULL |
shaorui | 0:c55310328157 | 1155 | [out]Pk_: P(k+1,k);n*n,若不需输出设为NULL |
shaorui | 0:c55310328157 | 1156 | [out]Xk_: X(k+1,k);n维向量,若不需输出设为NULL |
shaorui | 0:c55310328157 | 1157 | 返回:Xk,若不成功,返回NULL |
shaorui | 0:c55310328157 | 1158 | */ |
shaorui | 0:c55310328157 | 1159 | |
shaorui | 0:c55310328157 | 1160 | /*需求: |
shaorui | 0:c55310328157 | 1161 | 函数: MatTrans, MatProd, MatSum, MatInv, MatInitI, MatMinus, MVProd, VecSum, VecMinus, VecCpy, MatCpy |
shaorui | 0:c55310328157 | 1162 | 头文件: stdlib.h |
shaorui | 0:c55310328157 | 1163 | 宏: NULL |
shaorui | 0:c55310328157 | 1164 | */ |
shaorui | 0:c55310328157 | 1165 | |
shaorui | 0:c55310328157 | 1166 | /* 创建时间: 20080402 |
shaorui | 0:c55310328157 | 1167 | 最近更改时间:20080403 |
shaorui | 0:c55310328157 | 1168 | Copyright 2005-2010 SSTC,HLW |
shaorui | 0:c55310328157 | 1169 | Email: nostalgica@163.com |
shaorui | 0:c55310328157 | 1170 | */ |
shaorui | 0:c55310328157 | 1171 | |
shaorui | 0:c55310328157 | 1172 | int nmax=max(max(max(n,m),p),q); |
shaorui | 0:c55310328157 | 1173 | Mat tCn=(Mat)malloc(sizeof(double)*nmax*nmax); |
shaorui | 0:c55310328157 | 1174 | Mat tCn2=(Mat)malloc(sizeof(double)*nmax*nmax); |
shaorui | 0:c55310328157 | 1175 | Mat tCn3=(Mat)malloc(sizeof(double)*nmax*nmax); |
shaorui | 0:c55310328157 | 1176 | Mat tCn4=(Mat)malloc(sizeof(double)*nmax*nmax); |
shaorui | 0:c55310328157 | 1177 | Mat tCn5=(Mat)malloc(sizeof(double)*nmax*nmax); |
shaorui | 0:c55310328157 | 1178 | Vec tV=(Vec)malloc(sizeof(double)*nmax); |
shaorui | 0:c55310328157 | 1179 | Vec tV2=(Vec)malloc(sizeof(double)*nmax); |
shaorui | 0:c55310328157 | 1180 | |
shaorui | 0:c55310328157 | 1181 | /*Pk_=Phik_*Pk_1*Phik_'+Gamak_1*Qk_1*Gamak_1'; |
shaorui | 0:c55310328157 | 1182 | Kk=Pk_*Hk'*(Hk*Pk_*Hk'+Rk)^(-1); |
shaorui | 0:c55310328157 | 1183 | I=eye(order); |
shaorui | 0:c55310328157 | 1184 | Pk=(I-Kk*Hk)*Pk_*(I-Kk*Hk)'+Kk*Rk*Kk'; |
shaorui | 0:c55310328157 | 1185 | Xk_=Phik_*Xk_1+Bk_1*Uk_1; |
shaorui | 0:c55310328157 | 1186 | Xk=Xk_+Kk*(Zk-Hk*Xk_); |
shaorui | 0:c55310328157 | 1187 | */ |
shaorui | 0:c55310328157 | 1188 | |
shaorui | 0:c55310328157 | 1189 | MatTrans(Phik_,tCn,n,n); |
shaorui | 0:c55310328157 | 1190 | MatProd(Pk_1,tCn,tCn2,n,n,n); |
shaorui | 0:c55310328157 | 1191 | MatProd(Phik_,tCn2,tCn,n,n,n); |
shaorui | 0:c55310328157 | 1192 | MatTrans(Gamak_1,tCn2,n,q); |
shaorui | 0:c55310328157 | 1193 | MatProd(Qk_1,tCn2,tCn3,q,q,n); |
shaorui | 0:c55310328157 | 1194 | MatProd(Gamak_1,tCn3,tCn2,n,q,n); |
shaorui | 0:c55310328157 | 1195 | MatSum(tCn,tCn2,tCn,n,n);/*tCn:Pk_*/ |
shaorui | 0:c55310328157 | 1196 | |
shaorui | 0:c55310328157 | 1197 | MatTrans(Hk,tCn2,m,n); |
shaorui | 0:c55310328157 | 1198 | MatProd(Hk,MatProd(tCn,tCn2,tCn3,n,n,m),tCn4,m,n,m); |
shaorui | 0:c55310328157 | 1199 | MatSum(tCn4,Rk,tCn3,m,m); |
shaorui | 0:c55310328157 | 1200 | if (MatInv(tCn3,tCn3,m)==NULL){ |
shaorui | 0:c55310328157 | 1201 | return NULL; |
shaorui | 0:c55310328157 | 1202 | } |
shaorui | 0:c55310328157 | 1203 | MatProd(tCn,MatProd(tCn2,tCn3,tCn4,n,m,m),tCn2,n,n,m);/*tCn2:Kk*/ |
shaorui | 0:c55310328157 | 1204 | MatInitI(tCn5,n); |
shaorui | 0:c55310328157 | 1205 | |
shaorui | 0:c55310328157 | 1206 | MatMinus(tCn5,MatProd(tCn2,Hk,tCn3,n,m,n),tCn3,n,n); |
shaorui | 0:c55310328157 | 1207 | MatTrans(tCn3,tCn4,n,n); |
shaorui | 0:c55310328157 | 1208 | MatProd(tCn3,MatProd(tCn,tCn4,tCn4,n,n,n),tCn3,n,n,n); |
shaorui | 0:c55310328157 | 1209 | |
shaorui | 0:c55310328157 | 1210 | MatProd(tCn2,MatProd(Rk,MatTrans(tCn2,tCn4,n,m),tCn4,m,m,n),tCn4,n,m,n); |
shaorui | 0:c55310328157 | 1211 | MatSum(tCn3,tCn4,tCn3,n,n);/*tCn3:Pk*/ |
shaorui | 0:c55310328157 | 1212 | MVProd(Phik_,Xk_1,tV,n,n); |
shaorui | 0:c55310328157 | 1213 | MVProd(Bk_1,Uk_1,tV2,n,p); |
shaorui | 0:c55310328157 | 1214 | VecSum(tV,tV2,n,tV);/*tV:Xk_*/ |
shaorui | 0:c55310328157 | 1215 | VecMinus(Zk,MVProd(Hk,tV,tV2,m,n),m,tV2); |
shaorui | 0:c55310328157 | 1216 | VecSum(tV,MVProd(tCn2,tV2,tV2,n,m),n,tV2);/*tV2:Xk*/ |
shaorui | 0:c55310328157 | 1217 | |
shaorui | 0:c55310328157 | 1218 | |
shaorui | 0:c55310328157 | 1219 | if (Xk!=NULL){ |
shaorui | 0:c55310328157 | 1220 | VecCpy(Xk,tV2,n); |
shaorui | 0:c55310328157 | 1221 | } |
shaorui | 0:c55310328157 | 1222 | if (Pk!=NULL){ |
shaorui | 0:c55310328157 | 1223 | MatCpy(Pk,tCn3,n,n); |
shaorui | 0:c55310328157 | 1224 | } |
shaorui | 0:c55310328157 | 1225 | if (Kk!=NULL){ |
shaorui | 0:c55310328157 | 1226 | MatCpy(Kk,tCn2,n,m); |
shaorui | 0:c55310328157 | 1227 | } |
shaorui | 0:c55310328157 | 1228 | if (Pk_!=NULL){ |
shaorui | 0:c55310328157 | 1229 | MatCpy(Pk_,tCn,n,n); |
shaorui | 0:c55310328157 | 1230 | } |
shaorui | 0:c55310328157 | 1231 | if (Xk_!=NULL){ |
shaorui | 0:c55310328157 | 1232 | VecCpy(Xk_,tV,n); |
shaorui | 0:c55310328157 | 1233 | } |
shaorui | 0:c55310328157 | 1234 | |
shaorui | 0:c55310328157 | 1235 | free(tCn); |
shaorui | 0:c55310328157 | 1236 | free(tCn2); |
shaorui | 0:c55310328157 | 1237 | free(tCn3); |
shaorui | 0:c55310328157 | 1238 | free(tCn4); |
shaorui | 0:c55310328157 | 1239 | free(tCn5); |
shaorui | 0:c55310328157 | 1240 | free(tV); |
shaorui | 0:c55310328157 | 1241 | free(tV2); |
shaorui | 0:c55310328157 | 1242 | return Xk; |
shaorui | 0:c55310328157 | 1243 | } |