Asked by mohamed Faraj
on 13 Aug 2019

I have a number of vectors, probably with different lengths, e.g., a=[1 2 3], b=[4 5 6 7] and c=[8 9 10 11 12]. From a, b and c I have 3*4*5=60 possible points, e.g., one possibility is (1,4,8). If I know the number of vectors and the length of each vector in advance, this is easy to program. However, I want to write a general code that can find all these combinations regardless of the number of vectors and their individual lengths

Answer by John D'Errico
on 13 Aug 2019

Accepted Answer

Don't store your vectors separately. Instead, learn to use tools like cell arrays, which make things hugely more efficient.

V = {[1 2 3],[4 5 6 7],[8 9 10 11 12]};

Next, how do you use a cell array for this purpose? You pass the elements into ndgrid, using what is called acomma separated list. (Or meshgrid.) That is what you get when you type V{:}, a comma separated list. It allows you to pass in each element of the cell array into a function as if each element of the cell array was an argument of the function.

For example, if we did this:

[G1,G2,G3] = ndgrid(V{:});

Hmm. That creates three different arrays, that do contain all combinations of the elements of those vectors if you look carefully. But here we don't want to split the results into n different named arrays. We want a cell array as output. So now, try this:

C = cell(1,numel(V));

[C{:}] = ndgrid(V{:})

C =

1×3 cell array

{3×4×5 double} {3×4×5 double} {3×4×5 double}

Better. We have captured the output from ndgrid back into a cell array. But what we probably wanted was one flat array, with three columns, and here, 60 rows. We could convert each of those arrays into a column vector easily enough.

C = cellfun(@(X) reshape(X,[],1),C,'UniformOutput',false)

C =

1×3 cell array

{60×1 double} {60×1 double} {60×1 double}

And, now finally, just convert C into a flat array, using a tool like horzcat. (square brackets will suffice. That is...

C = horzcat(C{:})

C =

1 4 8

2 4 8

3 4 8

1 5 8

2 5 8

3 5 8

1 6 8

2 6 8

3 6 8

1 7 8

2 7 8

3 7 8

1 4 9

2 4 9

3 4 9

1 5 9

...

2 7 12

3 7 12

As you should see, nothing I did was dependent on the size of the arrays, the length of the vectors, the number of different vectors. That was all driven by the one initial cell array as I created it. Learn to use MATLAB, as it was designed to be used.

mohamed Faraj
on 16 Aug 2019

Thank you John. This was helpful. I wonder if you can help with this question

I have a cell array with a variable number of cells and a variable number of elements within each cell. For instance, it could by V{1}{1}=1 2 3 4, V{1}{2}=3 4 1 0,V{1}{3}=3 5 -1 -9, and V{2}{1}=-1 -2 9, V{2}{2}= 0 9 6, i.e., the cell 1 has 3 vectors of length 4 elements and the cell 2 has 2 vectors of length 3. I want to construct another cell array such that it has all combinations of these vectors, here I could have 6 combinations (3*2=6). The new cell array has to be of length 6 cells (number of possible combinations), and each cell has a possible combinations, for example A{1}={1 2 3 4 and -1 -2 9} and A{2}={1 2 3 4 and 0 9 6} . Note that I will get these vectors from a matlab code so I do not know them in advance.

Sign in to comment.

Answer by Adam Danz
on 13 Aug 2019

Edited by Adam Danz
on 13 Aug 2019

This solution requires that all vectors are placed into a single cell array. See comments for more detail.

% Demo data

a = 1:3;

b = 11:13;

c = -4:1;

d = 9;

% Put all vectors into cell array

allVecs = {a,b,c,d};

sub = cell(1,numel(allVecs));

[sub{:}] = ndgrid(allVecs{:});

sub = cellfun(@(x)x(:),sub,'UniformOutput', false);

% allPerms is [m x n] matrix of m permutations of n vectors

% m should equal prod(cellfun(@numel,allVecs))

% n should equal numel(allVecs)

allPerms = cell2mat(sub);

mohamed Faraj
on 14 Aug 2019

Adam Danz
on 14 Aug 2019

Sign in to comment.

Answer by Bruno Luong
on 13 Aug 2019

Edited by Bruno Luong
on 13 Aug 2019

a=[1 2 3], b=[4 5 6 7], c=[8 9 10 11 12]

C = {a,b,c}; % put you vectors here

n = length(C);

[C{:}] = ndgrid(C{:});

C = reshape(cat(n+1,C{:}),[],n)

Sign in to comment.

Opportunities for recent engineering grads.

Apply Today
## 1 Comment

## dpb (view profile)

## Direct link to this comment

https://es.mathworks.com/matlabcentral/answers/476022-how-to-pick-up-all-combination-of-numbers-from-multiple-vectors#comment_734744

Sign in to comment.