4

任意で等しい長さの 2 つのベクトルがあります。

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

2nこれらから、次の形式の2n行列を組み立てる必要があります。

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 に答える