2016-04-03 3 views
1

Я выполняю эксперимент с большим количеством условий и конкретным количеством групп в каждом условии.MATLAB: Создание матрицы со всеми возможными групповыми комбинациями

A. 3 группы
B. 3 группы
C. 2 группы
D. 3 группы
E. 3 группы

я работал, что есть 3 × 3 × 2 × 3 × 3 = 162 возможных комбинаций групп.

Я хочу создать матрицу MATLAB с 162 строками и 5 столбцами. То есть одна строка для каждой комбинации и один столбец для указания значения для каждой группы.

Так, например, первая строка будет [1 1 1 1 1], указывая, что эта комбинация является группой 1 для всех условий. Вторая строка будет [1 1 1 1 2], указывая, что это группа 1 для всех условий, за исключением последней, которая является группой 2. 162-я и последняя строка будут [3 3 2 3 3].

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

Каков наиболее эффективный способ достичь этого? Я понимаю, что могу использовать петлю, но я уверен, что есть лучший способ. Я думал, может быть, функция perms будет работать, но я не вижу, как это сделать.

+0

Привет. Я думаю, что цикл - хорошая идея, чтобы начать. Мне также было бы интересно, если бы был быстрый метод. Вы уже пробовали использовать петлевый подход? –

+0

Я сделал, и так как это только появляется в моем коде, как только замедление на самом деле не ощутимо. Я спрашиваю больше с точки зрения того, чтобы пытаться кодировать лучше, чем иметь сильную потребность в улучшении скорости. – user1205197

+0

Я добавил ответ. ;) –

ответ

1

Вы можете использовать combvec (см, последнюю строку, остальное только для генерации тестовых данных):

% 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{:}) 

Как это будет возвращать 5 x 162 double вам нужно перенести полученную матрицу x:

x.'