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

Pau*_*lin 5 wolfram-mathematica

在处理与Weisstein猜想相关的问题(https://cs.uwaterloo.ca/journals/JIS/VOL7/Sloane/sloane15.pdf)时,我需要为n = 生成所有n x n(0,1)矩阵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
]; 
Run Code Online (Sandbox Code Playgroud)

Weisstein猜想包括,对于每个n = 2,3,...,计算其特征值都是实数和正数的矩阵的数量.对于n = 2,有3; 对于n = 3,有25; 对于n = 4,有543; 等等.特征值计算耗时但直截了当.

我感兴趣的是找到了枚举n x n矩阵的其他方法.为了获得所有这些,我使用了最多2 ^(n ^ 2)的整数的基数2表示,并进行分区以制作矩阵.必须有其他(更有效的?)方式.

Vit*_*rov 8

我们可以使用内置的Mathematica功能Tuples.你的3x3例子就变成了

ms = Tuples[{1, 0}, {3, 3}];
Run Code Online (Sandbox Code Playgroud)

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

FromDigits[#, 2] & /@ Flatten /@ ms
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

要想象排序:

ArrayPlot[#, ImageSize -> 20, Mesh -> All] & /@ ms
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述