2013-05-16 28 views
4

基本上,我有两个等长的字符串,比如说'AGGTCT'和'AGGCCT'。我想按位置比较他们的位置,并获得他们不匹配时的读数。所以在这里我希望得到1,因为只有1个位置他们在位置4不匹配。如果任何人有位置比较代码的想法,这将帮助我很多开始。Matlab - 如何比较两个字符串的字母?

谢谢!

+0

是的,我只是想要出现不匹配的数量以用于其他目的。 – user2180513

+1

好的。那么Shai的回答正是你想要的。 – jonhopkins

+0

我猜你的问题是你正在处理的DNA序列只有4个字符 - A,G,C,T。在这种情况下,我强烈建议将它们表示为双精度编码数组,并且只有在需要将它们展示给用户时才转换为字符串。所有你需要的操作将变得更快更方便 –

回答

11

使用下面的语法来获得不同的字符数为同等大小的字符串:

sum(str1 ~= str2) 

如果你想不区分大小写,使用方法:

sum(lower(str1) ~= lower(str2)) 

表达str1 ~= str2执行烧焦按字符比较两个字符串,产生与字符串大小相同的逻辑向量,其中true与它们匹配的地方不匹配(使用~=)和false。为了得到你的结果,简单地总结true值的数量(不匹配)。

编辑:如果要算匹配字符的数量,您可以:

  1. 使用“等于” ==运营商(而不是“不等于” ~=运营商):

    sum(str1 == str2) 
    
  2. 减去失配的数量,从该总数:

    numel(str1) - sum(str1 ~= str2) 
    
+0

是的,我只是想将不匹配的数目应用于其他目的。 Shai你的代码似乎完美地满足了我的需求。谢谢! – user2180513

+0

假设你想总结'falses'(匹配),你能够在两个字符串中插入其他东西吗? – user2180513

+0

@ user2180513你应该看看[关系运算符](http://www.mathworks.com/help/matlab/matlab_prog/operators.html)。你可以使用'=='比较 – Shai

1

您可以比较字符串的所有元素:

r = all(seq1 == seq2) 

这将炭炭相比较,如果所得数组中的所有元素都为真返回true。如果字符串可以有不同的大小,您可能需要先比较大小。另一种方法是

r = any(seq1 ~= seq2) 

另一种解决方案是使用strcmp

r = strcmp(seq1, seq2) 
+1

您应该使用'strcmp()',因为它允许您比较不同长度的字符串。虽然'seq1 == seq2'假定它们具有相同的长度。即你不能像'John'=='Bob''那样比较它,但你可以使用'strcmp'('John','Bob')'。 – Ufos

0

只是想指出的是,你要求计算hamming distance(如你要求的替代品 - 文章包含指向一些)。这已经被讨论here。总之内置命令pdist可以做到这一点。