假设我们有四个向量,每个向量都是三维的:
v1 <- c(1, 2, 3)
v2 <- c(4, 5, 6)
v3 <- c(2, 2, 2)
v4 <- c(3, 2, 1)
我的目标是创建一个包含每个向量的外积的数组:
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)
我们现在得到的是一个包含四个向量的矩阵:
tmp_matrix <- rbind(v1, v2, v3, v4)
我想用tmp_matrix
来生成tmp_array
。
我试过outer(t(tmp_matrix), tmp_matrix)
,outer(tmp_matrix, tmp_matrix)
等等,但这些都不是解决方案。
如何创建tmp_array
?(即不使用循环)
4条答案
按热度按时间pxy2qtax1#
可以使用
apply(..., simplify = FALSE)
和simplify2array()
将外积矩阵列表转换为三维数组。jucafojl2#
使用
mapply()
,你可以通过将"array"
参数传递给simplify
参数来获得simplify2array()
,你可以这样实现:huwehgph3#
您可以使用
tcrossprod
(而不是outer
)+dim<-
泛化
为了概括这些情况(不仅仅是
v1
、v2
、v3
和v4
),我们可以构建一个自定义函数f
,如下所示使得
jobtbby34#
我相信你可以尝试一下R中的sweep()函数。在这里可以看到一些使用sweep()的例子,https://www.r-bloggers.com/2022/07/how-to-use-the-sweep-function-in-r/。
它是对数组或矩阵执行元素操作的函数。在这种情况下,您可以使用它将tmp_matrix的每一列与其自身相乘,并将结果分配给tmp_array的相应切片。我认为您可以通过指定2作为MARGIN参数来指示该操作应该沿着列执行。
代码如下所示: