【问题标题】:How to multiply a list of vector by list of arrays (by columns) in R如何在R中将向量列表乘以数组列表(按列)
【发布时间】:2017-11-06 07:14:03
【问题描述】:

给定信息:

假设我有两个向量的列表(每个向量有 10 个元素)。另外,假设我有一个数组列表(列表的每个元素有 10 个数组)。这些阵列是下三角形的。即上三角值为零。

代码:

向量:

x <- list(rnorm(10,0,2), rnorm(10,2,2))

    

数组:

set.seed(47)
a <- vector("list",2)

for( i in seq_along(a)){

a[[i]] <- array(rnorm(5 * 5 * 10), c(5, 5, 10))
for(k in seq(dim(a[[1]])[3])) a[[i]][,,k][upper.tri(a[[i]][,,k], diag = TRUE)] <- 0

}

需要的:

我想将每个向量的每个元素乘以列的数组的相应元素。也就是说,

  1. 将第一个向量的第一个元素乘以数组的第一个元素的第一个元素(数组列表的第一个元素)。
  2. 然后将第一个向量的第二个元素乘以数组的第二个元素。
  3. 对数组列表的第二个数组的第二个向量执行相同的操作。

也就是说,

每个向量包含 10 个元素,每个数组有 10 个值。我想将向量的第一个值乘以数组的第一个值,然后对其他元素执行此操作。

示例:

> x
[[1]]
 [1]  1.2062716  1.4671676 -2.9603710 -4.2447263  1.4897441  3.8680305  0.7318295 -3.9691290 -0.8161910
[10]  0.8807681

[[2]]
 [1]  0.80512691 -0.03917115  2.58162187  2.91426812  2.78445280  0.32298579  2.33907433 -0.70444579
 [9] -0.52903520  4.60506480

[[1]]
, , 1

           [,1]        [,2]        [,3]        [,4] [,5]
[1,]  0.0000000  0.00000000  0.00000000  0.00000000    0
[2,]  0.7111425  0.00000000  0.00000000  0.00000000    0
[3,]  0.1854053  0.01513086  0.00000000  0.00000000    0
[4,] -0.2817650 -0.25204590 -1.82822917  0.00000000    0
[5,]  0.1087755 -1.46575030  0.09147291 -0.04057817    0

, , 2

            [,1]       [,2]      [,3]       [,4] [,5]
[1,]  0.00000000  0.0000000 0.0000000  0.0000000    0
[2,] -1.60815993  0.0000000 0.0000000  0.0000000    0
[3,] -2.32237229 -1.2004406 0.0000000  0.0000000    0
[4,] -1.96721918  0.8852306 0.5066870  0.0000000    0
[5,]  0.02752681  0.8869350 0.5643018 -0.4876964    0

我想将第一个列表的第一个元素乘以(数组列表的第一个元素的)第一个元素,即

 1.2062716  *  0.7111425  

1.2062716  * -1.60815993  

1.4671676 * 0.1854053  

1.4671676 * -2.32237229 

那么第一个元素的期望乘积是

> a[[1]][,,1]*x[[1]][1]
           [,1]        [,2]       [,3]       [,4] [,5]
[1,]  0.0000000  0.00000000  0.0000000  0.0000000    0
[2,]  0.8578310  0.00000000  0.0000000  0.0000000    0
[3,]  0.2236491  0.01825193  0.0000000  0.0000000    0
[4,] -0.3398851 -0.30403580 -2.2053409  0.0000000    0
[5,]  0.1312129 -1.76809293  0.1103412 -0.0489483    0

回答的结果是:

[[1]]
, , 1

           [,1]        [,2]        [,3]        [,4] [,5]
[1,]  0.0000000  0.00000000  0.00000000  0.00000000    0
[2,]  0.8578310  0.00000000  0.00000000  0.00000000    0
[3,]  0.2720206  0.02254111  0.00000000  0.00000000    0
[4,]  0.8341290 -0.97492123  7.25647738  0.00000000    0
[5,] -0.4617224 -1.07267929 -0.07465937 -0.03573996    0

对所有其他元素和列表的第二个元素执行相同的操作。

【问题讨论】:

  • @akrun 非常感谢。我会尝试。我举了我需要的例子。你能看看吗?
  • 我发布了一个解决方案。我无法重现“x”值,因为您没有使用 set.seed
  • 请检查我在下面发布的解决方案。我没有做很多检查
  • 根据您之前展示的乘法,a[[1]][,,1]*x[[1]][1] 的做法不正确
  • @akrun 我逐点检查了它,是的,您的回答很棒。谢谢。

标签: r


【解决方案1】:

我们可以试试Map

res <- Map(function(u, v) {
            u[u!=0] <- u[u!=0]*rep(v, dim(u)[3])
            u},
            a, x)
a[[1]][2,1,1]*x[[1]][1]
#[1] 0.3840722
a[[1]][2,1,2]*x[[1]][1]
#[1] -0.8685313

res[[1]][2, 1, 1]
#[1] 0.3840722
res[[1]][2, 1, 2]
#[1] -0.8685313

【讨论】:

  • 有一个不同的。我将其添加到我的问题中,因为我无法在评论中这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 1970-01-01
  • 2018-06-13
相关资源
最近更新 更多