How do I create a vector combinations in pairs

5 visualizaciones (últimos 30 días)
luis
luis el 18 de Sept. de 2013
How do I create a vector combinations in pairs ,with no repeated elements ,for example :
A(1,2,3,4)
1,2
1,3
1,4
2,1
2,3
2,4
3,1
3,2
3,4
4,1
4,2
4,3
I tried to use some commands like : perms And combnk , thanks in advanced

Respuesta aceptada

Azzi Abdelmalek
Azzi Abdelmalek el 18 de Sept. de 2013
Editada: Azzi Abdelmalek el 18 de Sept. de 2013
a=fliplr(fullfact([4 4]))
a(~diff(a')',:)=[]
or
[ii,jj]=ndgrid(1:4,1:4);
a=[jj(:) ii(:)];
a(~(a(:,1)-a(:,2)),:)=[]
  2 comentarios
luis
luis el 19 de Sept. de 2013
thank you, is what I needed I have a question, how do I create a vector combinations for a vector of n elements and choose if I want the combinations of two elements,three or n elements.
Azzi Abdelmalek
Azzi Abdelmalek el 19 de Sept. de 2013
n=4
m=3 % number of combinations
a=fliplr(fullfact(ones(1,m)*n));
b=sort(a,2);
idx=any(~diff(b')',2);
a(idx,:)=[]

Iniciar sesión para comentar.

Más respuestas (5)

Roger Stafford
Roger Stafford el 19 de Sept. de 2013
What you are asking for in this comment are known as the partial permutations. I don't know if matlab has such a routine but you can use 'nchoosek' and 'perms' to create one. Let A be a row vector of n elements and let the number of these to be selected in each permutation be called r.
c = nchoosek(A,r)';
ncr = size(c,2);
p = perms([1:r]);
pr = size(p,1);
p = reshape(p',1,[]);
B = zeros(ncr*pr,r);
for k = 1:ncr
B((k-1)*pr+1:k*pr,:) = reshape(c(p,k),r,[])';
end
B will be the desired list of partial permutations.

Roger Stafford
Roger Stafford el 19 de Sept. de 2013
Here is a more compact way of using 'nchoosek' and 'perms'.
c = nchoosek(A,r)';
B = reshape(c(perms(1:r)',:),r,[])';
where A, r, and B are as before.

Jan
Jan el 19 de Sept. de 2013
Editada: Jan el 19 de Sept. de 2013

Andrei Bobrov
Andrei Bobrov el 19 de Sept. de 2013
Editada: Andrei Bobrov el 19 de Sept. de 2013
d = fullfact([4 4]);
out = d(diff(d,[],2)~=0,:);
and
A = [8 2 9 6 1];
n = 3;
ix = fullfact(ones(1,n)*numel(A));
out = A(ix(all(diff(sort(ix,2),[],2),2),:));
and using the ideas by Roger Stafford (they very nice)
c = nchoosek(A,r)';
p = perms([1:r]);
s = size(c);
c(reshape(bsxfun(@plus,p',reshape((0:s(2)-1)*s(1),1,1,[])),s(1),[])');

Jos (10584)
Jos (10584) el 19 de Sept. de 2013
The simplest way is to create all N*N combinations and weed out the N ones that have the same value.
N = 4 ;
A = 1:N ;
[b2,b1] = ndgrid(A) ; % generalization
q = b1~=b2 ;
% q = ~eye(N) ; % they are all on the diagonal
B = [b1(q) b2(q)]

Categorías

Más información sobre Graph and Network Algorithms en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by