如何使用逻辑索引找到DNA序列子集的互补?

时间:2016-12-21 18:27:39

标签: matlab indexing dna-sequence

我有一个DNA序列,其长度例如是m * 4n:

B = 'GATTAACTACACTTGAGGCT...';

我还有一个实数X = {xi,i = 1..m * 4n}的向量,并使用mod(X,1)将它们保持在[0,1]范围内。例如:

X = [0.223 0.33 0.71 0.44 0.91 0.32 0.11 ....... m*4n];

然后我需要通过应用函数将X转换为二进制向量:

f(x)={0  ,0 < X(i,j) ≤ 0.5;  1 ,0.5 < X(i,j) ≤ 1;)

根据先前值的输出将类似于X = [0010100 ....]。如果X(i,j)==1,则补充B(i,j),否则不变。在这种情况下,补体是匹配的碱基对(即A-> T,C-> G,G-> C和T->)。

这是我到目前为止尝试过的代码,没有成功:

%%maping X chaotic sequence from real numbers to binary sequence using threshold function
 X = v(:,3); 
 X(257)=[];
 disp (X);
 mode (X,1);
 for i=1
    for j=1:256
 if ((X(i,j)> 0) && (X(i,j)<= .5))
     X(i,j) = 0;
 elseif ((X(i,j)> .5) && (X(i,j)<= 1)) 
     X(i,j) = 1;
 end
    end
 end
 disp(X);

如何正确执行索引和补充?

1 个答案:

答案 0 :(得分:1)

给定存储为字符数组的样本碱基对序列:

B = 'GATTAACT';

数值的样本向量与B的长度相同:

X = [0.223 0.33 0.71 0.44 0.91 0.32 0.11 1.6];

然后有一个相当简单的解决方案......

首先,您使用mod函数意味着您只想使用X中每个值的小数部分。这就是你如何做到这一点:

>> X = mod(X, 1)
X =
    0.2230    0.3300    0.7100    0.4400    0.9100    0.3200    0.1100    0.6000

接下来,您应该阅读documentation on vectorization。它将教你在MATLAB中的许多操作都可以避免for循环。特别是,对矢量X应用逻辑测试可以这样完成:

>> index = (X > 0.5)
index =
    0   0   1   0   1   0   0   1

index现在logical indexX的长度相同,每个值大于0.5,其中一个(即为真)。您现在想要在B中获取与这些索引相对应的字符,将它们更改为其补码,然后将它们放回B。你可以在MATLAB中使用一个小技巧来做到这一点,当用作索引时,字符被转换为ASCII数值:

>> compMap = '';  % Initialize to an empty string
>> compMap('ACGT') = 'TGCA'
compMap =
                                                                T G   C            A

请注意,'TGCA'的字符compMap位于'ACGT'的索引65,67,71和84中(即>> B(index) = compMap(B(index)) B = GAATTACA 的ASCII值)。其余的都是空白。现在,您只需执行以下操作即可将索引的碱基对替换为其补码:

B = '...';     % Whatever your sequence is
X = [...];     % Whatever your values are
compMap = '';
compMap('ACGT') = 'TGCA';      % Build a complement map
index = (mod(X, 1) > 0.5);     % Get your logical index
B(index) = compMap(B(index));  % Replace with complements

将所有这些放在一起,这是解决方案:

<?php 
$link = mysql_connect('callingonchristcom.ipagemysql.com', 'jhedge', 'mypw'); 
if (!$link) { 
die('Could not connect: ' . mysql_error()); 
} 
echo 'Connected successfully'; 
mysql_select_db('user',$link); 
echo 'Step Two';
$mysqlstr="INSERT INTO users (FirstName,LastName,UserName,Password) VALUES  ('John','Hedge','jhedge','mypw')";
echo 'Step Three';
mysql_query($mysqlstr,$link);
echo 'Step Four';
mysql_close($link);
?>