Как я могу создать все комбинации символов в наборах текста? - PullRequest
3 голосов
/ 11 апреля 2011

Например, у меня есть такие наборы текста:

Столбец 1:

a
b

Столбец 2:

l
m
n

Столбец 3:

v
w
x
y

И я хочу объединить их, чтобы получить такой вывод:

alv
alw
alx
aly
amv
amw
amx
amy
...

, который будет выводить 24 комбинации текста.Если бы я использовал только первые два столбца, он вывел бы комбинации 2 * 3 = 6.

Я не могу понять, как это сделать в MATLAB.Есть предложения?

1 Ответ

3 голосов
/ 11 апреля 2011

Одним из решений является использование функции 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{:});
...