R 将矩阵乘以每个子列表
我将矩阵tm乘以向量tb以生成响应向量。我需要将其应用于n个tb向量的列表,这将生成一个包含n个响应向量的列表。我正在努力让它在列表中重复,对于一个单独的例子,它是这样的:R 将矩阵乘以每个子列表,r,list,lapply,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
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]))
但是,我尝试使用lappy/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行。它似乎是取矩阵的第一个单元格,然后进行计算,然后是第二个单元格,第三个单元格,依此类推-正如你所看到的,当我取tm的单个元素时,这与sapply的输出相匹配:
> tm[1] %*% as.vector(unlist(tb[[1]][1]))
[,1] [,2] [,3] [,4]
[1,] -1.189454 0.51863 1.423423 1.504741
我的问题是,当使用lappy/sapply时,我如何让这个乘法像我单独使用它时那样使用整个矩阵?我认为您只需要从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)
以及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
别傻了,做一个矩阵乘法:tm%*%do.callcbind,tb[[1]]。太棒了,谢谢-把它作为答案,我会接受的!
tm %*% tb[[1]]
[,1]
[1,] -0.4014836
[2,] 0.8348435
[3,] 2.0416294
[4,] 1.9114801
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