Tôi muốn tăng tốc độ tính toán của mình và nhận kết quả mà không cần sử dụng vòng lặp chức năng m
. Ví dụ tái sản xuất:R: loại bỏ vòng lặp và mã tăng tốc
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
Trong mỗi lần lặp của vòng lặp for
chúng ta đang đối phó với ma trận không vector, vậy làm thế nào điều này có thể được vector hóa?
@ joel.wilson Mục đích của hàm này là tính tần số cặp của các phần tử. Vì vậy, sau đó chúng tôi có thể ước tính khả năng đưa vào cặp đôi.
Nhờ @Khashaa và @alexis_laz. Điểm chuẩn:
> 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
cốt lõi là gì mục đích của hàm? bạn có thể giải thích điều đó không! –
Ma trận chỉ là vectơ có kích thước. – Tensibai
Nếu tốc độ là mối quan tâm của bạn, thì bạn nên cân nhắc sử dụng các hàm áp dụng. – Ansjovis86