저는 3 차원 배열로서 matlab에 모든 부울 행렬을 생성하고 싶습니다. 예를 들어matlab에있는 모든 이진 n x m 행렬을 생성하십시오
:
mat(:,:,1) = [[1 0][0 1]]
mat(:,:,2) = [[1 1][0 1]]
...
내 최종 목표는 주어진 크기의 각의 삼중 매트릭스를 생성하는 것입니다. 매트릭스의 수는 기하 급수적이라는 것을 알고 있지만 적은 수를 사용합니다.
저는 3 차원 배열로서 matlab에 모든 부울 행렬을 생성하고 싶습니다. 예를 들어matlab에있는 모든 이진 n x m 행렬을 생성하십시오
:
mat(:,:,1) = [[1 0][0 1]]
mat(:,:,2) = [[1 1][0 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*nRows
의 2^(nRows*nRows)
행렬을 생성하고 있기 때문에 당신이 꽤 빨리 메모리가 부족합니다 nRows
적은 수의 이외의 아무것도. ThatsAlotta 숫자.
실제로 대답은 매우 간단합니다. 부울 값인 각 행렬은 지정된 순서로 모든 값을 읽을 때 얻은 이진수로 인덱싱 할 수 있습니다.
이진 행렬의 경우 : 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을 변경함으로써 임의의 염기로 일반화 될 수있다.