【问题标题】:multiply list of matrices by the list of arrays where they are from different length in R将矩阵列表乘以来自R中不同长度的数组列表
【发布时间】:2017-11-03 09:02:28
【问题描述】:

我想将矩阵乘以具有不同长度的数组。

注意:乘法应该是匹配元素的元素。

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]]
}
}

输出:

> 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

有什么帮助吗?

【问题讨论】:

  • 你需要lapply(seq_along(we), function(i) a[[i]]*array(we[[i]], dim(a[[i]])))
  • 太棒了。非常感谢。
  • 您正在循环遍历ij 索引,但仅在x[[i]] 中存储一个索引i

标签: r


【解决方案1】:

我们可以使用lapplyMap。由于'a'和'we'的list元素的数量相同,但只有一个是array,即'a',我们可以replicate通过@的第三维将'we' 987654326@

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]]

【讨论】:

  • 太棒了。您能否也请提供我们如何按照我在问题中使用for 循环的想法来做到这一点?
  • 和往常一样棒!
猜你喜欢
  • 2016-06-20
  • 2017-10-09
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
相关资源
最近更新 更多