r - 从 R 中的两个向量生成这样一个矩阵的最快方法是什么?
问题描述
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
推荐阅读
- airflow - 有没有办法通过 SimpleHttpOperator 在 Airflow 中通过 REST 上传文件?
- vue.js - Vue路由器,无法读取未定义的属性“推送”
- javascript - 函数返回自身,意外行为
- html - 如何在具有响应式模板的相对包装器中将 div 位置绝对设置到右侧?
- node.js - 如何在 LoopBack 4 中进行数据库迁移
- php - 致命错误:未捕获的TypeError:safeQuery()的返回值必须是数组或null类型,返回bool
- python - StreamConn unsubscribe() 和 close() 似乎不起作用(AlpacaAPI),寻求意见
- javascript - 删除和添加新的 HTML 标记
- python - Matlab 上的 bwlabeln 和 Python 上的 skimage.measure.label 之间的性能差异?
- javascript - javascript函数currying,传递一个函数,通过currying传递更高的函数参数