Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 通过生成真值表对两个字符矩阵进行逐位异或运算_Matlab_Matrix - Fatal编程技术网

Matlab 通过生成真值表对两个字符矩阵进行逐位异或运算

Matlab 通过生成真值表对两个字符矩阵进行逐位异或运算,matlab,matrix,Matlab,Matrix,我需要对四个字符执行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位,然后使用结果并将其转换

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

 A = 00

 G = 01

 C = 10

 T = 11
我需要创建一个表,
XOR
s两个字符组合在一起,以下面的方式给出所有
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
ing
C
G
查阅表格的第三行和第二列:

C = 10
G = 01

C XOR G = 10 XOR 01 = 11 --> T
我最终希望将此规则应用于5x5矩阵中的置乱字符。 例如:

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
s这两个字符串都对应于您拥有的表,让我们设置一个查找表,其中唯一的两位字符串对应于一个字母。我们可以利用这个类来帮助我们做到这一点。我们还需要使用
collections.Map
类的inverse查找表,在给定一个字母的地方,我们生成一个两位字符串。我们需要这样做,因为您想要将每个字母转换为它的两位表示,我们需要反向查找来完成这项工作。之后,我们分别对位进行异或,然后使用前向查找表返回我们开始的位置。因此:

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

让我们慢慢地浏览上面的代码。
letterXOR
的输入应该是由
a
T
G
C
组成的字母字符数组。我们首先定义正向和反向查找。然后,我们将输入字符串
A
B
中的每个字符拆分为单个字符的单元格数组,因为在代码本中查找多个键需要这样做。然后我们计算出每个字符串中每个字符的位。这些位实际上是字符串,所以我们需要做的是将每个位字符串转换成一个数字数组。我们只需将字符串转换为
double
,然后减去48,这是
0
的ASCII码。通过转换为双精度,您将得到48或49,这就是为什么我们需要用48减去

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


确保将上述内容保存在名为
letterXOR.m
的函数中。一旦我们有了这个,我们现在只需要使用一个
cellfun
调用,它将对单元格数组中的每个四元素字符串进行异或运算,然后输出最终的矩阵。我们将使用来执行此操作,并且
arrayfun
中的输入将是一个
5x5
矩阵,该矩阵是列主定义的。我们这样做是因为MATLAB可以使用单个值访问2D数组中的元素。该值是矩阵中元素的列主索引。我们定义一个从1到25的向量,然后用它得到正确的2D形式。我们之所以需要这样做,是因为我们希望确保输出矩阵(在您的示例中是
C
)的结构与此相同。因此:

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


祝你好运

A=00
没有意义。也许是
A='00'
A=[0]
或其他什么?同样作为一个例子,你能告诉我们什么是
xor(A,G)
?输出类型是什么?单元格数组、双数组或字符?我想出来了。基本上,将这两个变量分别转换为它们的位表示形式,
xor
每个位,然后进行反向查找。@Divakar-我知道OP想要什么了。我对这篇文章进行了编辑,使其更加清晰。这与SO政策背道而驰,但这最终是OP想要传达的。。。所以我想我会为未来的读者编辑它。看看我的帖子,如果你有更有效的解决方案,我欢迎你@雷琳:太棒了!你是这里的精神主义者(+1);)我觉得你的解决方案不错。对于单元阵列,有效解决方案的数量是有限的。