Сформировать все возможные комбинации матрицы в Matlab

Обновить

December 2018

Просмотры

1.9k раз

2

Как я могу генерировать все возможные значения для матрицы N * M, зная, что элементы этой матрицы могут быть только либо быть 0 или 1?

Например, если я хочу матрицу 2 * 2, получаем 16 матриц с различными возможными комбинациями: [0 0; 0 0], [1 1; 1 1], [1 0; 0 1], [1 1; 0 0], [0 0; 1 1] ... и т.д.

2 ответы

6

Использование dec2base-

combs = dec2base(0:power(2,N*M)-1,2) - '0'

Это порождает все возможные комбинации строк. Таким образом, чтобы выбрать любую комбинацию, необходимо индексировать в combs. Таким образом, первая комбинация [0,0,0,0]будет доступна в combs(1,:)и последний [1,1,1,1]будет в comb(end,:).

Если возможные значения из другого набора, как 0,1,2,3вместо этого, сделать это изменение -

combs = dec2base(0:power(4,N*M)-1,4) - '0'

Если бы получить комбинации, которые будут иметь размеры одинаково для входной матрицы, используйте это -

combs_matshaped = reshape(permute(combs,[3 2 1]),N,M,[])

Это создает 3D массив как много 2D ломтиков как есть комбинации и каждая комбинация для матрицы «индекс в состоянии» с индексом третьего измерения. Например, если вы собираетесь получить первое сочетание, использование combs_matshaped(:,:,1)и для последнего, использование combs_matshaped(:,:,end).

1

Другая возможность (хотя ответ Divakar в проще и , вероятно , быстрее):

c = cell(1,N*M);
[c{end:-1:1}] = ndgrid([0 1 2 3 ]); %// or change set of values: [0 1 2 3] etc
combs = cell2mat(cellfun(@(x) x(:), c, 'uni', 0)); %// results as row vectors
combs = reshape(combs.',N,M,[]); %// NxM matrices: combs(:,:,1), combs(:,:,2),...