【发布时间】:2015-11-26 04:10:37
【问题描述】:
我正在尝试执行以下代码
p, c = [], []
for z in mes:
print (z)
print (c)
print (p)
p.append(kf.x)
c.append(kf.P)
kf.predict()
kf.update(z) #error on this line
我得到了错误:
ValueError:维度不匹配:数组“cov”的形状为 (1, 1),但 'mean' 是长度为 2 的向量。
这是屏幕上显示的输出
[512 102]
[array([[ 1000., 0., 0., 0.],
[ 0., 1000., 0., 0.],
[ 0., 0., 1000., 0.],
[ 0., 0., 0., 1000.]])]
[array([[ 396.],
[ 187.],
[ 0.],
[ 0.]])]
如果我只取z 的第一个元素,它可以正常工作,但是,这不是我想要的行为。
p, c = [], []
for z in mes:
print (z)
print (c)
print (p)
p.append(kf.x)
c.append(kf.P)
kf.predict()
kf.update(z[0])
更新附加信息
此错误来自multivariate.py in scipy。我似乎无法从(1,1) 更改cov 的形状。我可以通过使用z[0] 来更改mean 的长度,但是,这是不希望的。我想按原样使用z。我还将整个代码发布为gist here。我还将filterpy library 用于卡尔曼滤波器。有一个live python notebook 使用这个卡尔曼滤波器,但是,它不像我的场景那样使用z。
【问题讨论】:
-
能否包含定义
kf和mes的代码(或虚拟代码)?我无法弄清楚你的代码想要做什么。 -
错误本身很简单:在
kf.update()的实现中,有一些操作涉及一个名为c的变量和一个名为mean的变量(我猜这是@ 的参数987654344@),其尺寸需要兼容才能进行操作。可能是矩阵乘法。但我不能说更多,特别是如何修复它,至少不知道您正在使用哪种卡尔曼滤波器实现。对您正在尝试做的事情进行高级描述也会很方便。 -
@maxymoo 我已经在这里发布了整个代码作为要点gist.github.com/Omnipresent/…我正在使用来自这个库的卡尔曼过滤器github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python
-
@DavidZ 我正在使用 github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python 来实现卡尔曼滤波器。我还添加了代码的要点gist.github.com/Omnipresent/… 你是对的。但我似乎无法弄清楚如何更新
cov,使其不是(1,1)。我想如果我能改变它……一切都会奏效。mean的长度为 2,但我想保持这种状态。就像我提到的,如果我将它的长度更改为 1 (z[0]) 一切正常。 -
@Anthony 好的,这有帮助。但是让我建议将这些 cmets 的内容编辑到问题中。即使在 cmets 被删除后,这些信息也很重要。
标签: python-3.x numpy scipy kalman-filter