【问题标题】:MATLAB: use strcmp(s1,s2) for variable length vector with stringsMATLAB:将 strcmp(s1,s2) 用于带字符串的可变长度向量
【发布时间】:2016-02-29 19:24:59
【问题描述】:

我有一个要解决的问题

我知道可以使用strcmp(s1,s2) 来比较两个不同的字符串,看看它们是否相同。如果是这种情况,它会给出 1。

但是,如果您有一个充满字符串的可变长度数组,并且您想知道数组中的所有字符串是否相同,那么如何解决这个问题。

例如:['NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010'] 我们可以看到这个数组中所有的字符串都是一样的。但是,如何使用strcmp(s1,s2)

谢谢大家!

【问题讨论】:

  • 我假设您的示例应该使用 {} 而不是 []?否则它是一个字符串。
  • numel(unique({'NACA64A010' 'NACA64A010' 'NACA64A010' 'NACA64A010'})) == 1?
  • 如果其中一个答案解决了您的问题,请点击复选标记考虑accepting it。这表明您已经找到了解决方案,这不再是一个悬而未决的问题。如果您的问题没有得到解答,请说明缺少的内容。

标签: arrays string matlab compare


【解决方案1】:

如果您想要字符串之间的所有成对比较:调用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

因为所有的字符串都是一样的。

【讨论】:

    【解决方案2】:

    您可能考虑过使用strcmp 进行成对比较,但您可以直接在元胞数组上使用它:

    x={'NACA64A010' 'NACA64A010'  'NACA64A010' 'NACA64A010'}
    result=all(strcmpi(x{1},x(2:end)))
    

    将第一个元素与其余元素进行比较。只有当所有元素都相等时它才返回 true。对于成对比较,您可以:

    [~,~,c]=unique(x);
    result=bsxfun(@eq,c,c.')
    

    【讨论】:

      【解决方案3】:

      如果你用矩阵来解决问题(即每一行都是一个字符串),我认为没有特别好的解决方案,但是如果你的字符串包含在一个单元格数组中,事情会变得更容易和更好。

      所以我们从创建这样的元胞数组开始:

      myStrings={'NACA64A010' 'NACA64A010'  'NACA64A010' 'NACA64A010'};
      

      其中每个单元格都包含一个字符串。这也将使您的代码更加健壮,因为每个字符串都可以有不同的长度(如果您将所有字符串连接到一个矩阵中,则情况并非如此)。
      然后指定要在此类元胞数组中查找的字符串:

      stringThatMustBeTested='NACA64A010';
      

      现在您可以使用cellfun(),该函数将另一个函数应用于给定元胞数组的每个元胞,如下所示:

      results=cellfun(@(x) strcmp(x,stringThatMustBeTested),myStrings);
      

      这样的行只是意味着“将strcmp() 应用于myStrings 内的每个通用单元格x,并将该单元格与stringThatMustBeTested 进行比较”。

      变量results 将是一个逻辑输出,其中元素j 将为真,如果您的元胞数组中的第j 个元胞等于您要测试的字符串。如果results 完全由1s 组成(您可以检查为if sum(results)==length(results)),那么myStrings 中的所有字符串都是相同的(假设stringThatMustBeTested 是单元格数组中的唯一字符串,但无论如何,此解决方案可以扩展到单元格内更广泛的字符串搜索)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多