每个子列表乘以矩阵

时间:2018-04-24 08:36:31

标签: r list lapply

我通过向量tm将矩阵tb乘以产生一个"响应"向量。我需要将其应用于 n tb向量列表,这将生成包含 n 响应向量的列表。我正在努力让这个迭代在列表上,对于一个案例就是这样:

set.seed(19)
n <- 10
k <- 4
tb <- list(split(rnorm(n*k, 0, 1),seq(1:n)))
tm <- matrix(c(1.0, 0.1, 0.2, 0.3, 0.1, 1.0, 0.2, 0.1, 0.2, 0.2, 1.0, 0.5, 0.3, 0.1, 0.5, 1.0), ncol = k)
tm %*% as.vector(unlist(tb[[1]][1]))

在单独进行此计算时会生成第一个响应向量:

> tm %*% as.vector(unlist(tb[[1]][1]))
           [,1]
[1,] -0.4014836
[2,]  0.8348435
[3,]  2.0416294
[4,]  1.9114801

但是,我尝试使用lapply / sapply获取所有10个响应向量,但这给了我意想不到的输出:

> sapply(tm, function(x) x %*% as.vector(unlist(tb)))
              [,1]          [,2]          [,3]          [,4]          [,5]
 [1,] -1.189453745 -0.1189453745 -0.2378907491 -0.3568361236 -0.1189453745
 [2,]  0.518629988  0.0518629988  0.1037259975  0.1555889963  0.0518629988
 [3,]  1.423423..   ...               ...           ...

这里只显示输出的片段,它有16列和40行,换句话说 - 每个矩阵元素一列, n x k < / em>行。它似乎占据了矩阵的第一个单元格,并进行了计算,然后是第二个单元格,第三个单元格等等 - 正如您所看到的那样,当我拍摄时,这与sapply的输出相匹配tm的单个元素:

> tm[1] %*% as.vector(unlist(tb[[1]][1]))
          [,1]    [,2]     [,3]     [,4]
[1,] -1.189454 0.51863 1.423423 1.504741

我的问题是,如何在使用lapply / sapply时采用整数矩阵,就像我单独进行时一样?

1 个答案:

答案 0 :(得分:1)

我认为你只需要从你的tb定义中删除list()函数:

set.seed(19)
n <- 10
k <- 4
tb <- split(rnorm(n*k, 0, 1),seq(1:n))
tm <- matrix(c(1.0, 0.1, 0.2, 0.3, 0.1, 1.0, 0.2, 0.1, 0.2, 0.2, 1.0, 0.5, 0.3, 0.1, 0.5, 1.0), ncol = k)

然后您可以更简单地生成您的第一个响应向量:

tm %*% tb[[1]]
[,1]
[1,] -0.4014836
[2,]  0.8348435
[3,]  2.0416294
[4,]  1.9114801

和所有带有sapply的响应向量:

sapply(tb, function(x) x %*%tm )

1          2          3           4          5          6          7          8          9         10
[1,] -0.4014836  0.1513720 -0.1113092 -0.28636882  1.1300914 -0.7037464  1.5886556 -0.8908194 -0.6891749 -0.4927336
[2,]  0.8348435  0.6747836  0.6135654 -0.01236765  0.6523212 -0.3599526 -0.2293118  1.5190890  0.1165567 -0.7644372
[3,]  2.0416294 -0.9832891  0.3399474  1.04671293 -0.1986427 -0.4779628  1.3585457  1.0673985 -1.7597788 -0.4059126
[4,]  1.9114801 -0.7064887  0.5356257  0.57154412  0.8048432 -1.6563305  2.9935210 -1.3916476 -1.3746462 -0.9662248