Matlab卡尔曼滤波代码报错:左右元素数量不匹配的解决方法
解决Matlab代码中“无法执行赋值操作,左右两侧元素数量不匹配”的错误
错误根源
核心问题是输入矩阵B的维度定义错误,导致状态预测时维度不兼容,最终使xest的维度异常,引发赋值失败。具体来说:
- 原代码中
B = [T^2 / 2 T];是1×2的行向量,而状态方程里A*xest是2×1的列向量,两者无法直接相加,导致xpredict维度错误,后续xest的维度也随之异常,最终[1 0] * xest的结果不是预期的标量,无法赋值给单个元素x1e(i+1)。 - 初始化阶段的
PP计算写法错误,与循环内的逻辑不一致,会影响卡尔曼滤波的初始状态。
修正步骤
- 修正B的维度:将B定义为2×1的列向量,匹配状态向量的维度:
B = [(T^2)/2; T]; - 修正初始化阶段的PP计算:与循环内的PP更新逻辑保持一致:
PP = A * PE * A' + G * Q * G';
修正后的完整代码
T = 0.2; A = [1 T; 0 1]; B = [(T^2)/2; T]; % 修正为列向量 H = [1 0]; G = [0 1]'; Q = 0.00005; R = 0.006; x1(1) = 0; x2(1) = 0; x1e(1) = 0; x2e(1) = 0; xest = [x1e(1) x2e(1)]'; x1p(1) = 0; x2p(1) = 0; PE = [R 0; 0 0]; PP = A * PE * A' + G * Q * G'; % 修正初始化的PP计算 for i= 1:25 if i < 10 u = 0.25; else u = 0; end x1(i+1) = x1(i) + T * x2(i) + (T^2 / 2) * u; x2(i+1) = x2(i) + T * u + sqrt(Q) * randn; y(i+1) = x1(i+1) + sqrt(R) * randn; PP = A * PE * A' + G * Q * G'; K = PP * H' * inv(H * PP * H' + R); PE = (eye(2) - K * H) * PP; % 优化括号写法,避免歧义 xpredict = A * xest + B * u; xest = xpredict + K * (y(i+1) - H * xpredict); x1e(i+1) = [1 0] * xest; x2e(i+1) = [0 1] * xest; end
额外优化
将PE = [eye(2) - K * H] * PP;改为PE = (eye(2) - K * H) * PP;,添加括号使逻辑更清晰,避免Matlab解析歧义。
内容的提问来源于stack exchange,提问作者acemal9
相关产品推荐
相关产品推荐

