Вы можете сделать это с помощью цикла, но bsxfun
более кратким (и, вероятно, быстрее) и дает те же результаты:
A = 'ABCDEFGHIJKA'; %// I shortened the variable names...
B = 'ABCHIKABTIYO'; %// because I don't like typing.
C = bsxfun(@eq, B, A')
C =
1 0 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 0
Каждая строка C
является 1
, где соответствующий элемент из A
происходит в B
, Например, строка 9
дает все вхождения буквы I
в последовательности B
.
Это также работает в тех случаях, когда последовательности имеют разную длину:
>> D = [B B]
D = ABCHIKABTIYOABCHIKABTIYO
>> bsxfun(@eq, D, A')
ans =
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
Подсказка: Посмотрите, что 'DNASequence2 == DNASequence1 (1)' дает вам. – beaker
Выполняет ли это эту работу? 'sum (~ bsxfun (@ минус, dna1, dna2 '), 1)' – hbaderts
боится не hbaderts. спасибо @beaker, я понимаю результат, который сейчас производит. попробуем придумать код! – user5655305