如何在递归场景下进行异或

How to perform XOR in a recursive scenario

我有一个 1x5 字符矩阵。我需要对 matrix.If 中的所有元素执行按位异或运算 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)

知道我去了哪里会很有帮助wrong.Thanks。

cell 数组需要作为输入时,您正在使用 cellfun。您正在使用一个 character 数组,而您实际做的是获取这 5 个字符串中的每一个并从中创建一个字符数组。将这些字符串链接在一起实际上是在执行字符连接。

您可能不希望这样。要解决此问题,您所要做的就是通过放置 {} 个字符而不是数组 ([]) 个字符来声明您的字符,从而使 T 成为元胞数组:

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

因为您在我提供答案后编辑了 post,所以我之前使用 cellfun 的答案现在不正确。因为您使用的是 recurrence 关系,您指的是先前的输出而不是输入,所以您不能再使用 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

对于 T' 的每个值 i,我们将 T{i} 的当前输入与 T'{i-1} 的先前输出进行 XOR。

使用以上内容和您的输入元胞数组 T,我们得到:

Yxor1d = 

  Columns 1 through 3

    '0000000000110111'    '0000000001110110'    '0000000000111100'

  Columns 4 through 5

    '0000000010000100'    '0000000010101011'

这与您修改后的 post.

中的规范相符

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

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函数,但您必须先将您的字符数组转换为数值:

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

在您重新定义问题后编辑了答案