【问题标题】:How to perform XOR in a recursive scenario如何在递归场景中执行 XOR
【发布时间】:2015-06-25 22:03:53
【问题描述】:

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

知道我哪里出错了会很有帮助。谢谢。

【问题讨论】:

  • 我们回答了您的问题吗?我们俩都编辑了我们的答案。

标签: matlab matrix binary xor


【解决方案1】:

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

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

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

因为您在我提供答案后编辑了您的帖子,所以我之前使用 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} 的先前输出进行异或。

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

Yxor1d = 

  Columns 1 through 3

    '0000000000110111'    '0000000001110110'    '0000000000111100'

  Columns 4 through 5

    '0000000010000100'    '0000000010101011'

这与您修改后的帖子中的规范相符。

【讨论】:

  • @Roshni191 - 好的。我想我知道你在说什么。让我修改我的帖子。
  • @Roshni191 - 是的,我就是这么做的。请检查我的编辑。有效果吗?
  • @Roshni191 - 酷!感谢你的接纳。祝你好运!
  • 很好地解释了元胞数组的构造...他的第一个数组全部水平连接在一个长字符串中...
  • 没问题。请考虑接受我们的答案之一。这告诉社区您不再需要帮助。祝你好运!
【解决方案2】:

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

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,则对于“异或”的正确答案,总和应该是奇数。

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

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

重新定义问题后编辑的答案

【讨论】:

  • 我的猜测是 OP 在手动计算中犯了一个错误......但是 OP 说我的输出是正确的......所以你的也一定是对的!顺便说一句,bitxor 做得很好。我会同意的,但是 OP 的解决方案非常接近工作,我想我会解决这个问题。
  • 我已经编辑了我的帖子。带来不便敬请谅解。对我想要的结果感到困惑。
  • @Roshni191,我也更正了我的答案,并添加了不同的方法。
  • 我比第一个解决方案更了解循环部分,尽管它似乎比循环小。非常感谢你@Hoki
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 2012-04-18
  • 2021-10-01
  • 1970-01-01
  • 2016-05-29
  • 2019-04-20
  • 2014-08-15
  • 2013-03-13
相关资源
最近更新 更多