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