4

我有两个任意且相等长度的向量

a <- c(0.8,0.8,0.8) 
b <- c(0.4,0.4,0.4)
n <- length(a)

从这些我需要组装一个形式2n2n矩阵:

x = [1-a1  b1    1-a2  b2    1-a3  b3
     a1    1-b1  a2    1-b2  a3    1-b3
     1-a1  b1    1-a2  b2    1-a3  b3
     a1    1-b1  a2    1-b2  a3    1-b3
     1-a1  b1    1-a2  b2    1-a3  b3
     a1    1-b1  a2    1-b2  a3    1-b3]

我目前使用

x <- matrix(rep(as.vector(rbind(
                          c(1-a,a), 
                          c(b, 1-b))),
                n),
            ncol=n*2, byrow=TRUE)

如何加快此操作?分析表明这matrix是花费最多的时间:

Rprof("out.prof")
for (i in 1:100000) {

x <- matrix(rep(as.vector(rbind(
  c(1-a,a), 
  c(b, 1-b))),
                n),
            ncol=n*2, byrow=TRUE)

}
Rprof(NULL)
summaryRprof("out.prof")

##$by.self
##            self.time self.pct total.time total.pct
##"matrix"         1.02    63.75       1.60    100.00
##"rbind"          0.24    15.00       0.36     22.50
##"as.vector"      0.18    11.25       0.54     33.75
##"c"              0.10     6.25       0.10      6.25
##"*"              0.04     2.50       0.04      2.50
##"-"              0.02     1.25       0.02      1.25
##
##$by.total
##            total.time total.pct self.time self.pct
##"matrix"          1.60    100.00      1.02    63.75
##"as.vector"       0.54     33.75      0.18    11.25
##"rbind"           0.36     22.50      0.24    15.00
##"c"               0.10      6.25      0.10     6.25
##"*"               0.04      2.50      0.04     2.50
##"-"               0.02      1.25      0.02     1.25
##
##$sample.interval
##[1] 0.02
##
##$sampling.time
##[1] 1.6
4

2 回答 2

3

我认为除了matrix成为您个人资料中最慢的部分之外没有其他选择,但您绝对可以通过优化其余部分来节省一点时间。例如:

x <- matrix(rbind(c(1-a,a), c(b, 1-b)), 2*n, 2*n, byrow=TRUE)

此外,虽然我不推荐它,但您可以通过使用内部矩阵函数节省一点额外时间:

x <- .Internal(matrix(rbind(c(1-a,a), c(b, 1-b)),
                      n*2, n*2, TRUE, NULL, FALSE, FALSE))

以下是一些基准:

benchmark(
   method0 = matrix(rep(as.vector(rbind(c(1-a,a), c(b, 1-b))), n),
                    ncol=n*2, byrow=TRUE),
   method1 = matrix(rbind(c(1-a,a), c(b, 1-b)), 2*n, 2*n, byrow=TRUE),
   method2 = .Internal(matrix(rbind(c(1-a,a), c(b, 1-b)),
                              n*2, n*2, TRUE, NULL, FALSE, FALSE)),
   replications = 100000,
   order = "relative")

#      test replications elapsed relative user.self sys.self user.child sys.child
# 3 method2       100000    1.00     1.00      0.99        0         NA        NA
# 2 method1       100000    1.13     1.13      1.12        0         NA        NA
# 1 method0       100000    1.46     1.46      1.46        0         NA        NA
于 2012-11-12T21:53:45.717 回答
0

我通过以下方式获得了一个小的加速:

f = function(a, b, n){
  z = rbind(
    c(rbind(1 - a, b)),
    c(rbind(a, 1 - b))
  )

  do.call(rbind, lapply(1:n, function(i) z))
}

我会继续寻找。

编辑我很难过。如果这还不够好,我建议内联一些 rcpp。

于 2012-11-12T20:55:16.950 回答