【发布时间】:2017-06-08 14:08:33
【问题描述】:
我想要随机但唯一的维度为 n*n 的二进制矩阵。
例如,如果 n = 5,则有 2^(5*5) = 33554432 个唯一组合(矩阵),这是一个巨大的数字。我只需要 1000。这是我目前的方法,但需要很多时间(我负担不起,因为我将来需要增加尺寸)。而且我觉得这是多余的,因为最后我只从完整的数字中选择了 1000 个随机组合。还有其他方法来处理这个吗?这就是我目前的做法:
我从一个包含 n*n 个变量的数据框开始,第一行全为 1,第二行全为 0:
Length = 25
m <- as.data.frame(matrix(c(rep(0, connections), rep(1,
connections)),ncol=25, byrow = TRUE))
m 看起来像这样:
#V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21
#V22 V23 V24 V25
#1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
#0 0 0 0 0
#2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
#1 1 1 1 1
接下来我使用 expand.grid 获得所有独特的组合
mFull = expand.grid(m) # This takes forever
然后我随机选择 1000 行:
mRand = mFull[sample(1:nrow(mFull), 1000,)]
在此之后,我将每一行转换为一个 n*n 矩阵,例如,对于第一行:
mRand[1,]
# V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20
#V21 V22 V23 V24 V25
#21788869 1 1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 1 1 0
#0 1 1 0 1 0
将其转换为矩阵:
> matrix(mRand[1,], nrow = 5, byrow = TRUE)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1 0 1 1
[2,] 1 0 0 1 1
[3,] 1 0 0 0 0
[4,] 1 1 1 0 0
[5,] 1 1 0 1 0
有人对更有效的解决方案提出建议吗?
【问题讨论】:
-
生成 1000 个二进制矩阵,然后检查是否有任何重复。如果你确实产生更多。重复直到它们都是独一无二的。当 n=5 时,您最初选择的 1000 个选项大约有 98.5% 的可能性是唯一的
标签: r matrix combinations permutation