【问题标题】:add a vector to all rows of a matrix将向量添加到矩阵的所有行
【发布时间】:2021-10-08 16:11:01
【问题描述】:

我正在最大化似然函数并尝试减少循环。 我想将向量(要估计的参数)添加到矩阵(数据)的所有行中。向量的长度等于矩阵的列。 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?

期望的输出

        [,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

错误输出

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

【问题讨论】:

  • t(apply(b, 1 , function(x) x+a))

标签: r matrix vectorization


【解决方案1】:

使用outer()collapse::TRA()These 解决方案比使用repsweep 快得多。

【讨论】:

    【解决方案2】:

    我们可以使用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
    

    或者更快的选择是使用rep

    b + rep(a, each = nrow(b))
    

    或使用sweep

    sweep(b, 2, a, "+")
    

    基准测试

    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 
    

    【讨论】:

    • 我尝试了b+a[col(b)],当数据很大时,它似乎很慢。我会仔细检查我的代码以获得反馈。
    • @Phdaml 在这种情况下,您可以尝试使用rep,即b + rep(a, each = nrow(b)) 应该更快。我更新了帖子
    • @Phdaml 我使用8000*5000 更新了一些基准。 sweeprep 似乎更快。
    猜你喜欢
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多