2017-11-13 6 views
1

Ich baue einen Kalman-Filter, um Arma-Modelle zu beenden, jetzt habe ich es für ein Arma (1,1) gemacht. Um die Likelihood-Funktion zu optimieren, muss ich alle Werte der Innovationen und der Kovarianzmatrix speichern. Ich bin neu in Julia und ich habe meistens r. Das ist mein Code:Wie füllt man einen Vektor mit den Ergebnissen einer for-Schleife in Julia?

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 

Und es funktioniert. Wenn ich versuche, die Vt-Werte auf diese Weise zu speichern:

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 

Ich erhalte eine Fehlermeldung der nah sagt: „MethodError: Kann nicht convert ein Objekt vom Typ Array {Float64,1} auf ein Objekt vom Typ Int64“ Ich habe versucht, es auf verschiedene Arten zu tun, wie die Verwendung von Dataframs etc, aber ich bekomme immer wieder Fehler über den Typ der Objekte nicht konvertierbar, ich habe nur den letzten Wert von Vt als Datenrahmen gespeichert, aber ich brauche es Werte während der gesamten Schleife. Wie könnte ich dieses Problem lösen? Ich denke, dass es etwas wirklich einfaches ist, aber ich bin nicht gewohnt zu programmieren. Vielen Dank!

+0

Das Problem ist, dass Vt ein Vektor von Werten ist, nicht ein einzelner Wert, so dass Sie es nicht in ein Element von v einfügen können. Wenn Sie wissen, dass Vt immer ein Vektor der Länge 1 ist, können Sie 'ersetzen v [i] = Vt' mit 'v [i] = Vt [1]' –

+0

Vielen Dank! Es scheint gut zu funktionieren, wenn ich es "manuell" mache, aber es sagt "InexactError()" wenn ich die Schleife lese, habe ich keine Ahnung von den Gründen ... –

+0

Ändere die 'Nullen (1: 1000)' in ' Nullen (1000) '. Letzteres erzeugt einen Float64-Vektor mit einer Länge von 1000 Nullen. Ersteres ergibt einen Int64-Vektor. –

Antwort

2

erneute Hinweis auf Antworten von Kommentaren:

Ändern der zeros(1:1000)-zeros(1000). Und stellen Sie sicher, dass RHS und LHS der Zuweisung v[i]=Vt die gleiche Form haben, indem Sie sie durch v[i]=Vt[1] ersetzen oder sicherstellen, dass Vt ein Skalar ist.

Übergabe eines AbstractVector a (diesmal a war 1:1000) zu zeros Anrufe zeros(typeof(a), length(a)), die oft praktisch ist aber überraschend manchmal.

Verwandte Themen