2013-03-29 6 views
0

Я хотел бы сгенерировать каждую логическую матрицу в matlab как трехмерный массив.Создать каждую бинарную матрицу n x m в matlab

Например:

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

Моя конечная цель заключается в создании каждого троичного матрицу заданного размера. Имейте в виду, что я знаю, что число матриц экспоненциально, но я буду использовать небольшие числа.

ответ

1

Не уверен, что предыдущий ответ на самом деле делает то, что вы хотите ... С помощью этого метода я получаю несколько записей в массиве 2D, которые являются одинаковыми. Вот vectorised и (я считаю) правильное решение:

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) матрицы размером nRows*nRows. ThatsAlottaNumbers.

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^п в (yourbase)^п.

Смежные вопросы