生成所有(0,1)nxn矩阵

时间:2012-12-30 06:10:33

标签: wolfram-mathematica

在处理与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表示,并进行了分区以制作矩阵。必须有其他(更有效的?)方式。

1 个答案:

答案 0 :(得分:8)

我们可以使用内置的Mathematica函数Tuples。你的3x3例子就变成了

ms = Tuples[{1, 0}, {3, 3}];

排序的枚举可以通过二进制数来完成

FromDigits[#, 2] & /@ Flatten /@ ms

enter image description here

可视化排序:

ArrayPlot[#, ImageSize -> 20, Mesh -> All] & /@ ms

enter image description here