【发布时间】:2017-11-14 15:33:08
【问题描述】:
我正在构建一个卡尔曼滤波器来优化 arma 模型,现在我已经为 arma(1,1) 制作了它。为了优化似然函数,我需要存储所有创新值及其协方差矩阵。 我是 julia 的新手,我主要使用 r。 这是我的代码:
for i=1:length(y)
x=A*x
Vt=y[i]-Z'x
Ft=Z'*P*Z
Kt=(A*P*Z)/Ft
x=A*x+Kt*Vt
P=A*(P-(P*Z*Z'*P)/Ft)*A'+R*R'*sigma^2
end
而且它正在工作。如果我尝试以这种方式存储 Vt 值:
v= zeros(1:1000)
for i=1:length(y)
x=A*x
Vt=y[i]-Z'x
v[i]=Vt
Ft=Z'*P*Z
Kt=(A*P*Z)/Ft
x=A*x+Kt*Vt
P=A*(P-(P*Z*Z'*P)/Ft)*A'+R*R'*sigma^2
end
我收到一条错误消息:“MethodError: Cannot convert an object of type Array{Float64,1} to an object of Int64”
我尝试以不同的方式进行操作,例如使用数据帧等,但我不断收到有关不可转换对象类型的错误,我只设法将 Vt 的最后一个值保存为数据帧,但我需要它的值所有的循环。
我该如何解决这个问题?我认为这很简单,但我不习惯编程。谢谢!
【问题讨论】:
-
问题是Vt是一个值的Vector,而不是一个单一的值,所以你不能把它放到v的一个元素中。如果你知道Vt总是一个长度为1的Vector,你可以用
v[i]=Vt[1]替换v[i]=Vt -
谢谢!如果我“手动”执行它似乎工作正常,但是当我启动循环时它显示“InexactError()”,我不知道原因......
-
将
zeros(1:1000)更改为zeros(1000)。后者创建一个 1000 长的零 Float64 向量。前者结果创建了一个 Int64 向量。 -
谢谢,现在可以正常使用了!很有帮助!
-
很好 - 将
AbstractVectora传递给zeros调用zeros(typeof(a), length(a)),通常很方便,但有时令人惊讶。
标签: julia