You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matlab卡尔曼滤波代码报错:左右元素数量不匹配的解决方法

解决Matlab代码中“无法执行赋值操作,左右两侧元素数量不匹配”的错误

错误根源

核心问题是输入矩阵B的维度定义错误,导致状态预测时维度不兼容,最终使xest的维度异常,引发赋值失败。具体来说:

  • 原代码中B = [T^2 / 2 T];是1×2的行向量,而状态方程里A*xest是2×1的列向量,两者无法直接相加,导致xpredict维度错误,后续xest的维度也随之异常,最终[1 0] * xest的结果不是预期的标量,无法赋值给单个元素x1e(i+1)。
  • 初始化阶段的PP计算写法错误,与循环内的逻辑不一致,会影响卡尔曼滤波的初始状态。

修正步骤

  1. 修正B的维度:将B定义为2×1的列向量,匹配状态向量的维度:
    B = [(T^2)/2; T];
    
  2. 修正初始化阶段的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:41:06