【问题标题】:What is the fastest way to generate such a matrix from two vectors in R?从 R 中的两个向量生成这样一个矩阵的最快方法是什么?
【发布时间】:2020-09-29 16:47:48
【问题描述】:
u <- rnorm(1000)
v <- c(1,2,3)

A <- matrix(0,nrow=3,ncol=1000)
for (i in 1:3)
{
  for (j in 1:1000)
    {
       A[i,j] <- (u[j]-v[i])^2
    }
}

我相信一定有更好的方法来从向量 uv 生成矩阵 A。有人可以帮我吗?

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我们可以使用outer

    u <- rnorm(10)
    v <- c(1,2,3)
    
    B <- t(outer(u, v, `-`)^2)
    identical(A, B)
    #[1] TRUE
    

    基准测试:

    library(microbenchmark)
    
    u <- rnorm(100000)
    v <- rnorm(100)
    
    p1 = function(){
      A <- matrix(0,nrow=length(v),ncol=length(u))
      for (i in 1:length(v))
      {
        for (j in 1:length(u))
        {
          A[i,j] <- (u[j]-v[i])^2
        }
      }
    }
    
    
    p2 = function(){
      B <- t(outer(u, v, `-`)^2)
    }
    
    microbenchmark(p1(),p2(),times = 10)
    
    #Unit: milliseconds
    # expr       min        lq      mean    median        uq       max neval
    # p1() 3359.8119 3367.9753 3383.0087 3374.1323 3397.3018 3420.7159    10
    # p2()  326.7757  352.0144  459.9654  386.4121  584.3815  694.2599    10
    

    【讨论】:

    • 我的错,真的很抱歉。感谢您提供正确的基准。
    • 非常感谢!
    猜你喜欢
    • 2021-01-14
    • 2017-10-30
    • 1970-01-01
    • 2021-05-29
    • 2016-02-06
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2012-01-08
    相关资源
    最近更新 更多