2014-02-18 2 views
3

Пусть у меня есть последовательность:Как рассчитать возможные подпоследовательности слов, соответствующие шаблону?

Seq = 'hello my name' 

и строка:

Str = 'hello hello my friend, my awesome name is John, oh my god!' 

А потом я смотрю на матчи для моей последовательности в строке, так что я получаю «слово» индекс каждого матча для каждого слова последовательности в массиве ячеек, поэтому первым элементом является ячейка, содержащая совпадения для «hello», второй элемент содержит совпадения для «my», а третий для «name».

Match = {[1 2];  %'hello' matches 
      [3 5 11]; %'my' matches 
      [7]}  %'name' matches 

мне нужен код, чтобы каким-то образом получить ответ о том, что возможные совпадения суб-последовательности являются:

Answer = [1 3 7;  %[hello my name] 
       1 5 7;  %[hello my name] 
       2 3 7;  %[hello my name] 
       2 5 7;] %[hello my name] 

В таким образом, что «ответ» содержит все возможные упорядоченные последовательности (именно поэтому мое (слово 11) никогда не появляется в «Ответ», должно было бы быть «название» матч после позиции 11.

. Примечание: длина и количество матчей «Seq» может варьировать в

ответ

4

с л ength Matches может отличаться, вам нужно использовать comma-separated lists вместе с ndgrid для создания всех комбинаций (подход аналогичен используемому в this other answer). Затем отфильтровать комбинации, где индексы не увеличиваются, используя diff и logical indexing:

cc = cell(1,numel(Match)); %// pre-shape to be used for ndgrid output 
[cc{end:-1:1}] = ndgrid(Match{end:-1:1}); %// output is a comma-separated list 
cc = cellfun(@(v) v(:), cc, 'uni', 0) %// linearize each cell 
combs = [cc{:}]; %// concatenate into a matrix 
ind = all(diff(combs.')>0); %'// index of wanted combinations 
combs = combs(ind,:); %// remove unwanted combinations 

Желаемый результат в переменной combs. В вашем примере

combs = 
    1  3  7 
    1  5  7 
    2  3  7 
    2  5  7 
+0

Большое спасибо, он отлично работает! Я не знал функций ndgrid и cellfun, все равно должен понять, как это работает, потому что эти два шага мне не понятны, но я сам это сделаю. Спасибо, сэр! – ACenTe25

+0

@ ACenTe25 Не стесняйтесь спрашивать, нужно ли вам после изучения :-) –

+0

Думаю, я сейчас понимаю. Я мог бы получить аналогичный результат, даже если бы я написал '[cc {1: end}] = ndgrid (Match {1: end});' right? Единственным изменением будет порядок, в котором комбинации будут доставлены в «гребнях», если я правильно пойму. – ACenTe25

Смежные вопросы