2017-11-13 8 views
1

私はarmaモデルを凌駕するカルマンフィルタを構築しています。今はarma(1,1)のために作成しました。尤度関数を最適化するためには、イノベーションのすべての値とその共分散行列を保存する必要があります。 私はジュリアに新しいですし、私はほとんどrを使用しました。juliaのforループの結果をベクトルに入力するにはどうすればよいですか?

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 

を私が言うthtaエラーメッセージが表示されます:「MethodErrorを:できないconvertタイプのInt64のオブジェクトへのArray型のオブジェクト{Float64,1}」 私はデータフレームなどを使用するのとは違ったやり方でしようとしましたが、コンバーチブルではないオブジェクトのタイプに関するエラーを受け取り続け、Vtの最後の値をデータフレームとして保存することしかできませんでした。すべてのループ中の値。 どうすればこの問題を解決できますか?私はそれが本当にシンプルだと思うが、私はプログラムに慣れていない。ありがとうございました!コメントから

+0

問題は、Vtは単一の値ではなく値のベクトルなので、vの要素に入れることはできません.Vtが常に長さ1のベクトルであることがわかっている場合は、 v [i] = Vt'で 'v [i] = Vt [1]' –

+0

ありがとう!私はそれを "手動で"行うとうまくいくように見えますが、ループを止めたときに "InexactError()"と表示されています。理由は分かりません。 –

+0

'0(ゼロ)ゼロ(1000) '。後者は、1000の長いゼロFloat64ベクトルを作成します。前者はInt64ベクターを作成することが判明しました。 –

答えて

2

改めて表明答え:

変更zeros(1000)からzeros(1:1000)。割り当てv[i]=VtのRHSとLHSがv[i]=Vt[1]に置き換えられるか、またはVtがスカラであることを確認して同じ形状/タイプであることを確認してください。

時々しばしば便利しかし、驚くべきことであるzeros通話zeros(typeof(a), length(a))に(この時点a1:1000た)AbstractVector aを渡します。

関連する問題