Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
 
 
主题工具 显示模式
旧 2019-12-10, 20:41   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 MATLAB:比较字符串的单元格数组

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

例如:

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列出的两个解决方案(使用ISMEMBERSTRCMP / 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溶液是显著慢。



更多&回答...
poster 当前离线   回复时引用此帖
 


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 06:55


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.