将矩阵列表与R中长度不同的数组列表相乘

将矩阵列表与R中长度不同的数组列表相乘,r,R,我想用不同长度的数组乘以矩阵 注意:乘法应该由matches元素进行。 1-我有两个矩阵的列表 2-我有一个数组列表(列表中每个元素有三个数组) 我想做以下工作: 3-将第一个矩阵乘以数组列表第一个元素的3个数组 4-将第二个矩阵乘以数组列表第二个元素的3个数组 那么预期的输出将是: 第一个矩阵乘以3个数组得到1-3个数组 第二次乘法得到2-3个数组 但是,我只有3个数组 我可以手动完成,但我想自动完成 代码如下: set.seed(47) a <- vector('list', 2) f

我想用不同长度的数组乘以矩阵

注意:乘法应该由matches元素进行。 1-我有两个矩阵的列表

2-我有一个数组列表(列表中每个元素有三个数组)

我想做以下工作:

3-将第一个矩阵乘以数组列表第一个元素的3个数组

4-将第二个矩阵乘以数组列表第二个元素的3个数组

那么预期的输出将是:

第一个矩阵乘以3个数组得到1-3个数组

第二次乘法得到2-3个数组

但是,我只有3个数组

我可以手动完成,但我想自动完成

代码如下:

set.seed(47)
a <- vector('list', 2)
for( i in seq_along(a)){       
  a[[i]] <- array(rnorm(5 * 5 * 3), c(5, 5, 3))
}

we1 <- c(0, 0.2, 0.5, 0.5, 0.9,
         0, 0, 0.1, 0.6, 0.9,
         0, 0, 0, 0.9, 0.5,
         0, 0, 0, 0, 0.8,
         0, 0, 0, 0, 0)
we1 <- matrix(we1, 5, 5)
we2 <- c(0, 0.2, 0.5, 0.5, 0.9,
         0, 0, 0.1, 0.6, 0.9,
         0, 0, 0, 0.9, 0.5,
         0, 0, 0, 0, 0.8,
         0, 0, 0, 0, 0)
we2 <- matrix(we2, 5, 5)
we <- list(we1, we2)

x <- vector("list",2)
for(j in 1:2){
for( i in 1:3){
  x[[i]] <-  we[[j]]*a[[j]][[i]]
}
}

有什么帮助吗?

我们可以使用
lappy
Map
。由于
列表
元素的数量对于'a'和'we'是相同的,但其中只有一个是
数组
即'a',我们可以
通过
a[[i]]的第三维度复制
我们

Map(function(x, y) x*replicate(dim(x)[3], y), a, we)

或者在
列表
元素的序列中循环,并在
复制
后执行上述乘法

lapply(seq_along(we), function(i) a[[i]]*array(we[[i]], dim(a[[i]])))
在这里,我们使用
数组
,它将在乘法之前对元素进行循环和后续复制


如果我们正在为循环使用

for(i in seq_along(x)) x[[i]] <- replicate(dim(a[[i]])[3], we[[i]]) * a[[i]]

对于(i在seq_沿着(x))x[[i]]你需要
lapply(seq_沿着(we),函数(i)a[[i]*数组(we[[i]],dim(a[[i]])吗这太神奇了。非常感谢。您正在通过
i
j
索引进行循环,但在
x[[i]]
中仅存储一个索引
i
。这太棒了。请您也提供一下,我们如何按照我在问题中使用的
for
循环的相同想法来做这件事?和往常一样好!
for(i in seq_along(x)) x[[i]] <- replicate(dim(a[[i]])[3], we[[i]]) * a[[i]]