Метод поиска соответствия последовательностей (Matlab + Chain Code)

У меня есть несколько последовательностей кода цепочки, например:

20000600666644644424422220

0670064442422

02005066646424222

Я хочу найти и сопоставить шаблон кода цепочки 066664464 в приведенной ниже последовательности кода цепочки. Я хочу, чтобы он частично совпадал с любым из них (в данном случае он соответствует первой последовательности кода цепочки). Если он может найти, значит, мой шаблон приемлем.

Я пытаюсь найти, как называется этот метод/функция, особенно для использования в Matlab. Например, идея алгоритма Нидлмана-Вунша, который используется в биоинформатике для выравнивания белковых или нуклеотидных последовательностей, довольно близка к тому, что я хочу сделать, но с простыми числами, а не с белками.

Есть идеи?


person syakey    schedule 03.09.2015    source источник
comment
Если ваши последовательности являются строками, вы можете использовать strfind   -  person buzjwa    schedule 03.09.2015
comment
@Naveh, мои последовательности - это не строки, это числовые данные.   -  person syakey    schedule 04.09.2015
comment
Оказывается, это работает так же хорошо для числовых данных! Посмотрите мой ответ :)   -  person buzjwa    schedule 05.09.2015


Ответы (2)


Для поиска шаблонов как в числовых массивах, так и в строках вы можете использовать strfind. . Первоначально предназначенный для строк, он отлично работает и с числовыми данными:

%// Find a pattern in a string
data = '20000600666644644424422220';
pattern = '066664464';
idx1 = strfind(data, pattern); %// idx1 = 8
%// Find a pattern in numerical data
data = str2num(data')';
pattern = str2num(pattern')';
idx2 = strfind(data, pattern); %// idx2 = 8

Хотя использование strfind для числовых данных не самый эффективный метод, его простота использования во многих случаях перевешивает его неэффективность (если ваши данные не очень велики).

Для получения дополнительной информации и более эффективных методов ознакомьтесь с этим поучительный пост в блоге Лорен Шур. И вот вопрос, связанный с на сайте.

person buzjwa    schedule 05.09.2015

Как уже упоминалось sykey, проще всего просто использовать функцию strfind

if(~isempty(strfind(num2str(chaincode), num2str(template))))
   % // match
else
   % // no match
end
person rst    schedule 03.09.2015
comment
а если это массив данных? - person syakey; 04.09.2015
comment
Затем вы должны пройти через него, по крайней мере, если вы используете этот метод для сравнения - person rst; 04.09.2015