matlab中的字符串“交叉相关”

时间:2013-06-13 20:15:50

标签: matlab cross-correlation

假设我有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

2 个答案:

答案 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变大,最好使用循环(或Shai的方法)。