如何在R语言中生成向量/数组所有元素乘积的多维数组?
解决方案
基础需求:两个向量的元素乘积矩阵
用R内置的outer()函数就能直接实现,它专门用于计算两个向量/数组的外积,默认操作就是乘法,完全匹配你的输出要求:
v1 <- c(2, 3, 5) v2 <- c(7, 11) outer(v1, v2)
输出结果:
[,1] [,2] [1,] 14 22 [2,] 21 33 [3,] 35 55
如果需要显式指定乘法操作(方便后续替换为其他运算),可以添加第三个参数:
outer(v1, v2, FUN = "*")
扩展需求:支持多向量/多维数组
1. 处理多个向量
如果要计算3个及以上向量的所有元素乘积,有两种简洁的实现方式:
方法1:expand.grid + apply
适合需要先查看所有元素组合的场景:
# 定义多个向量 v1 <- c(2, 3, 5) v2 <- c(7, 11) v3 <- c(2, 4) # 生成所有元素组合 combos <- expand.grid(v1, v2, v3) # 计算每行的乘积 prod_matrix <- apply(combos, 1, prod) # 转换为对应维度的数组 dim(prod_matrix) <- c(length(v1), length(v2), length(v3))
最终prod_matrix是一个3×2×2的三维数组,每个位置的元素对应三个向量各取一个元素的乘积。
方法2:Reduce + outer
适合直接生成高维数组,无需查看组合细节:
vec_list <- list(v1, v2, v3) # 累积计算外积 result_array <- Reduce(function(x, y) outer(x, y, "*"), vec_list)
2. 处理多维数组
对于不同维度的数组(比如4D、5D、6D数组),outer()和Reduce()的组合同样适用——outer()会自动拼接两个数组的维度,生成更高维的乘积数组:
# 构造测试用多维数组 arr_4d <- array(1:16, dim = c(2, 2, 2, 2)) # 4维数组 arr_5d <- array(1:32, dim = rep(2, 5)) # 5维数组 arr_6d <- array(1:64, dim = rep(2, 6)) # 6维数组 # 计算所有元素的乘积数组 final_arr <- Reduce(function(x, y) outer(x, y, "*"), list(arr_4d, arr_5d, arr_6d)) # 验证维度:4+5+6=15维 dim(final_arr) # 输出:2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
这个方法的核心是outer()会保留输入数组的维度信息,每次外积操作都会将两个输入的维度按顺序拼接,最终生成维度总和等于输入维度之和的数组,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Stefan Lapointe
相关产品推荐
相关产品推荐

