Одним из решений является использование функции NDGRID для генерации всех комбинаций индексов в ваших наборах:
C = {'ab' 'lmn' 'vwxy'}; %# Cell array of text sets
sizeVec = cellfun('prodofsize',C); %# Vector of set sizes
[index3,index2,index1] = ndgrid(1:sizeVec(3),... %# Create all the index
1:sizeVec(2),... %# combinations for
1:sizeVec(1)); %# the sets
combMat = [C{1}(index1(:)); ... %# Index each corresponding cell of C and
C{2}(index2(:)); ... %# concatenate the results into one matrix
C{3}(index3(:))].';
И вы должны получить следующее для combMat
:
alv
alw
alx
aly
amv
amw
amx
amy
anv
anw
anx
any
blv
blw
blx
bly
bmv
bmw
bmx
bmy
bnv
bnw
bnx
bny
Если вы просто хотите получить комбинации для столбцов 1 и 2, удалите первые входные и выходные аргументы из вызова NDGRID и удалите C{3}(index3(:))
из вычисления combMat
.
Если вместо этого вы хотите, чтобы C
был массивом ячеек массивов строк вместо массива ячеек символьных массивов, вы все равно можете использовать точно такой же код выше.Единственная разница будет в том, что combMat
в конечном итоге станет массивом строк вместо массива символов.
ОБНОВЛЕНИЕ:
Я действительно создалобобщенное решение, которое может вычислять комбинации для любого числа наборов (либо символьных массивов, либо массивов ячеек строк).Вы можете найти его в этом ответе на тесно связанный вопрос .Чтобы воспроизвести приведенный выше пример, вы бы назвали его так:
combMat = allcombs(C{:});