Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate all pairs from two vectors in MATLAB using vectorised code?

More than once now I have needed to generate all possible pairs of two vectors in MATLAB which I do with for loops which take up a fair few lines of code i.e.

vec1 = 1:4; vec2 = 1:3; i = 0; pairs = zeros([4*3 2]); for val1 = vec1     for val2 = vec2          i = i + 1;          pairs(i,1) = val1;          pairs(i,2) = val2;     end end 

Generates ...

1 1 1 2 1 3 2 1 2 2 2 3 3 1 3 2 3 3 4 1  4 2 4 3 

There must be a better way to do this which is more MATLAB'esque?

n.b. nchoosek does not do the reversed pairs which is what I need (i.e. 2 1 as well as 1 2), I can't just reverse and append the nchoosek output because the symmetric pairs will be included twice.

like image 801
Brendan Avatar asked Sep 16 '11 15:09

Brendan


People also ask

How do you get all possible combinations in MATLAB?

C = combntns( v , k ) returns all possible combinations of the set of values v , given combinations of length k .

How do you make a combination in MATLAB?

b = nchoosek( n , k ) returns the binomial coefficient of n and k , defined as n!/(k!( n - k)!) . This is the number of combinations of n items taken k at a time. C = nchoosek( v , k ) returns a matrix containing all possible combinations of the elements of vector v taken k at a time.

Which function creates matrices that allow every combination of values within two input vectors?

Generate All Combinations of Vectors Using the combvec Function. This example shows how to generate a matrix that contains all combinations of two matrices, a1 and a2 . Create the two input matrices, a1 and a2 . Then call the combvec function to generate all possible combinations.

How do you create a set of vectors in MATLAB?

You can create a vector both by enclosing the elements in square brackets like v=[1 2 3 4 5] or using commas, like v=[1,2,3,4,5]. They mean the very same: a vector (matrix) of 1 row and 5 columns. It is up to you.


2 Answers

Try

[p,q] = meshgrid(vec1, vec2); pairs = [p(:) q(:)]; 

See the MESHGRID documentation. Although this is not exactly what that function is for, but if you squint at it funny, what you are asking for is exactly what it does.

like image 157
2 revs Avatar answered Oct 14 '22 10:10

2 revs


You may use

a = 1:4; b = 1:3; result = combvec(a,b); result = result' 
like image 24
efirvida Avatar answered Oct 14 '22 12:10

efirvida