como produzir toda permutação do posicionamento de 20 valores de -1 em um vetor de 1 por 41 deles?
Eu escrevi um código diferente para produzir permutações diferentes de uns e menos. eles trabalham para matrizes com pequenas dimensões:
por exemplo:
S=[-1 -1 1 1 1 1 1 1];
P=unique(perms(S),'rows');
produz:
-1 -1 1 1 1 1 1 1
-1 1 -1 1 1 1 1 1
-1 1 1 -1 1 1 1 1
-1 1 1 1 -1 1 1 1
-1 1 1 1 1 -1 1 1
-1 1 1 1 1 1 -1 1
-1 1 1 1 1 1 1 -1
1 -1 -1 1 1 1 1 1
1 -1 1 -1 1 1 1 1
1 -1 1 1 -1 1 1 1
1 -1 1 1 1 -1 1 1
1 -1 1 1 1 1 -1 1
1 -1 1 1 1 1 1 -1
1 1 -1 -1 1 1 1 1
1 1 -1 1 -1 1 1 1
1 1 -1 1 1 -1 1 1
1 1 -1 1 1 1 -1 1
1 1 -1 1 1 1 1 -1
1 1 1 -1 -1 1 1 1
1 1 1 -1 1 -1 1 1
1 1 1 -1 1 1 -1 1
1 1 1 -1 1 1 1 -1
1 1 1 1 -1 -1 1 1
1 1 1 1 -1 1 -1 1
1 1 1 1 -1 1 1 -1
1 1 1 1 1 -1 -1 1
1 1 1 1 1 -1 1 -1
1 1 1 1 1 1 -1 -1
ou
indices = nchoosek(1:41, 6);
N = size(indices, 1);
S = ones(N, 41);
S(sub2ind([N 41], [1:N 1:N 1:N 1:N 1:N 1:N].', indices(:))) = -1;
pode produzir uma matriz de 4496388_by_41 de todas as permutações de 6 menos um (-1) e 35 um (1).
esses códigos funcionam para dimensões menores, mas não funcionam para as matrizes com dimensões maiores.
meu objetivo é produzir todas as permutações de 20 menos um (-1) e 21 um (1) essa matriz possui 269128937220 linhas e 41 colunas. mas os seguintes códigos não funcionam:
indices = nchoosek(1:41, 20);
N = size(indices, 1);
S = ones(N, 41);
S(sub2ind([N 41], [1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N 1:N].', indices(:))) = -1;
ou
S=[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
P=unique(perms(S),'rows');
Eu faço um cálculo simples em cada permutação (cada linha desta matriz). se eu pudesse escrever cada linha desta matriz com loops for e, em seguida, fazer o cálculo nessa linha, seria capaz de manter o melhor resultado e, nessa situação, não precisaria manter todos esses dados na memória e não não há erros de memória no matlab.
se você sabe como produzir uma matriz de todas as permutações de 20 menos uma (-1) e 21 uma (1) com loops ou qualquer outra maneira de armazená-las no meu computador, por favor, ajude.
desde já, obrigado