2016-01-03 7 views
5

Я ищу простой способ получить все комбинации двоичной матрицы. Я уже пробовал функцию perms(), но не получил правильного результата.Matlab: Все комбинации двоичной матрицы

У меня есть, например, матрица N x N, заполненная 1 и -1. С N = 2 было бы 2^4 возможных комбинации 1 и -1, как

 (1 1)   (1 1)   (-1 -1) 
M(1) = (1 1) , M(2) = (1 -1) , M(3) = (1 1) and so on... 

При использовании завивки() я не получить, например, первую матрицу.

Как это исправить?

ответ

5

Вы можете представлять все числа между 0 и 2^(N^2)-1 в виде двоичных чисел, а затем изменить форму:

N = 2; 
v = (1:2^(N^2))-1; 
A = dec2bin(v)' - '0'; %'// Or use: decimalToBinaryVector(v)'; 
A(A==0) = -1; 
A = reshape(A,N,N,2^(N^2)); 
+0

Почему downvote? Если я ошибаюсь, я бы хотел знать, почему –

+1

Кажется мне хорошо, кроме опечатки на первой строке ('2^N-1' вместо' 2^N²-1'). Плюс я бы отметил, что этот подход не заставляет вас хранить все эти комбинации в памяти, так как он дает соответствие 1: 1 между вашими матрицами и «0: 2^N²-1», что означает, что вам просто нужно например, получить одну из этих матриц, например, вы можете просто выбрать номер, а затем применить эквивалентность – BillBokeey

+1

То же самое произошло со мной !!! Мы здесь, чтобы учиться или сражаться? – NKN

-1

простой обходной выглядят следующим образом:

v = [1 -1 1 -1]; 
P = perms(v); 
for ii = 1:size(P,1) 
    A = reshape(P(ii,:),2,2) 
end 

что приводит к:

A = 

    -1 -1 
    1  1 

... 

Тем не менее есть некоторые идентичные матрицы в результате которого должен быть удален.

+1

С вашим подходом я не получить матрицы с более чем двумя 1 или -1. – Samuel

+0

Вы получаете только матрицы с комбинацией двух '-1' 'и' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Чтобы удалить дубликаты, я предлагаю строку 'P = unique (P, 'rows')' для устранения дубликатов. – Adriaan

-1

Я думаю, что я нашел решение моей проблемы

L = 2; 
N = L^2; 
v = cell(N,1); 
for k = 1:N 
    v{k} = linspace(-1,1,2); 
end 

ne=numel(v); 
x=cell(ne,1); 
[x{1:ne,1}]=ndgrid(v{end:-1:1}); 
p=reshape(cat(ne+1,x{:}),[],ne); 

F = cell(length(p),1); 
for k=1:length(p) 
    F{k} = reshape(p(k,:),L,L); 
end 
+0

Почему downvote? Неправильно ли мое решение? – Samuel

+0

Две вещи: пожалуйста, не используйте 'clear all' в SO-кодах, так как люди, как правило, копируют эти коды самостоятельно, а' clear' call messes all. Второй: 'p' - это 65536x16 двойной, что кажется немного большим для ваших перестановок. Все нужные перестановки есть, но слишком часто. Думаю, вы немного забыли о своих размерах. – Adriaan

+0

Также: 'v' - это только ячейка 16x1 с 16-кратной матрицей:' [-1 1] '. Вся эта петля - это просто сложный способ написать эти два числа. (В качестве побочного примечания я не голосовал по этому вопросу) – Adriaan

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