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
ingC
和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);)我觉得你的解决方案不错。对于单元阵列,有效解决方案的数量是有限的。