如何在递归场景中执行XOR

时间:2015-04-19 06:24:27

标签: matlab matrix binary xor

我有1x5字符矩阵。我需要对矩阵中的所有元素执行按位XOR运算。如果T是char矩阵,我需要一个矩阵T'这样

         T'= T XOR (T-1)'  for all T
             T             for T=1    

让char矩阵为T

   T=['0000000000110111' '0000000001000001' '0000000001001010'  '0000000010111000'  '0000000000101111']
   T'=['0000000000110111' '0000000001110110' '0000000000111100' '0000000010000100' '0000000010101011']

即;保留第一个元素,我需要用新形成的矩阵对所有其他元素进行异或。我尝试了以下代码,但我无法得到正确的结果。

     Yxor1d = [T(1) cellfun(@(a,b) char((a ~= b) + '0'), T(2:end), T'(1:end-1), 'UniformOutput', false)]

我需要执行XOR操作,以便获得T'

的元素
T' (2)= T(2) XOR T' (1)
T' (3)= T(3) XOR T' (2)

知道我哪里出错了,真的很有帮助。谢谢。

2 个答案:

答案 0 :(得分:4)

当预期单元格数组作为输入时,您正在使用cellfun。您正在使用字符数组,而您实际执行的操作是从这5个字符串中取出每个字符串并从中创建单个字符数组。将这些字符串链接在一起实际上是在执行字符串联。

你可能不希望这样。要解决此问题,您只需通过放置T字符而不是数组({})字符来使[]成为单元格数组,以声明您的字符:

T={'0000000000110111' '0000000001000001' '0000000001001010'  '0000000010111000'  '0000000000101111'};

由于您在我提供答案后编辑了您的帖子,因此我之前使用cellfun的答案现在不正确。由于您使用的是重复关系,而您指的是先前的输出而不是输入,因此您无法再使用cellfun。您需要使用for循环。可能有更优雅的方法可以做到这一点,但如果你想让事情有效,这是最简单的方法。

因此,初始化一个与输入单元数组大小相同的输出单元数组,然后你需要初始化第一个单元格作为输入的第一个单元格,然后遍历每对输入和输出元素。

所以做这样的事情:

Yxor1d = cell(1,numel(T));
Yxor1d{1} = T{1};
for idx = 2 : numel(T)
    Yxor1d{idx} = char(double(T{idx} ~= Yxor1d{idx-1}) + '0');
end

对于i的每个值T',我们使用T{i}的当前输入与前一个T'{i-1}输出进行异或。

使用上面的输入单元格数组T,我们得到:

Yxor1d = 

  Columns 1 through 3

    '0000000000110111'    '0000000001110110'    '0000000000111100'

  Columns 4 through 5

    '0000000010000100'    '0000000010101011'

这与您修改过的帖子中的规格相符。

答案 1 :(得分:3)

编辑:有一个没有循环的解决方案:

T=['0000000000110111';'0000000001000001';'0000000001001010';'0000000010111000' ;'0000000000101111'];

Yxor = dec2bin(bi2de(mod(cumsum(de2bi(bin2dec(T))),2)),16)
Yxor =
0000000000110111
0000000001110110
0000000000111100
0000000010000100
0000000010101011

这使用了您有效地希望对阵列元素进行累积 xor操作的事实。
对于N布尔值,它应该是其中任何一个或者全部。因此,如果您对每个位执行累计sum,则对于'xor'的真实答案,总和应该是奇数。

上面的一个衬里可以像下面这样分解:

Y = bin2dec(T) ;            %// convert char array T into decimal numbers
Y = de2bi( Y ) ;            %// convert decimal array Tbin into array of "bit"
Y = cumsum(Y) ;             %// do the cumulative sum on each bit column
Y = mod(Y,2) ;              %// convert all "even" numbers to '0', and 'odd' numbers to '1'
Y = bi2de(Y) ;              %// re-assemble the bits into decimal numbers
Yxor = dec2bin(Y,16) ;      %// get their string representation

请注意,如果您乐意处理位数(布尔值)而不是字符数组,则可以从上面删除几行; - )


初步回答(更容易掌握,但有一个循环):

您可以使用bitxor函数,但必须首先将char数组转换为数值:

T=['0000000000110111';'0000000001000001';'0000000001001010' ;'0000000010111000' ;'0000000000101111'];
Tbin = bin2dec(T) ; %// convert to numeric values

Ybin = Tbin ;  %// pre-assign result, then loop ...
for idx = 2 : numel(Tbin)
    Ybin(idx) = bitxor( Ybin(idx) , Ybin(idx-1) ) ;
end

Ychar = dec2bin(Ybin,16) %// convert back to 16bit char array representation if necessary

Ychar =
0000000000110111
0000000001110110
0000000000111100
0000000010000100
0000000010101011
重新定义问题后

已编辑的答案