gpt4 book ai didi

R - 三元函数的矢量化实现

转载 作者:行者123 更新时间:2023-12-04 09:33:17 24 4
gpt4 key购买 nike

我有三个向量 X , YZ等长n .我需要创建一个 n x n x n函数数组 f(X[i],Y[j],Z[k]) .执行此操作的直接方法是依次循环遍历 3 个向量中的每一个的每个元素。然而,计算数组所需的时间随着 n 呈指数增长。 .有没有办法使用矢量化操作来实现这一点?

编辑:正如评论中提到的,我添加了一个简单的例子来说明需要什么。

set.seed(1)
X = rnorm(10)
Y = seq(11,20)
Z = seq(21,30)

F = array(0, dim=c( length(X),length(Y),length(Z) ) )
for (i in 1:length(X))
for (j in 1:length(Y))
for (k in 1:length(Z))
F[i,j,k] = X[i] * (Y[j] + Z[k])

谢谢。

最佳答案

您可以使用嵌套 outer :

set.seed(1)
X = rnorm(10)
Y = seq(11,20)
Z = seq(21,30)

F = array(0, dim = c( length(X),length(Y),length(Z) ) )
for (i in 1:length(X))
for (j in 1:length(Y))
for (k in 1:length(Z))
F[i,j,k] = X[i] * (Y[j] + Z[k])

F2 <- outer(X, outer(Y, Z, "+"), "*")

> identical(F, F2)
[1] TRUE

一个微基准测试,包括 expand.grid Nick K 提出的解决方案:
X = rnorm(100)
Y = seq(1:100)
Z = seq(101:200)

forLoop <- function(X, Y, Z) {
F = array(0, dim = c( length(X),length(Y),length(Z) ) )
for (i in 1:length(X))
for (j in 1:length(Y))
for (k in 1:length(Z))
F[i,j,k] = X[i] * (Y[j] + Z[k])
return(F)
}

nestedOuter <- function(X, Y, Z) {
outer(X, outer(Y, Z, "+"), "*")
}

expandGrid <- function(X, Y, Z) {
df <- expand.grid(X = X, Y = Y, Z = Z)
G <- df$X * (df$Y + df$Z)
dim(G) <- c(length(X), length(Y), length(Z))
return(G)
}

library(microbenchmark)
mbm <- microbenchmark(
forLoop = F1 <- forLoop(X, Y, Z),
nestedOuter = F2 <- nestedOuter(X, Y, Z),
expandGrid = F3 <- expandGrid(X, Y, Z),
times = 50L)

> mbm
Unit: milliseconds
expr min lq mean median uq max neval
forLoop 3261.872552 3339.37383 3458.812265 3388.721159 3524.651971 4074.40422 50
nestedOuter 3.293461 3.36810 9.874336 3.541637 5.126789 54.24087 50
expandGrid 53.907789 57.15647 85.612048 88.286431 103.516819 235.45443 50

关于R - 三元函数的矢量化实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30823236/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com