2013-03-29 2 views
0

저는 3 차원 배열로서 matlab에 모든 부울 행렬을 생성하고 싶습니다. 예를 들어matlab에있는 모든 이진 n x m 행렬을 생성하십시오

:

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

내 최종 목표는 주어진 크기의 각의 삼중 매트릭스를 생성하는 것입니다. 매트릭스의 수는 기하 급수적이라는 것을 알고 있지만 적은 수를 사용합니다.

답변

1

이전 답변이 실제로 원하는대로 작동하는지 확신하지 못합니다.이 방법을 사용하면 동일한 array2D에 여러 항목이 표시됩니다. 여기에 올바른 용액 A 벡터화이고 (나는 믿는다) :

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*nRows2^(nRows*nRows) 행렬을 생성하고 있기 때문에 당신이 꽤 빨리 메모리가 부족합니다 nRows 적은 수의 이외의 아무것도. ThatsAlotta 숫자.

0

실제로 대답은 매우 간단합니다. 부울 값인 각 행렬은 지정된 순서로 모든 값을 읽을 때 얻은 이진수로 인덱싱 할 수 있습니다.

이진 행렬의 경우 : n을 행렬의 요소 수 (n = 행 * 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 

이 매우 용이 dec2base에 DEC2BIN 변경 및 N^(yourbase)로 2^N을 변경함으로써 임의의 염기로 일반화 될 수있다.

관련 문제