Python 3.x 维度不匹配:数组';cov';形状为(1,1),但';平均值';是长度为2的向量
我正在尝试执行以下代码Python 3.x 维度不匹配:数组';cov';形状为(1,1),但';平均值';是长度为2的向量,python-3.x,numpy,scipy,kalman-filter,Python 3.x,Numpy,Scipy,Kalman Filter,我正在尝试执行以下代码 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),但 “平均值”是长度为2的向量 这是屏幕上显示的输出 [512
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),但
“平均值”是长度为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])
更新其他信息
这个错误来自于。我似乎无法从
(1,1)
更改cov
的形状。我可以通过使用z[0]
来更改mean
的长度,但这不是我想要的。我想按原样使用z
。我还将整个代码作为一个链接发布。我也在使用卡尔曼滤波器的。使用这个卡尔曼滤波器有一个缺点,但是,它不像我的场景那样使用z
使用filterpy库时,您需要自己设置卡尔曼滤波器的初始状态,并且各种矩阵的尺寸需要兼容。如果查看KalmanFilter.update()
方法,您可以跟踪它所做的计算,并对矩阵维度提出以下约束集:
R.shape == (dim_z, dim_z)
H.shape == (dim_z, dim_x)
P.shape == (dim_x, dim_x)
x.shape == (dim_x, 1...)
z.shape == (dim_z, 1...)
其中,1…
可以表示大小为1的尺寸序列,这两种尺寸序列相同。例如,在你的例子中,dim_x==4
和dim_z==2
因此你可以有x.shape==(4,1)
和z.shape==(2,1)
,或者你可以有x.shape==(4,
和z.shape==(2,)
,但你不能混搭。(请注意,KalmanFilter.\uuuuu init\uuuu()
文档似乎为H
提供了错误的所需尺寸)
您的代码在两个位置设置了错误的维度:
- 您将
设置为1x4矩阵,而不是2x4矩阵。(我注意到这里已经注释掉了有效代码。)H
- 将
设置为标量值,而不是2x2矩阵。可以说,卡尔曼滤波器的实现应该考虑到这一点,但它仅在您将R
作为参数传递到R
时才考虑到这一点,而不是在您预先设置它时。(但要小心:如果将update()
设置为标量,代码仍然有效!但我认为这是错误的:将2添加到矩阵的每个元素,而不是将单位矩阵添加2倍。)R
- 当您将
传递给z
方法时,您传递的是一个两元素列表,它被转换为一个两元素向量,而不是一个2x1矩阵,因为它应该与update()
兼容(即4x1)。您可以通过在调用x
之前在循环体中运行update()
z=np.array([z]).T来解决此问题。但我认为有一个更好的方法:保持
不变,只需将z
设为4元素向量:x
我不确定这是否是作者的本意,但(目前)确实如此,而且可能应该如此。我认为在传递之前要求将每个测量值转换为2x1矩阵有点愚蠢x = np.array([measurements[0][0],measurements[0][1],0.,0.])
KalmanFilter
包括一个test\u matrix\u dimensions()
方法,可用于检查设置中的错误。但是我有点矛盾,因为如果你把x
设置为一个4元素向量,正如我在上一段中所建议的那样,它会将其标记为不正确。你能包括定义kf
和mes
的代码(或伪代码)吗?我无法确定您的代码试图执行什么。错误本身很简单:在kf.update()
的实现中,有一个操作涉及一个名为c
的变量和一个名为mean
的变量(我猜这是kf.update()
)的参数,其尺寸必须与操作兼容才能正常工作。可能是矩阵乘法。但我不能说更多,尤其是如何修复它,至少在不知道您正在使用哪个卡尔曼滤波器实现的情况下。对你要做的事情有一个高层次的描述也会很方便。@maxymoo我在这里发布了整个代码作为要点,我使用这个库中的kalman filters@DavidZ我使用github.com/rlabbe/kalman-and-Bayesian-filters-in-Python来实现kalman filters。此外,我还添加了代码的要点,您是正确的。但我似乎不知道如何更新cov
,使其不是(1,1)
。我想如果我能改变这一点……一切都会成功的<代码>平均值的长度为2,但我希望保持这种状态。就像我提到的,如果我把它的长度改为1(z[0]
),一切正常。@Anthony好的,这很有帮助。但我建议将这些评论的内容编辑成问题。如果评论被删除,即使在评论被删除之后,也要有重要的信息。