我想将矩阵乘以不同长度的数组。
1-我有两个矩阵列表。
2-我有一个数组列表(列表中每个元素有三个数组)。
我想做以下事情:
3-将第一个矩阵乘以数组列表第一个元素的3个数组。
4-将第二个矩阵乘以数组列表的第二个元素的3个数组。
然后预期的输出是:
1-3个阵列来自第一个矩阵与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]]
}
}
输出:
> x
[[1]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.0000000 0.00000000 0.0000000 0.0000000 0
[2,] -0.1878045 0.00000000 0.0000000 0.0000000 0
[3,] -0.4695112 -0.09390224 0.0000000 0.0000000 0
[4,] -0.4695112 -0.56341343 -0.8451202 0.0000000 0
[5,] -0.8451202 -0.84512015 -0.4695112 -0.7512179 0
[[2]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.0000000 0.00000000 0.0000000 0.0000000 0
[2,] 0.1676886 0.00000000 0.0000000 0.0000000 0
[3,] 0.4192215 0.08384429 0.0000000 0.0000000 0
[4,] 0.4192215 0.50306575 0.7545986 0.0000000 0
[5,] 0.7545986 0.75459863 0.4192215 0.6707543 0
[[3]]
[,1] [,2] [,3] [,4] [,5]
[1,] 0.0000000 0.00000000 0.0000000 0.0000000 0
[2,] 0.1058393 0.00000000 0.0000000 0.0000000 0
[3,] 0.2645984 0.05291967 0.0000000 0.0000000 0
[4,] 0.2645984 0.31751803 0.4762770 0.0000000 0
[5,] 0.4762770 0.47627705 0.2645984 0.4233574 0
请帮忙吗?
答案 0 :(得分:1)
我们可以使用lapply
或Map
。由于“a”和“我们”的list
元素数量相同,但只有一个元素是array
,即“a”,我们可以replicate
'我们'到a[[i]]
Map(function(x, y) x*replicate(dim(x)[3], y), a, we)
或者循环遍历list
元素的序列,并在replication
之后进行乘法,如上所述
lapply(seq_along(we), function(i) a[[i]]*array(we[[i]], dim(a[[i]])))
在这里,我们使用array
,它将在乘法之前回收元素和后续复制。
如果我们使用for
循环
for(i in seq_along(x)) x[[i]] <- replicate(dim(a[[i]])[3], we[[i]]) * a[[i]]