changing position of numbers in a vector

Im new in matlab, i hope someone can help me with my problem. I need to make a code to solve this Cobinatoric example. I have a vector with 6 numbers where 2 of them are 1 and the rest are 0 as you can see below
A=[1 1 0 0 0 0]
I want to make a code which can help me change the position of all (1)s and put them in all the possible positions as you can see bellow without changing it all of them by myself, because my code is not only 5 numbers, i have a huge number.
A=[0 1 1 0 0 0]
A=[0 0 1 1 0 0]
A=[0 0 0 1 1 0]
A=[0 0 0 0 1 1]
A=[1 0 1 0 0 0]
A=[1 0 0 1 0 0]
A=[1 0 0 0 1 0]
A=[1 0 0 0 0 1]
A=[0 1 0 1 0 0]
A=[0 1 0 0 1 0]
A=[0 1 0 0 0 1]
A=[0 0 1 0 1 0]
A=[0 0 1 0 0 1]
A=[0 0 0 1 0 1]

Respuestas (4)

Andrei Bobrov
Andrei Bobrov el 20 de Mayo de 2013
Editada: Andrei Bobrov el 20 de Mayo de 2013
out = unique(perms([1 1 0 0 0 0]),'rows');
or [EDIT]
A = [1 1 1 1 0 0 0 0 0 0];
n = numel(A);
b = nnz(A);
M = 0:ones(1,n)*pow2(n-1:-1:0)';
z = rem(floor(M(:)*pow2(1-n:0)),2);
out = z(sum(z,2) == b,:);

3 comentarios

Brwa
Brwa el 20 de Mayo de 2013
your code is very powerful, although icant understand it very clearly, but i checked some different values it was all correct.
Thank you very much
Dear Andrei Bobrov
is it possible to use that code for big numbers such as n => 30 and b => 5 ?
when i tried n = 25 and b =5 i got error said
??? Error using ==> mtimes Out of memory. Type HELP MEMORY for your options.
Error in ==> Position at 5
z = rem(floor(M(:)*pow2(1-n:0)),2);
and when i tried n = 30 i got this error
??? Error using ==> colon Maximum variable size allowed by the program is exceeded.
Error in ==> Position at 4
M = 0:ones(1,n)*pow2(n-1:-1:0)';
I wish you have a solution for this problem
Thanks for your help.
Triveni
Triveni el 31 de Oct. de 2015
@Andrei Bobrov
If A= [-45 -45 -45 -45 -45 -45 0 0 0 0 0 0 0 0 45 45 45 45 45 45]
then how can be write??

Iniciar sesión para comentar.

David Sanchez
David Sanchez el 20 de Mayo de 2013
Andrei's answer maybe the best choice, but in case you want to see what's behind:
A=zeros(1,6);
for k=1:size(A,2)
A=zeros(1,6);
A(k) = 1;
for n = k+1:size(A,2)
if n>k+1
A(n-1) = 0;
end
A(n) = 1
end
end

1 comentario

Brwa
Brwa el 20 de Mayo de 2013
thank you for your help. you both are amazing

Iniciar sesión para comentar.

Roger Stafford
Roger Stafford el 20 de Mayo de 2013
This problem is naturally made for Matlab's 'nchoosek' function. This method requires no rejection afterward and will therefore be easiest on your memory. Let A be a row vector of ones and zeros.
n = size(A,2);
k = sum(A==1);
C = nchoosek(1:n,k);
m = size(C,1); % m will equal n!/k!/(n-k)!
B = zeros(m,n);
B(repmat((1-m:0)',1,k)+m*C) = 1; % Place ones according to indices in C
The desired position combinations will appear in the rows of B, with k ones in each row.
Note: Beware of "huge" numbers! If you have, say, 15 ones and 15 zeros in A, the number of possible arrangements of them is an enormous 155,117,520.
Mian Jehanzaib
Mian Jehanzaib el 22 de Dic. de 2016

0 votos

How about creating one possible combination row at a time in a for loop and not creating a huge matrix at once?
I don't require to store the all possibilities in a matrix rather I need to generate them one at a time. Could you suggest any solution please

Categorías

Productos

Etiquetas

Preguntada:

el 20 de Mayo de 2013

Respondida:

el 22 de Dic. de 2016

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by