在matlab中生成每个二进制n x m矩阵

时间:2013-03-29 10:22:39

标签: matlab matrix binary

我想在matlab中生成每个布尔矩阵作为一个三维数组。

例如:

mat(:,:,1) = [[1 0][0 1]]
mat(:,:,2) = [[1 1][0 1]]
...

我的最终目标是生成给定大小的每个三元矩阵。 请记住,我知道矩阵的数量是指数级的,但我会使用小数字。

2 个答案:

答案 0 :(得分:1)

不确定上一个答案实际上是否符合您的要求...使用该方法,我在array2D中获得了相同的多个条目。这是一个矢量化和(我相信)正确的解决方案:

clear all;

nRows = 2;
nCols = nRows; % Only works for square matrices

% Generate matrix of all binary numbers that fit in nCols
max2Pow = nCols;
maxNum = 2 ^ max2Pow - 1; 
allBinCols = bsxfun(@bitand, (0:maxNum)', 2.^((max2Pow-1):-1:0)) > 0;

% Get the indices of the rows in this matrix required for each output
% binary matrix
N = size(allBinCols, 1);
A = repmat({1:N}, nCols, 1);
[B{1:nCols}] = ndgrid(A{:});
rowInds = reshape(cat(3, B{:}), [], nCols)';

% Get the appropriate rows and reshape to a 3D array of right size
nMats = size(rowInds, 2);
binMats = reshape(allBinCols(rowInds(:), :)', nRows, nCols, nMats)

请注意,除了少量nRows之外的其他任何内容都会很快耗尽内存,因为您正在生成大小为2^(nRows*nRows)的{​​{1}}矩阵。 ThatsAlottaNumbers。

答案 1 :(得分:0)

实际上答案非常简单。每个矩阵都是布尔值,它可以通过以任何给定顺序读取所有值时获得的二进制数来索引。

对于二进制矩阵:设n为矩阵中元素的数量(n = rows * cols)。

for d=0:(2^n-1)
    %Convert binary to decimal string
    str = dec2bin(d);
    %Convert string to array
    array1D = str - '0';
    array1D = [array1D zeros(1, n-length(array1D))];
    %Reshape
    array2D(:,:,d+1) = reshape(array1D, rows, cols);
end

通过将dec2bin更改为dec2base并将2 ^ n更改为(yourbase)^ n,可以非常容易地将其推广到任何基础。