如何使用逻辑索引找到 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 index 与 X
相同的长度,每个大于 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
我有一个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 index 与 X
相同的长度,每个大于 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