MATLAB: Creating a matrix with all possible group combinations

I'm running an experiment with lots of conditions, and particular numbers of groups in each condition.

A. 3 groups
B. 3 groups
C. 2 groups
D. 3 groups
E. 3 groups

I've worked out that there are 3×3×2×3×3 = 162 possible combinations of groups.

I want to create a MATLAB matrix with 162 rows and 5 columns. That is, one row for each combination and one column to indicate the value for each group.

So, for instance, the first row would be [1 1 1 1 1], indicating that this combination is group 1 for all conditions. The second row would be [1 1 1 1 2], indicating that it's group 1 for all conditions except for the last which is group 2. The 162nd and final row would be [3 3 2 3 3].

M = 1 1 1 1 1
    1 1 1 1 2
    .........
    3 3 2 3 3

What's the most efficient way to achieve this? I realise I could use a loop, but feel sure there's a better way. I thought maybe the perms function would work but I can't see how.

Upvotes: 1

Views: 204

Answers (1)

Matthias W.
Matthias W.

Reputation: 1077

You can use combvec (see last line, the rest is only generating test data):

% A. 3 groups
% B. 3 groups
% C. 2 groups
% D. 3 groups
% E. 3 groups

ngroups = zeros(5, 1);
ngroups(1) = 3;
ngroups(2) = 3;
ngroups(3) = 2;
ngroups(4) = 3;
ngroups(5) = 3;

v = {};
for i = 1:length(ngroups)
    v{i} = 1:ngroups(i) % generate a vector of valid group indices
end

% get all possible combinations
x = combvec( v{:} )

As this will return a 5 x 162 double you need to transpose the resulting matrix x:

x.'

Upvotes: 1

Related Questions