【问题标题】:string "cross correlation" in matlabmatlab中的字符串“互相关”
【发布时间】:2013-06-13 20:15:50
【问题描述】:

假设我有 2 个字符串:

AACCCGGAAATTTGGAATTTTCCCCAAATACG

CGATGATCGATGAATTTTAGCGGATACGATTC

我想知道我应该移动多少第二个字符串,使其与第一个字符串最匹配。

有两种情况。第一个是我们假设字符串被缠绕,第二个是我们没有。

是否有一个 matlab 函数可以返回一个 N 数组或 2N+1 数组值来表示移位后的字符串 2 与字符串 1 的相关程度?

如果没有,有没有比类似的方法更快/更简单的方法

result = zeroes(length, 1)
for i = 0:length-1
    result(i+1) = sum (str1 == circshift(str2, i));
end

【问题讨论】:

  • 您可能想看看 Bioinformatics Toolbox,其中包含 Smith-Waterman 和 Needleman-Wunsch 对齐算法的实现。

标签: matlab cross-correlation


【解决方案1】:

您可以将每个 char 转换为大小为 4 的二进制列:

A -> [1;0;0;0]
C -> [0;1;0;0]
G -> [0;0;1;0]
T -> [0;0;0;1]

因此,长度为 n 的字符串变为大小为 4-by-n 的二进制矩阵。

您现在可以交叉关联(仅沿 X 轴)这两个 n-by-4 和 m-by-4 以获得您的结果。

【讨论】:

  • 为什么是4-by-n矩阵?使用double(String) 将字符串转换为ASCII 代码并使用1-by-n(或n-by-1,如果您愿意)向量不是更简单吗?
  • @anandr - 好问题。如果您将字符串转换为数字(通过 ascii 或任何其他转换),您将在一个字符的数值和一个 不同 的数值之间具有 相关性。通过转换为二进制向量,不同字符的两个向量之间的相关性为
  • 好点。 +1 以更有效的方式解决我的一个老问题 :o)
  • 令人着迷。我想,转换将通过 for 循环完成?
  • @useretothepowerof2pi 一点也不!你可以很容易地使用查找表和向量化这个操作。
【解决方案2】:

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 的方法)。

【讨论】:

  • 但这不会给我一个他们匹配多少的数组,是吗?
  • “我想知道我应该移动第二个字符串多少,以使其与第一个字符串最匹配。”这就是我实现的......
  • 但只需删除max(...),您将获得所有班次的完整数组。
  • @RodyOldenhuis 有时你就是无法让他们开心... +1 提供好的解决方案(和耐心)
  • 确实,有些人天生不开心。嗯,我想n不会太大。所以这个解决方案会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 2011-09-11
相关资源
最近更新 更多