我有 2 个单元格数组,如下所示:
A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};
在这种情况下,不同元素的数量为 3。
在数字数组中,我可以length(find(A ~= B));
轻松地一步计算不同元素的数量。
字符元胞数组有类似的东西吗?
我有 2 个单元格数组,如下所示:
A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};
在这种情况下,不同元素的数量为 3。
在数字数组中,我可以length(find(A ~= B));
轻松地一步计算不同元素的数量。
字符元胞数组有类似的东西吗?
尝试
cell2mat(A)==cell2mat(B)
首先,其余的应该是直截了当的。如果单元阵列的维度不同,这种简单的方法将失败。
如果您的元胞数组是字符串元胞数组,您可以使用 STRCMP:
sum(~strcmp(A,B))
当然要确保A
和B
有相同的长度。
顺便说一下,对于数值数组,使用sum(A~=B)
. 一般find
比较慢。
编辑:我想我误解了你的问题,你可能的意思是在数组的相应位置找到不同的元素。我仍然保留我的旧答案
yuk 的做法strcmp
是正确的。但是,它仅在两个数组大小相同时才有效。广义的解决方案是:
N = min(numel(A), numel(B));
sum(~strcmp(A(1:N), B(1:N))) + numel(A) + numel(B) - 2 * N
如果数组的长度不同,则较大数组中的“额外”元素将在此处计为不同。
最通用的方法是使用ismember
,它不关心字符串的长度或它们在数组中的位置。A
要计算和中不同的元素总数B
,只需执行以下操作:
sum(ismember(A, B)) + sum(ismember(B, A))
setdiff
使用(而不是)也可以获得相同的效果ismember
:
numel(setdiff(A, B)) + numel(setdiff(B, A))
这两种方式对任何两个数组都有效,不一定大小相等。
如果您给出的示例中给出了 A 和 B,您也可以尝试 unique([AB]) 。它 A 和 B 的尺寸不同,你可以试试这个。
独特的(重塑(cell2mat(A,1,[])),重塑(cell2mat(B,1,[])))