r - 从R中的两个向量生成这种矩阵的最快方法是什么?

标签 r matrix

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
    }
}
我相信必须有一种更好的方法来从向量 u v 生成矩阵 A 。有人可以帮我吗?

最佳答案

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

关于r - 从R中的两个向量生成这种矩阵的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64115201/

相关文章:

R:循环/函数创建用于比较的矩阵(对比)

r - 在 R 中分解 xts 后保留时间戳

python - pandas - 创建客户移动矩阵

c# - 如何将 FLANN 索引保存到从 C# 中的矩阵构建的磁盘?

java - Java 矩阵相加

r - 如何在 R 中将一个矩阵的 upper.tri 与另一个矩阵的 lower.tri 结合起来?

r - 使用 RecordLinkage 为每个人添加一个带有数字的列

javascript - 通过上下文菜单在 rhandsontable 中添加多行

r - `purrr::map` 到任何类型

python - 通过任何 python 或 R 模块可视化图中重叠的社区