【问题标题】:How to fill a vector with the results of a for loop in julia?如何用 julia 中的 for 循环的结果填充向量?
【发布时间】: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 向量。
  • 谢谢,现在可以正常使用了!很有帮助!
  • 很好 - 将 AbstractVector a 传递给 zeros 调用 zeros(typeof(a), length(a)),通常很方便,但有时令人惊讶。

标签: julia


【解决方案1】:

重申来自 cmets 的答案:

zeros(1:1000) 更改为zeros(1000)。并确保分配 v[i]=Vt 的 RHS 和 LHS 具有相同的形状/类型,方法是替换为 v[i]=Vt[1] 或确保 Vt 是一个标量。

AbstractVector a(这次a1:1000)传递给zeros 调用zeros(typeof(a), length(a)),这通常很方便,但有时令人惊讶。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2016-03-09
    • 2021-03-16
    • 2019-05-27
    • 1970-01-01
    相关资源
    最近更新 更多