Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我有两个字符串的单元格数组,我想检查它们是否包含相同的字符串(它们不必具有相同的顺序,也不知道它们的长度是否相同)。
例如: 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 ,该函数将返回不在两个单元格数组的交集中的值。如果返回空数组,则两个单元格数组包含相同的值: arraysAreEqual = isempty(setxor(a,b)); 编辑:一些性能指标... 既然您对性能度量感到好奇,所以我想我会对照Amro列出的两个解决方案(使用ISMEMBER和STRCMP / CELLFUN )测试我的解决方案的速度。我首先创建了两个大型单元格数组: 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解决方案具有一致的快速时序。如果a元素不在b ,则ISMEMBER解决方案的运行实际上会稍微快一些。这是由于短路&&跳过了计算的后半部分(因为我们已经知道a和b不包含相同的值)。然而,如果所有的值的a ,可以在b中, ISMEMBER溶液是显著慢。 更多&回答... |
![]() |
![]() |