我有一个查询,我正在尝试解决
我知道可以使用strcmp(s1,s2)
来比较两个不同的字符串以查看它们是否相同。如果是这种情况,它给出 1。
但是,如果您有一个充满字符串的可变长度数组,并且您想要数组中的所有字符串是否相同,那么如何解决此问题。
例如:['NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010']
我们可以看到这个数组中的所有字符串都是相同的。 但是,如何使用strcmp(s1,s2)
.
谢谢大家!
如果你想要字符串之间的所有成对比较:调用ndgrid
生成所有组合的索引,然后索引到字符串的单元格数组中并调用strcmp
:
x = {'NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010'};
[ii, jj] = ndgrid(1:numel(x));
result = strcmp(x(ii), x(jj));
在这种情况下
result =
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
因为所有字符串都是一样的。
想到了使用strcmp
进行成对比较,但您可以直接在单元格数组上使用它:
x={'NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010'}
result=all(strcmpi(x{1},x(2:end)))
将第一个元素与其余元素进行比较。仅当所有元素相等时,它才返回 true。对于成对比较,您可以:
[~,~,c]=unique(x);
result=bsxfun(@eq,c,c.')
如果你用矩阵解决问题(即每一行都是一个字符串),在我看来没有特别好的解决方案,但是如果你的字符串包含在单元格数组中,事情会变得越来越容易和更好。
所以我们从创建这样的单元数组开始:
myStrings={'NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010'};
其中每个单元格包含一个字符串。这也将使您的代码更加健壮,因为每个字符串可以具有不同的长度(如果您将所有字符串连接在矩阵中,则不正确)。
然后指定要在此类单元格数组中找到的字符串:
stringThatMustBeTested='NACA64A010';
现在您可以使用 cellfun()
,这是一个将另一个函数应用于给定单元格数组的每个单元格的函数,如下所示:
results=cellfun(@(x) strcmp(x,stringThatMustBeTested),myStrings);
这样的行只是意味着"strcmp()
应用于myStrings
内部的每个通用单元格x
并将单元格与stringThatMustBeTested
进行比较"。
变量 results
将是一个逻辑输出,如果单元格数组中的第 j 个单元格等于要测试的字符串,则元素 j
将为真。如果results
完全由 1
s 组成(您可以将其检查为 if sum(results)==length(results)
),那么所有字符串在 myStrings
中都是相同的(假设 stringThatMustBeTested
是单元格数组中的唯一字符串,但无论如何,此解决方案可以扩展到单元格内更广泛的字符串搜索)。