Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 维度不匹配:数组';cov';形状为(1,1),但';平均值';是长度为2的向量_Python 3.x_Numpy_Scipy_Kalman Filter - Fatal编程技术网

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
提供了错误的所需尺寸)

您的代码在两个位置设置了错误的维度:

  • 您将
    H
    设置为1x4矩阵,而不是2x4矩阵。(我注意到这里已经注释掉了有效代码。)
  • R
    设置为标量值,而不是2x2矩阵。可以说,卡尔曼滤波器的实现应该考虑到这一点,但它仅在您将
    R
    作为参数传递到
    update()
    时才考虑到这一点,而不是在您预先设置它时。(但要小心:如果将
    R
    设置为标量,代码仍然有效!但我认为这是错误的:将2添加到矩阵的每个元素,而不是将单位矩阵添加2倍。)
  • 当您将
    z
    传递给
    update()
    方法时,您传递的是一个两元素列表,它被转换为一个两元素向量,而不是一个2x1矩阵,因为它应该与
    x
    兼容(即4x1)。您可以通过在调用
    update()
    之前在循环体中运行
    z=np.array([z]).T来解决此问题。但我认为有一个更好的方法:保持
    z
    不变,只需将
    x
    设为4元素向量:

    x = np.array([measurements[0][0],measurements[0][1],0.,0.])
    
    我不确定这是否是作者的本意,但(目前)确实如此,而且可能应该如此。我认为在传递之前要求将每个测量值转换为2x1矩阵有点愚蠢


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好的,这很有帮助。但我建议将这些评论的内容编辑成问题。如果评论被删除,即使在评论被删除之后,也要有重要的信息。