如何在递归场景下进行异或
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
在您重新定义问题后编辑了答案
我有一个 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
在您重新定义问题后编辑了答案