我有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)
知道我哪里出错了,真的很有帮助。谢谢。
答案 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
重新定义问题后已编辑的答案