登录论坛

查看完整版本 : MATLAB:比较字符串的单元格数组


poster
2019-12-10, 20:41
我有两个字符串的单元格数组,我想检查它们是否包含相同的字符串(它们不必具有相同的顺序,也不知道它们的长度是否相同)。

例如:

a = {'2' '4' '1' '3'}; b = {'1' '2' '4' '3'}; 要么

a = {'2' '4' '1' '3' '5'}; b = {'1' '2' '4' '3'}; 首先,我想到了strcmp但它需要循环一个单元格的内容并与另一个单元格进行比较。我也考虑通过使用类似ismember :

ismember(a,b) & ismember(b,a) 但后来我们不知道它们的长度是相同的(明显的不平等情况)。因此,如何在不编写过多的if / else情况下以最有效的方式执行此比较。



回答:

您可以使用函数SETXOR (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/setxor.html) ,该函数将返回不在两个单元格数组的交集中的值。如果返回空数组,则两个单元格数组包含相同的值:

arraysAreEqual = isempty(setxor(a,b));


编辑:一些性能指标...

既然您对性能度量感到好奇,所以我想我会对照Amro (https://stackoverflow.com/questions/3231580/matlab-comparison-of-cell-arrays-of-string/3231836#3231836)列出的两个解决方案(使用ISMEMBER (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html)和STRCMP (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/strcmp.html) / CELLFUN (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/cellfun.html) )测试我的解决方案的速度。我首先创建了两个大型单元格数组:

a = cellstr(num2str((1:10000).')); %'# A cell array with 10,000 strings b = cellstr(num2str((1:10001).')); %'# A cell array with 10,001 strings 接下来,我将每个解决方案运行了100次以获取平均执行时间。然后,我交换a和b并重新运行它。结果如下:

Method | Time | a and b swapped ---------------+---------------+------------------ Using SETXOR | 0.0549 sec | 0.0578 sec Using ISMEMBER | 0.0856 sec | 0.0426 sec Using STRCMP | too long to bother ;) 请注意, SETXOR (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/setxor.html)解决方案具有一致的快速时序。如果a元素不在b ,则ISMEMBER (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html)解决方案的运行实际上会稍微快一些。这是由于短路&& (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/logicaloperatorsshortcircuit.html)跳过了计算的后半部分(因为我们已经知道a和b不包含相同的值)。然而,如果所有的值的a ,可以在b中, ISMEMBER (http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html)溶液是显著慢。



更多&回答... (https://stackoverflow.com/questions/3231580)