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

How can I find the complement of a subset of a DNA sequence using a logical index?

我有一个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->A)。

这是我迄今为止尝试过的代码,但没有成功:

%%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);

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

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

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 中的一个小技巧来完成此操作,即在使用 as 索引时将字符转换为其 ASCII 数值:

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

注意字符 'TGCA' 被放置在 compMap 的索引 65、67、71 和 84 中(即 'ACGT' 的 ASCII 值)。其余为空白。现在,您只需执行以下操作即可将索引碱基对替换为它们的补码:

>> B(index) = compMap(B(index))
B =
GAATTACA

综上所述,这是解决方案:

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