按位XOR运算通过生成真值表来扰乱两个字符矩阵

阿比拉米·安巴拉根(Abirami Anbalagan)

我需要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荷兰国际集团CG

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,使的每个元素与中的对应元素一起AXORed 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预计是的被由字母字符数组ATGC我们首先定义正向和反向查找。然后,我们分手了输入字符串的每一个字符A,并B为单个字符的单元阵列,如查找在你的码本的多个密钥要求它这样。然后,我们找出每个字符串中每个字符的位。这些位实际上是字符串,因此我们需要做的是将每个位字符串转换为数字数组我们只需将字符串转换为double并减去48,这是的ASCII码0通过转换为double,您将得到48或49,这就是为什么我们需要用48减去。

这样,每一对位都转换为1 x 2位数组。然后,我们把每1 x 2比特之间的排列AB,使用bitxorXOR了位。此时的输出仍然是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

两个字符的按位与运算符将打印错误的结果

来自分类Dev

在Excel中生成真值表

来自分类Dev

如何通过添加两个字符串来指定图片框?

来自分类Dev

减去两个字符

来自分类Dev

Spark-Scala:通过串联两个字符串变量来获取数据帧变量

来自分类Dev

生成真值表,但在python中保留一些未定义的变量

来自分类Dev

如何在两个字符串上使用XOR“ ^”

来自分类Dev

按前两个字符将列分组为两组

来自分类Dev

矩阵中两个字符串的最大nchar

来自分类Dev

CNF按真值表

来自分类Dev

比较两个字符串时,运算符<或>如何工作?

来自分类Dev

bash比较运算符在两个字符串之间的问题

来自分类Dev

用equal(==)运算符比较两个字符串

来自分类Dev

比较两个字符串时,运算符<或>如何工作?

来自分类Dev

仅使用循环来区别两个字符串

来自分类Dev

为什么通过计算字符的异或比较两个字符串?

来自分类Dev

如何在两个字符串中按句子找到不同的单词?

来自分类Dev

熊猫:按数据框行索引的前两个字符分组

来自分类Dev

按行比较dataframe中的两个字符串列

来自分类Dev

按字典顺序比较XPath中的两个字符串

来自分类Dev

在Tableau中按列的前两个字符分组吗?

来自分类Dev

检查转换为lower()的两个字符串是否按预期工作

来自分类Dev

按字典顺序比较两个字符串

来自分类Dev

如何按字母顺序合并两个字符串?

来自分类Dev

从两个字符串生成哈希。无需订购

来自分类Dev

看到两个字符串是通过递归相互反映

来自分类Dev

通过最后两个字符定位元素

来自分类Dev

如何通过串联两个字符串在Shell脚本中调用别名?

来自分类Dev

通过for循环以角度连接两个字符串

Related 相关文章

热门标签

归档