假设我有两个列表列表,一个是二进制列表,另一个是定量列表。列表中的顺序很重要。我想将二进制矩阵映射到其定性对应物上,同时创建具有相同维度的相同数量的嵌套矩阵的新列表列表。这些矩阵将是其定性对应物的子集;二进制矩阵中有1的位置。
# dummy data
dat1 <- c(0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,1)
mat1 <- matrix(dat1, ncol=4, nrow=4, byrow=T)
dat2 <- c(1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,0)
mat2 <- matrix(dat1, ncol=4, nrow=4, byrow=T)
lsMat1 <- list(mat1, mat2)
dat3 <- c(0.3,0.1,0.6,0.3,0.9,0.1,0.1,0.3,0.6,0.2,0.7,0.8,0.4,0.1,0.4,0.5)
mat3 <- matrix(dat3, ncol=4, nrow=4, byrow=T)
dat4 <- c(0.5,0.3,0.6,0.8,0.1,0.4,0.5,0.1,0.5,0.1,0.0,0.1,0.4,0.6,0.0,0.8)
mat4 <- matrix(dat4, ncol=4, nrow=4, byrow=T)
lsMat2 <- list(mat3, mat4)
所需的新嵌套列表
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0.0 0.1 0 0.3
[2,] 0.9 0.0 0 0.0
[3,] 0.6 0.0 0 0.0
[4,] 0.4 0.1 0 0.5
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0.0 0.3 0 0.8
[2,] 0.1 0.0 0 0.0
[3,] 0.5 0.0 0 0.0
[4,] 0.4 0.6 0 0.8
任何指针都将受到高度赞赏,谢谢!
答案 0 :(得分:2)
我将假设您上面提供的输出不正确。由于二进制矩阵中有0和1,并且您只想保留1的值,因此可以使用简单的元素乘法。您可以使用
为列表中的每个项目执行此操作Map(`*`, lsMat1, lsMat2)
返回
[[1]]
[,1] [,2] [,3] [,4]
[1,] 0.0 0.1 0 0.3
[2,] 0.9 0.0 0 0.0
[3,] 0.6 0.0 0 0.0
[4,] 0.4 0.1 0 0.5
[[2]]
[,1] [,2] [,3] [,4]
[1,] 0.0 0.3 0 0.8
[2,] 0.1 0.0 0 0.0
[3,] 0.5 0.0 0 0.0
[4,] 0.4 0.6 0 0.8
鉴于lsMat1中两个矩阵中的第三列都是0,这似乎更正确。
答案 1 :(得分:0)
如果我理解了这个问题,我会做一个基于元素的矩阵乘法。我不熟悉您发布的语法,但IN MATLAB:
mat1。* mat3
现在,二进制矩阵中零的所有元素都将保持为零,所有一个元素将成为定性矩阵中的值。
希望它有所帮助!