2012-12-30 90 views
5

在處理與Weisstein猜想有關的問題時(https://cs.uwaterloo.ca/journals/JIS/VOL7/Sloane/sloane15.pdf),我需要生成所有n x n(0,1)的矩陣n = 2,3,4,...如果您考慮正確的二進制序列並對其進行相應的劃分,這並不難。例如,這裏有所有的3×3的矩陣:生成所有(0,1)nxn矩陣

With[{n = 3}, 
lis = PadLeft[IntegerDigits[#, 2], n^2]& /@ Range[0, 2^n^2 - 1]; 
mats = (Partition[#, n] &) /@ lis 
]; 

Weisstein猜想涉及,每個ň = 2,3,...,計數,其特徵值都是正實矩陣的數量。對於n = 2,有3個;對於n = 3,有25個;對於n = 4,有543;等等。特徵值計算既費時又直接。

我感興趣的是,雖然是什麼,是找到枚舉ñ X ň矩陣的其他方式。爲了得到所有這些數據,我使用了2 ^(n^2)的整數的基數2表示,並進行了分區以製作矩陣。必須有其他(更高效的)方式。

+0

可能更適合[cstheory](http://cstheory.stackexchange.com),雖然他們可能會因爲過於基本而忽略它們的鼻子。=^_^= – 2012-12-30 06:17:53

回答

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