R中的多重外积

Min*_*ark 4 arrays r matrix

假设我们有四个向量,每个向量都是三维的:

v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
v3 <- c(2, 2, 2)
v4 <- c(3, 2, 1)
Run Code Online (Sandbox Code Playgroud)

我的目标是创建一个包含每个向量的外积的数组:

tmp_array <- array(NA, dim = c(3, 3, 4))
tmp_array[, , 1] <- outer(v1, v1)
tmp_array[, , 2] <- outer(v2, v2)
tmp_array[, , 3] <- outer(v3, v3)
tmp_array[, , 4] <- outer(v4, v4)
Run Code Online (Sandbox Code Playgroud)

我们现在拥有的是一个包含四个向量的矩阵:

tmp_matrix <- rbind(v1, v2, v3, v4)
Run Code Online (Sandbox Code Playgroud)

我想tmp_array通过紧凑地使用来生成tmp_matrix

我尝试过outer(t(tmp_matrix), tmp_matrix)outer(tmp_matrix, tmp_matrix)等等,但这些都不是解决方案。

如何才能tmp_array紧凑地创建?(即不使用循环)

Dar*_*sai 6

您可以使用apply(..., simplify = FALSE)simplify2array()将外积矩阵列表转换为 3 维数组。

simplify2array(apply(tmp_matrix, 1, \(v) outer(v, v), simplify = FALSE))
Run Code Online (Sandbox Code Playgroud)
, , v1

     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    4    6
[3,]    3    6    9

, , v2

     [,1] [,2] [,3]
[1,]   16   20   24
[2,]   20   25   30
[3,]   24   30   36

, , v3

     [,1] [,2] [,3]
[1,]    4    4    4
[2,]    4    4    4
[3,]    4    4    4

, , v4

     [,1] [,2] [,3]
[1,]    9    6    3
[2,]    6    4    2
[3,]    3    2    1
Run Code Online (Sandbox Code Playgroud)

  • 应该指出,根据文档,当参数 `simplify == TRUE` 时,`simplify2array` 由 ** `sapply` 调用,但不由 `apply` 调用 (2认同)