假设我有2个字符串:
AACCCGGAAATTTGGAATTTTCCCCAAATACG
CGATGATCGATGAATTTTAGCGGATACGATTC
我想找到我应该多少移动第二个字符串,使其与第一个字符串最匹配。
有2例。第一个是我们假设字符串被缠绕,第二个是我们没有。
是否有一个matlab函数可以返回一个N数组或2N + 1个值数组,以确定移位的字符串2与字符串1的相关程度是多少?
如果没有,是否有比
更快/更简单的方法result = zeroes(length, 1)
for i = 0:length-1
result(i+1) = sum (str1 == circshift(str2, i));
end
答案 0 :(得分:5)
您可以将每个char转换为大小为4的二进制列:
A -> [1;0;0;0]
C -> [0;1;0;0]
G -> [0;0;1;0]
T -> [0;0;0;1]
因此,长度为n
的字符串将变为大小为4
的二进制矩阵 - 按 - n
。
您现在可以交叉关联(仅限X轴)两个n
- by-4和m
- by-4以获得结果。
答案 1 :(得分:4)
带帽子提示John d'Errico:
str1 = 'CGATGATCGATGAATTTTAGCGGATACGATTC';
str2 = 'AACCCGGAAATTTGGAATTTTCCCCAAATACG';
% the circulant matrix
n = length(str2);
C = str2( mod(bsxfun(@plus,(0:n-1)',0:n-1),n)+1 ); %//'
% Find the maximum number of matching characters, and the amount
% by which to shift the string to achieve this result
[score, shift] = max( sum(bsxfun(@eq, str1, C), 2) );
更快,是的,更简单......好吧,我会把它留给你决定:)
请注意,此方法会将内存换成速度。也就是说,它在内存中创建所有可能的移位矩阵(有效地),并将该字符串与该矩阵的所有行进行比较。该矩阵将包含N²
个元素,因此如果N
变大,最好使用循环(或Shai的方法)。