Summe in R innerhalb der Funktion
Schreibe ich eine Funktion in R zu berechnen, werden die Werte der beiden Vektoren, bevor Sie voran gehen und tun, einige andere ausgefallene Sachen. Die beiden Vektoren R und B sind gegeben durch die folgenden Summen:
und
wobei $\beta$ ist eine Konstante und die ts an die Funktion übergeben und das auftreten mal ein Ereignis. Also, im Grunde, wenn das i-te Ereignis Eintritt (zum Zeitpunkt t_i
), berechne ich B(i)
und R(i)
die Summen getan, mit all den vorherigen auftreten mal t_k
meinem Fall bis zu diesem moment.
Ich würde gerne kommen mit etwas effizienter als das
r <- rep(0,length(t))
for(i in 2:length(t)) {
r[i] <- sum((t[i]-t[which(t<t[i])])*exp(beta*(t[i]-t[which(t<t[i])])))
}
b <- rep(0,length(t))
for(i in 2:length(t)) {
b[i] <- sum(((t[i]-t[which(t<t[i])])^2)*exp(beta*(t[i]-t[which(t<t[i])])))
}
was im Grunde berechnet alles doppelt, obwohl der einzige Unterschied zwischen den beiden ist der Platz vor der Exponentialfunktion. Irgendwelche Ideen? Danke!
t
typischerweise werden? Wenn es nicht zu groß, Sie könnte verwenden outer
statt for
Schleifen.Sie haben einfach nicht ein Beispiel für die Vektor -
t
, so dass R glaubt, dass Sie wollen Teilmenge der Funktion t
.Uhhhh, diese Schleifen sind hässlich. Vektorisierung ist der Name des Spiels... sollten Sie einen dataframe mit den Spalten, t_i und t_k. Dann berechnen Sie den Unterschied. Danach, verwenden Sie ifelse auf den Unterschied. Diese kann getan werden, ohne irgendwelche loops und berechnet werden soll sofort.
t
ist ziemlich gross: mehrere hundert tausend Einträge... @Peter: ich bin mir nicht sicher, ob ich verstehe: sollte nur zwei Spalten? Auch im Fall, dass es einen Unterschied macht, ich habe gerade in der Frage der definition von dem, was meine ts
sind.Wenn das wirklich beabsichtigt ist, eine Summe über alle Elemente der
tk
weniger als ti
, dann ist es nicht eine gut definierte operation. Soll dies eine Summe von über ti[j]<tk[j]
? Was ist der index, über die Sie möchten, um die Summe?InformationsquelleAutor g_puffo | 2014-09-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wegen der Größe der input-Vektor, kann man nicht besser tun, als mit einer expliziten Schleife (sonst müssten Sie zu viel Speicher). Aber natürlich, du brauchst nur eine Schleife und das problem ist peinlich parallel.
Dies ist mein Verständnis des Problems:
Wenn das noch zu langsam ist, können Sie versuchen, es umzusetzen mit Rcpp.
seq_along
,seq_len
, etc...) undforeach
ist eine sehr interessante Art und Weise der Umsetzung einer Schleife. Danke!InformationsquelleAutor Roland
Wenn ich verstehe deine Gleichungen richtig, Sie brauchen nur zu berechnen
t[i] - t[1:i-1]
separat zuerst, und dann verwenden Sie diese Werte in allen nachfolgenden Berechnungen.InformationsquelleAutor rmccloskey