Chciałbym przyśpieszyć moje obliczenia i uzyskać wyniki bez użycia pętli w funkcji m
. Powtarzalny przykład:R: pozbywanie się pętli for i kod przyspieszenia
N <- 2500
n <- 500
r <- replicate(1000, sample(N, n))
m <- function(r, N) {
ic <- matrix(0, nrow = N, ncol = N)
for (i in 1:ncol(r)) {
p <- r[, i]
ic[p, p] <- ic[p, p] + 1
}
ic
}
system.time(ic <- m(r, N))
# user system elapsed
# 6.25 0.51 6.76
isSymmetric(ic)
# [1] TRUE
W każdej iteracji pętli for
mamy do czynienia z matrycy nie wektorze, tak jak to może być Vectorized?
@ joel.wilson Celem tej funkcji jest obliczenie parami częstotliwości elementów. Tak więc możemy oszacować prawdopodobieństwa włączenia parami.
Dzięki @Khashaa i @alexis_laz. Benchmarki:
> require(rbenchmark)
> benchmark(m(r, N),
+ m1(r, N),
+ mvec(r, N),
+ alexis(r, N),
+ replications = 10, order = "elapsed")
test replications elapsed relative user.self sys.self user.child sys.child
4 alexis(r, N) 10 4.73 1.000 4.63 0.11 NA NA
3 mvec(r, N) 10 5.36 1.133 5.18 0.18 NA NA
2 m1(r, N) 10 5.48 1.159 5.29 0.19 NA NA
1 m(r, N) 10 61.41 12.983 60.43 0.90 NA NA
co jest rdzeniem cel tej funkcji? mógłbyś to wyjaśnić! –
Macierz jest po prostu wektorem z wymiarami. – Tensibai
Jeśli zależy Ci na szybkości, powinieneś rozważyć użycie funkcji stosowania. – Ansjovis86