将向量添加到矩阵的所有行

New*_*ias 3 r matrix vectorization

我正在最大化似然函数并试图减少循环.我想将向量(要估计的参数)添加到矩阵(数据)的所有行.向量的长度等于矩阵的列. a+b会得到错误的结果,因为R的循环规则是按列而不是行.

a<-c(1,2,0,0,0)  # parameters to be optimized
b<-matrix(1,ncol=5,nrow=6) # data
t(a+t(b)) # my code would work, anything more intuitive?
Run Code Online (Sandbox Code Playgroud)

期望的输出

        [,1] [,2] [,3] [,4] [,5]
    [1,]    2    3    1    1    1
    [2,]    2    3    1    1    1
    [3,]    2    3    1    1    1
    [4,]    2    3    1    1    1
    [5,]    2    3    1    1    1
    [6,]    2    3    1    1    1
Run Code Online (Sandbox Code Playgroud)

错误输出

a+b
    [,1] [,2] [,3] [,4] [,5]
[1,]    2    3    1    1    1
[2,]    3    1    1    1    2
[3,]    1    1    1    2    3
[4,]    1    1    2    3    1
[5,]    1    2    3    1    1
[6,]    2    3    1    1    1
Run Code Online (Sandbox Code Playgroud)

akr*_*run 9

我们可以col用来复制'a'元素

b + a[col(b)]
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    2    3    1    1    1
#[2,]    2    3    1    1    1
#[3,]    2    3    1    1    1
#[4,]    2    3    1    1    1
#[5,]    2    3    1    1    1
#[6,]    2    3    1    1    1
Run Code Online (Sandbox Code Playgroud)

或者更快的选择是使用 rep

b + rep(a, each = nrow(b))
Run Code Online (Sandbox Code Playgroud)

或者使用 sweep

sweep(b, 2, a, "+")
Run Code Online (Sandbox Code Playgroud)

基准

set.seed(24)
b <- matrix(sample(0:9, 8000*5000, replace=TRUE), ncol=5000)
a <- sample(0:3, 5000, replace=TRUE)
system.time(b + a[col(b)])
#  user  system elapsed 
#  1.08    0.06    1.14 
system.time(b + rep(a, each = nrow(b)))
#   user  system elapsed 
#   0.83    0.03    0.86 

system.time(t(a+t(b)))
#   user  system elapsed 
#   1.14    0.03    1.17 

system.time(sweep(b, 2, a, "+"))
#  user  system elapsed 
#  0.62    0.06    0.69 
Run Code Online (Sandbox Code Playgroud)

  • @Phdaml在这种情况下,您可以尝试使用“rep”,即“b + rep(a,each = nrow(b))”应该更快。我更新了帖子 (2认同)