我需要XOR
对四个字符执行操作,其中每个字符都有如下所示的位表示形式:
A = 00
G = 01
C = 10
T = 11
我需要创建一个表,该表将XOR
两个字符放在一起,XOR
以下面的方式给出ing对字符的所有组合的值。
XOR A G C T
A A G C T
G G A T C
C C T A G
T T C G A
要获得输出,您需要将每个字符转换成其位表示形式,即位XOR
,然后使用结果并将其转换回正确的字符。例如,咨询第三行和表中的第二列中,由XOR
荷兰国际集团C
和G
:
C = 10
G = 01
C XOR G = 10 XOR 01 = 11 --> T
我最终希望将此规则应用于5 x 5矩阵中的加扰字符。举个例子:
A = 'GATT' 'AACT' 'ACAC' 'TTGA' 'GGCT'
'GCAC' 'TCAT' 'GTTC' 'GCCT' 'TTTA'
'AACG' 'GTTA' 'ACGT' 'CGTC' 'TGGA'
'CTAC' 'AAAA' 'GGGC' 'CCCT' 'TCGT'
'GTGT' 'GCGG' 'GTTT' 'TTGC' 'ATTA'
B = 'ATAC' 'AAAT' 'AGCT' 'AAGC' 'AAGT'
'TAGG' 'AAGT' 'ATGA' 'AAAG' 'AAGA'
'TAGC' 'CAGT' 'AGAT' 'GAAG' 'TCGA'
'GCTA' 'TTAC' 'GCCA' 'CCCC' 'TTTC'
'CCAA' 'AGGA' 'GCAG' 'CAGC' 'TAAA'
我想生成一个矩阵C
,使的每个元素与中的对应元素一起A
被XOR
ed B
。
例如,考虑第一行和第一列:
A{1,1} XOR B{1,1} = GATT XOR ATAC = GTTG
如何为整个矩阵做到这一点?
看起来您又回来了!
首先,让我们定义一个函数letterXOR
,该函数接受两个4个字符的字符串,并将XOR
两个字符串都与您拥有的表相对应。回想一下上一篇文章,我们建立一个查找表,其中一个唯一的两位字符串对应一个字母。我们可以使用collections.Map
该类来帮助我们做到这一点。我们还需要使用一个类的逆查找表collections.Map
,给定一个字母,我们将产生一个两位字符串。我们需要执行此操作,因为您要将每个字母转换为两位表示,并且需要进行反向查找。之后,我们分别XOR
进行位操作,然后使用正向查找表返回到我们开始的位置。因此:
function [out] = letterXOR(A,B)
codebook = containers.Map({'00','11','10','01'},{'A','T','G','C'}); %// Lookup
invCodebook = containers.Map({'A','T','G','C'},{'00','11','10','01'}); %// Inv-lookup
lettersA = arrayfun(@(x) x, A, 'uni', 0); %// Split up each letter into a cell
lettersB = arrayfun(@(x) x, B, 'uni', 0);
valuesA = values(invCodebook, lettersA); %// Obtain the binary bit strings
valuesB = values(invCodebook, lettersB);
%// Convert each into a matrix
valuesAMatrix = cellfun(@(x) double(x) - 48, valuesA, 'uni', 0);
valuesBMatrix = cellfun(@(x) double(x) - 48, valuesB, 'uni', 0);
% XOR the bits now
XORedBits = arrayfun(@(x) bitxor(valuesAMatrix{x}, valuesBMatrix{x}), 1:numel(A), 'uni', 0);
%// Convert each bit pair into a string
XORedString = cellfun(@(x) char(x + 48), XORedBits, 'uni', 0);
%// Access lookup, then concatenate as a string
out = cellfun(@(x) codebook(x), XORedString);
让我们慢慢看一下上面的代码。输入到letterXOR
预计是的被由字母字符数组A
,T
,G
和C
。我们首先定义正向和反向查找。然后,我们分手了输入字符串的每一个字符A
,并B
为单个字符的单元阵列,如查找在你的码本的多个密钥要求它这样。然后,我们找出每个字符串中每个字符的位。这些位实际上是字符串,因此我们需要做的是将每个位字符串转换为数字数组。我们只需将字符串转换为double
并减去48,这是的ASCII码0
。通过转换为double
,您将得到48或49,这就是为什么我们需要用48减去。
这样,每一对位都转换为1 x 2
位数组。然后,我们把每1 x 2
比特之间的排列A
和B
,使用bitxor
到XOR
了位。此时的输出仍然是1 x 2
数组。因此,我们需要将每个数组转换为一串位,然后使用正向查找表来查找这些位的等效字符。此后,我们将所有字符连接在一起,以构成输出的最终字符串。
确保将以上内容保存在名为的函数中letterXOR.m
。一旦有了这个,我们现在只需要使用一个cellfun
调用即可对您的单元格数组中的每个四元素字符串进行XOR,然后输出最终矩阵。我们将使用它arrayfun
来完成操作,并且输入arrayfun
将是一个5 x 5
列主要定义的矩阵。我们这样做是因为MATLAB可以使用单个值访问2D数组中的元素。该值是矩阵中元素的列主索引。我们定义一个从1到25的矢量,然后使用它reshape
来将其转换为正确的2D形式。之所以需要这样做,是因为我们要确保输出矩阵(C
在您的示例中)的结构相同。因此:
ind = reshape(1:25, 5, 5); %// Define column major indices
C = arrayfun(@(x) letterXOR(A{x},B{x}), ind, 'uni', 0); % // Get our output matrix
我们的最终输出C
是:
C =
'GTTG' 'AACA' 'ATCG' 'TTAC' 'GGTA'
'CCGT' 'TCGA' 'GACC' 'GCCC' 'TTCA'
'TATT' 'TTCT' 'ATGA' 'TGTT' 'ATAA'
'TGTC' 'TTAC' 'ATTC' 'AAAG' 'AGCG'
'TGGT' 'GTAG' 'AGTC' 'GTAA' 'TTTA'
祝你好运!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句