Performance 通过交错向量加速矩阵的组装?

Performance 通过交错向量加速矩阵的组装?,performance,r,matrix,Performance,R,Matrix,我有两个任意长度相等的向量 a <- c(0.8,0.8,0.8) b <- c(0.4,0.4,0.4) n <- length(a) 我目前使用 x <- matrix(rep(as.vector(rbind( c(1-a,a), c(b, 1-b))), n), ncol=n*2, byrow=TRUE

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

a <- c(0.8,0.8,0.8) 
b <- c(0.4,0.4,0.4)
n <- length(a)
我目前使用

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

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

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。

我不认为有什么办法可以替代
matrix
成为您的配置文件中最慢的部分,但通过优化其余部分,您肯定可以节省一点时间。例如:

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

我们是否可以假定
a
的所有元素彼此相等,而
b
的所有元素彼此相等?不,
a
b
的元素并不总是相等的。谢谢你的澄清。应该是
n
。修正。我还可以假设您实际上关心更大矩阵的性能,或者
n==3
对您来说是一个重要的用例吗?一般来说,元素的数量很小(
n
为2-20),但操作重复了很多次。在我的机器上,这几乎是OP版本的两倍。奇怪。在我的机器上,
system.time(replicate(100000,f(a,b,n)))
需要2秒,
system.time(replicate(100000,g(a,b,n))
需要3.5秒,其中g是诺姆写的。不过,你的时间不到一秒。很好的优化。请注意,您不能在CRAN上托管的包中使用
.Internal
。看到了吧。这就是我说我不会推荐它的部分原因。我最担心的是,R开发人员可以自由地对这些内部构件进行更改,这可能会导致这些代码在将来被破坏。我只是想直截了当通过使用
编译器::cmpfun()
编译函数,我获得了一些额外的速度。不如使用。内部,但更好。
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))
}
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