在处理与Weisstein猜想相关的问题(https://cs.uwaterloo.ca/journals/JIS/VOL7/Sloane/sloane15.pdf)时,我需要生成所有 n x n (0,1) n 的矩阵= 2,3,4 ......如果你考虑正确的二进制序列并相应地对它们进行分区,那就太难了。例如,以下是所有3 x 3矩阵:
With[{n = 3},
lis = PadLeft[IntegerDigits[#, 2], n^2]& /@ Range[0, 2^n^2 - 1];
mats = (Partition[#, n] & ) /@ lis
];
Weisstein猜想包括,对于每个 n = 2,3,......,计算其特征值都是实数和正数的矩阵的数量。对于 n = 2,有3个;对于 n = 3,有25个;对于 n = 4,有543;等等。特征值计算既耗时又简单。
我感兴趣的是找到了枚举 n x n 矩阵的其他方法。为了获得所有这些,我使用了2 ^( n ^ 2)的整数的基数2表示,并进行了分区以制作矩阵。必须有其他(更有效的?)方式。
答案 0 :(得分:8)
我们可以使用内置的Mathematica函数Tuples
。你的3x3例子就变成了
ms = Tuples[{1, 0}, {3, 3}];
排序的枚举可以通过二进制数来完成
FromDigits[#, 2] & /@ Flatten /@ ms
可视化排序:
ArrayPlot[#, ImageSize -> 20, Mesh -> All] & /@ ms