【问题标题】:Bitwise XOR operation to scramble two character matrices by generating a truth table通过生成真值表来打乱两个字符矩阵的按位异或运算
【发布时间】:2014-08-25 16:44:26
【问题描述】:

我需要对四个字符执行XOR 操作,其中每个字符都有如下的位表示:

 A = 00

 G = 01

 C = 10

 T = 11

我需要创建一个表格,将XORs 两个字符放在一起,以下列方式给出XORing 字符对的所有组合的值。

  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 位,然后使用结果并将其转换回正确的字符。比如查询表格的第三行第二列,由XORingCG

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 的每个元素都得到XORed,其对应的元素在B 中。

例如考虑第一行第一列:

A{1,1} XOR B{1,1} = GATT XOR ATAC = GTTG

如何对整个矩阵执行此操作?

【问题讨论】:

  • A=00 没有意义。也许A='00'A=[0 0] 或别的什么?
  • 另外作为一个例子,你能告诉我们xor(A,G)是什么吗?输出类型是什么 - 元胞数组或双数组或字符?
  • 我想通了。基本上,将这两个变量转换为它们的位表示,xor 每个位单独,然后进行反向查找。
  • @Divakar - 我知道 OP 想要什么。我已经编辑了帖子以使其更加清晰。这违反了 SO 政策,但这最终是 OP 想要传达的内容......所以我想我会为未来的读者编辑它。看看我的帖子,如果您有任何更有效的解决方案,我欢迎您!
  • @rayryeng 太棒了!您是这里的心理专家(+1);)您的解决方案对我来说看起来不错。无论如何,使用元胞数组,有效解决方案的数量是有限的。

标签: matlab matrix


【解决方案1】:

看起来你又回来了!

首先,让我们定义函数letterXOR,它接受两个4 字符的字符串和XORs 这两个字符串对应于您拥有的那个表。 Recalling from our previous post,让我们建立一个查找表,其中一个唯一的两位字符串对应一个字母。我们可以使用collections.Map 类来帮助我们做到这一点。我们还需要使用collections.Map 类的inverse 查找表,其中给定一个字母,我们生成一个两位字符串。我们需要这样做,因为您想将每个字母转换为其两位表示,我们需要反向查找来执行此操作。之后,我们分别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 组成的字母字符数组。我们首先定义正向和反向查找。然后,我们将输入字符串 AB 的每个字符拆分为单个字符的元胞数组,因为在密码本中查找多个键需要这样。然后我们找出每个字符串中每个字符的位。这些位实际上是字符串,所以我们需要做的就是将每个位串转换成一个数字数组。我们只需将字符串转换为double 并减去48,即0 的ASCII 码。通过转换为double,您将得到 48 或 49,这就是我们需要用 48 减去的原因。

因此,每对位都被转换为一个1 x 2 位数组。然后我们获取AB 之间的每个1 x 2 位数组,使用bitxorXOR 位。此时的输出仍然是1 x 2 数组。因此,我们需要将每个数组转换为一串位,然后使用我们的正向查找表来查找这些位的等效字符。在此之后,我们将所有字符连接在一起以形成输出的最终字符串。


确保将上述内容保存在名为 letterXOR.m 的函数中。一旦我们有了这个,我们现在只需使用一个 cellfun 调用,它将 XOR 单元格数组中的每个四元素字符串,然后我们输出我们的最终矩阵。我们将使用arrayfun 来做到这一点,arrayfun 的输入将是一个5 x 5 矩阵,它是列主要定义的。我们这样做是因为 MATLAB 可以使用单个值访问二维数组中的元素。该值是矩阵中元素的列主索引。我们定义一个从 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'

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多