Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- dis_multi <- function(x, y) rowSums(x != y)
- dis <- function(x, y) sum(x != y)
- x <- matrix(rbinom(30000, 3, 0.7), 3000, 10)
- st <- proc.time()
- distMat <- matrix(0, nrow(x), nrow(x))
- for (i in 1:(nrow(x)-2))
- distMat[i, (i+1):nrow(x)] <- dis_multi(x[(i+1):nrow(x), ], t(matrix(x[i,], ncol(x), nrow(x)-i)))
- distMat[nrow(x), nrow(x)-1] <- dis(x[nrow(x)-1, ], x[nrow(x), ])
- distMat <- distMat + t(distMat)
- proc.time() - st
- # user system elapsed
- # 1.10 0.04 1.16
- st <- proc.time()
- distMat2 <- matrix(0, nrow(x), nrow(x))
- for (i in 1:(nrow(x)-1))
- {
- for (z in (i+1):nrow(x))
- {
- distMat2[i, z] <- dis(x[i, ], x[z, ])
- }
- }
- distMat2 <- distMat2 + t(distMat2)
- proc.time() - st
- # user system elapsed
- # 14.45 0.16 15.07
- all.equal(distMat, distMat2) # TRUE
- library(Rcpp)
- library(RcppArmadillo)
- sourceCpp(code = '
- // [[Rcpp::depends(RcppArmadillo)]]
- #include <RcppArmadillo.h>
- using namespace Rcpp;
- using namespace arma;
- // [[Rcpp::export]]
- mat dis_cal_f(mat x) {
- mat distMat(x.n_rows, x.n_rows);
- for (uword i = 0; i < x.n_rows-1; i++)
- {
- for (uword j = i+1; j < x.n_rows; j++)
- distMat(i, j) = sum(x.row(i) != x.row(j));
- }
- return symmatu(distMat);
- }')
- st <- proc.time()
- distMat3 <- dis_cal_f(x)
- proc.time() - st
- # user system elapsed
- # 0.22 0.01 0.24
- all.equal(distMat, distMat3) # TRUE
Advertisement
Add Comment
Please, Sign In to add comment