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.
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.