当前位置 : 主页 > 网络安全 > 测试自动化 >

性能 – 通过交错向量加速组装矩阵?

来源:互联网 收集:自由互联 发布时间:2021-06-22
我有两个任意和相等长度的向量 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-
我有两个任意和相等长度的向量

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)

我怎样才能加快这个操作?分析表明矩阵花费的时间最多:

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
我不认为矩阵是你的配置文件中最慢的部分,但你可以通过优化其余部分来节省一点时间.例如:

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
网友评论