![]() |
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情况下以最有效的方式执行此比较。 [B]回答:[/B] 您可以使用函数[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/setxor.html"]SETXOR[/URL] ,该函数将返回不在两个单元格数组的交集中的值。如果返回空数组,则两个单元格数组包含相同的值: arraysAreEqual = isempty(setxor(a,b)); [B]编辑:一些性能指标...[/B] 既然您对性能度量感到好奇,所以我想我会对照[URL="https://stackoverflow.com/questions/3231580/matlab-comparison-of-cell-arrays-of-string/3231836#3231836"]Amro[/URL]列出的两个解决方案(使用[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html"]ISMEMBER[/URL]和[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/strcmp.html"]STRCMP[/URL] / [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/cellfun.html"]CELLFUN[/URL] )测试我的解决方案的速度。我首先创建了两个大型单元格数组: 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 ;) 请注意, [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/setxor.html"]SETXOR[/URL]解决方案具有一致的快速时序。如果a元素不在b ,则[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html"]ISMEMBER[/URL]解决方案的运行实际上会稍微快一些。这是由于[URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/logicaloperatorsshortcircuit.html"]短路&&[/URL]跳过了计算的后半部分(因为我们已经知道a和b不包含相同的值)。然而,如果所有的值的a ,可以在b中, [URL="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/ismember.html"]ISMEMBER[/URL]溶液是显著慢。 [url=https://stackoverflow.com/questions/3231580]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 01:13。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.