【发布时间】:2022-01-20 15:31:28
【问题描述】:
鉴于每行中 1 的位置列表,我试图找到一种有效的方法来构造二进制矩阵。这是一个小例子,虽然我正在尝试找到可以很好扩展的东西 -
给定一个二元矩阵:
> M <- matrix(rbinom(25,1,0.5),5,5)
> M
[,1] [,2] [,3] [,4] [,5]
[1,] 0 1 1 1 0
[2,] 0 1 1 1 1
[3,] 1 1 0 1 1
[4,] 1 0 0 1 0
[5,] 0 1 1 0 0
我可以使用以下方法将 M 转换为邻接表:
> Mlist <- apply(M==1, 1, which, simplify = FALSE)
> Mlist
[[1]]
[1] 2 3 4
[[2]]
[1] 2 3 4 5
[[3]]
[1] 1 2 4 5
[[4]]
[1] 1 4
[[5]]
[1] 2 3
我想将Mlist 转换回M。一种可能性是:
M.new <- matrix(0,5,5)
for (row in 1:5){M.new[row,Mlist[[row]]] <- 1}
但是,似乎应该有更有效的方法。
谢谢!
【问题讨论】:
-
你可以使用稀疏矩阵;例如
sparseMatrix(i=rep(seq_along(Mlist), lengths(Mlist)), j=unlist(Mlist), x=1)。对于小型示例,这可能会更慢,但对于更大、更消耗内存的示例,这可能会更快 -
@user20650 这是一个好主意(之前建议过)。我只是无法确定 sparseMatrix 方法更快的大小。
-
@Zachary ;我认为你的方法是一种明智的方法。当密集矩阵不适合 n 内存时遇到大问题时,稀疏方法很有用
-
@Akrun;抱歉 ;) 几乎是你写的一个字一个字的副本
-
@user20650 谢谢。我取消删除。如果您想出更好的方法,请作为解决方案发布。