子集矩阵:将二进制矩阵映射到1s但不是0的定性矩阵,同时保持矩阵维度不变

时间:2014-07-21 15:07:27

标签: r matrix map nested-lists

假设我有两个列表列表,一个是二进制列表,另一个是定量列表。列表中的顺序很重要。我想将二进制矩阵映射到其定性对应物上,同时创建具有相同维度的相同数量的嵌套矩阵的新列表列表。这些矩阵将是其定性对应物的子集;二进制矩阵中有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

任何指针都将受到高度赞赏,谢谢!

2 个答案:

答案 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

现在,二进制矩阵中零的所有元素都将保持为零,所有一个元素将成为定性矩阵中的值。

希望它有所帮助!