2

我有 2 个单元格数组,如下所示:

A = {'S' 'M' 'N' 'E'};
B = {'E' 'M' 'Q' 'S'};

在这种情况下,不同元素的数量为 3。

在数字数组中,我可以length(find(A ~= B));轻松地一步计算不同元素的数量。

字符元胞数组有类似的东西吗?

4

4 回答 4

2

尝试

cell2mat(A)==cell2mat(B)

首先,其余的应该是直截了当的。如果单元阵列的维度不同,这种简单的方法将失败。

于 2013-03-08T14:43:30.110 回答
2

如果您的元胞数组是字符串元胞数组,您可以使用 STRCMP:

sum(~strcmp(A,B))

当然要确保AB有相同的长度。


顺便说一下,对于数值数组,使用sum(A~=B). 一般find比较慢。

于 2013-03-08T18:34:47.913 回答
2

编辑:我想我误解了你的问题,你可能的意思是在数组的相应位置找到不同的元素。我仍然保留我的旧答案

计算同一位置的不同元素

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))

这两种方式对任何两个数组都有效,不一定大小相等。

于 2013-03-10T10:15:14.633 回答
0

如果您给出的示例中给出了 A 和 B,您也可以尝试 unique([AB]) 。它 A 和 B 的尺寸不同,你可以试试这个。

独特的(重塑(cell2mat(A,1,[])),重塑(cell2mat(B,1,[])))

于 2013-03-09T03:29:48.783 回答