如何不使用for循环实现两个列表对应元素的-a[[i]]*b[[i]]运算
R实现无for循环的列表逐元素运算并生成4×2×2数组
核心思路
无需显式编写for循环,使用R内置的多列表逐元素迭代函数,配对处理两个列表的对应位置元素,运算完成后调整维度得到要求的输出格式。
前置示例数据定义
a = list( c(1, 2), c(2, 7), c(5, 3), c(1, 4)) b = list( matrix(1:4, 2, 2), matrix(7:10, 2, 2), matrix(2:5, 2, 2), matrix(40:43, 2, 2))
实现方案
方案1:Base R原生实现(无需安装额外包)
使用mapply同时遍历两个列表的对应元素,运算完成后调整维度顺序得到4×2×2的数组:
# 逐元素配对运算,默认得到2×2×4的数组 res_array <- mapply(function(vec, mat) -vec * mat, a, b, SIMPLIFY = "array") # 调整维度顺序,把对应i=1~4的第3维移到第1位,得到4×2×2的结果 res_final <- aperm(res_array, c(3, 1, 2)) # 验证维度 dim(res_final) # 输出 4 2 2 # 验证计算结果准确性 all.equal(res_final[1,,], -a[[1]]*b[[1]]) # 输出 TRUE
方案2:purrr包实现(tidyverse生态语法更简洁)
library(purrr) # 配对运算后转数组调整维度 res_final <- map2(a, b, ~ -.x * .y) |> unlist() |> array(dim = c(2, 2, 4)) |> aperm(c(3, 1, 2)) # 验证维度 dim(res_final) # 输出 4 2 2
内容的提问来源于stack exchange,提问作者Ketty
相关产品推荐
相关产品推荐

