只是为了一般性理解:为什么你认为你需要一个由 0 到 2³⁹ 的所有整数的所有组合组成的数组?该阵列将消耗 39×2³⁹/1000⁴ ≈ 21TB 的 RAM...上次我检查时,只有世界上最先进的超级计算机才有这样的资源,并且大多数使用这些机器的人认为生成这样的阵列非常浪费...
无论如何,为了完整性,对于任何N
,这是最简单的解决方案:
P = dec2bin(0:(2^N)-1)-'0'
但是,有一点建议:dec2bin
输出字符数组。如果你想数值数组,你可以减去这个字符'0'
,但是,这给了你一个数组doubles
根据MATLAB的规则:
>> P = dec2bin(0:(2^3)-1)-'0';
>> whos P
Name Size Bytes Class Attributes
P 8x3 192 double
如果您想最大限度地减少内存消耗,请生成一个逻辑数组:
>> P = dec2bin(0:(2^3)-1)=='1';
>> whos P
Name Size Bytes Class Attributes
P 8x3 24 logical
如果你还想加快执行速度,可以直接使用标准算法:
%// if you like cryptic one-liners
B1 = rem(floor((0:pow2(N)-1).' * pow2(1-N:0)), 2) == 1;
%// If you like readability
B = false(N,pow2(N));
V = 0:pow2(N)-1;
for ii = 1:N
B(ii,:) = rem(V,2)==1;
V = (V-B(ii,:))/2;
end
最后一个(循环)是所有解决方案中最快的N
(至少在 R2010b 和 R2013a 上),并且它具有最小的峰值内存(仅为神秘单行的 1/N)。
所以我会选择那个:)
但是,那只是我。