我试图生成所有可能的12 x6阶二元矩阵,其中只包含元素-1和+1。有2^72个唯一矩阵(2^16),使得没有两个矩阵在相同坐标中包含相同的元素。
我尝试使用下面的代码:
binary3.2 <- function(m, n) {
mn <- m*n
perm <- RcppAlgos::permuteGeneral(c(-1,1), mn, TRUE)
asplit(array(t(perm), c(m, n, 2^(m*n))), 3)
}
但是它给了我错误,提到m*n不能大于31,在我的例子中,它是72,有没有其他的方法来做到这一点?
1条答案
按热度按时间vsdwdz231#
首先,我是
RcppAlgos
的作者。有几种方法可以解决您当前的问题。在我们开始讨论您的主要问题之前,让我们先稍微简化一下您的代码。
使用
FUN
不用生成所有的排列,然后调用
asplit
,我们可以利用FUN
参数,动态地将向量转换为矩阵,就像combn
一样:解决内存问题
使用
lower
和upper
我们可以使用
lower
和upper
参数,以便生成块中的排列:这可以完成工作,但有点麻烦。
有没有更好的解决办法?
更好的方式
RcppAlgos
提供了组合迭代器,因此可以一次生成 n 个结果,从而保持低内存。使用迭代器
这些迭代器真正的优点是它们是双向的,而且还提供随机访问:
而至于眼前的问题,记忆力将是没有问题的!