Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

New to MATLAB?

How do I create a vector combinations in pairs

Asked by luis

luis (view profile)

on 18 Sep 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

0 Comments

luis

luis (view profile)

Products

No products are associated with this question.

6 Answers

Answer by Azzi Abdelmalek

Azzi Abdelmalek (view profile)

on 18 Sep 2013
Edited by Azzi Abdelmalek

Azzi Abdelmalek (view profile)

on 18 Sep 2013
Accepted answer
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 Comments

luis

luis (view profile)

on 19 Sep 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 (view profile)

on 19 Sep 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,:)=[]
Azzi Abdelmalek

Azzi Abdelmalek (view profile)

Answer by Jan Simon

Jan Simon (view profile)

on 19 Sep 2013
Edited by Jan Simon

Jan Simon (view profile)

on 19 Sep 2013

0 Comments

Jan Simon

Jan Simon (view profile)

Answer by Roger Stafford

Roger Stafford (view profile)

on 19 Sep 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.

0 Comments

Roger Stafford

Roger Stafford (view profile)

Answer by Roger Stafford

Roger Stafford (view profile)

on 19 Sep 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.

0 Comments

Roger Stafford

Roger Stafford (view profile)

Answer by Andrei Bobrov

Andrei Bobrov (view profile)

on 19 Sep 2013
Edited by Andrei Bobrov

Andrei Bobrov (view profile)

on 19 Sep 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),[])');

0 Comments

Andrei Bobrov

Andrei Bobrov (view profile)

Answer by Jos (10584)

Jos (10584) (view profile)

on 19 Sep 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)]

0 Comments

Jos (10584)

Jos (10584) (view profile)

Contact us