【问题标题】:How to find a certain string in a mixed cell array and replace it with an integer?如何在混合元胞数组中找到某个字符串并将其替换为整数?
【发布时间】:2017-08-30 22:42:50
【问题描述】:

我有一个包含字符串和整数的混合元胞数组。例如:

myData = {'blank'      'a'     'b'    'c'; ...
          'sample1'    5       6      'NF'; ...
          'sample2'    'NF'    54     'NF'};

我想进入这个元胞数组,找到'NF' 的所有实例并将其变成0

【问题讨论】:

    标签: string matlab comparison cell-array


    【解决方案1】:

    使用strcmp的简单解决方案

    myData(strcmp(myData,'NF'))={0}
    

    【讨论】:

      【解决方案2】:

      您可以使用cellfunisequal 做到这一点:

      myData(cellfun(@(c) isequal(c, 'NF'), myData)) = {0};
      

      或者你可以使用strcmp 作为Jon suggests

      myData(strcmp(myData, 'NF')) = {0};
      

      然而,应该注意的是,这两种解决方案并非在每种情况下都完全等效。来自the documentation for strcmp

      strcmp 函数用于比较文本。如果用于不受支持的数据类型,strcmp 始终返回 0

      因此,如果任一输入参数是字符向量/数组、字符向量元胞数组或字符串数​​组以外的数据类型,strcmp 将返回 false。相反,isequal 在确定它们是否相等时会忽略输入参数的数据类型。例如,数字向量 [78 70] 是字符向量 'NF' 的 ASCII 等价物,因此您从 strcmpisequal 得到以下结果:

      >> strcmp([78 70], 'NF')
      
      ans =
        logical
      
         0       % No match
      
      >> isequal([78 70], 'NF')
      
      ans =
        logical
      
         1       % Match
      

      换句话说,strcmp 在比较不同数据类型的相等性时要严格得多,而isequal 则更为宽松,允许在其基础数据实际上相同时将不同数据类型的输入视为相等。在选择解决方案之前,您应该考虑需要哪种行为。

      【讨论】:

      • 天哪,非常感谢。这是一个如此简单的解决方案!
      【解决方案3】:

      双循环可以解决这个问题:

      for j=1:size(myData,1)
          for k=1:size(myData,2)
              if strcmp(myData{j,k},'NF')
                 myData{j,k}=0;
              end
          end
      end
      

      size(myData,1) 查找行数,size(myData,2) 查找混合元胞数组的列数。

      【讨论】:

        猜你喜欢
        • 2011-02-07
        • 1970-01-01
        • 2015-03-15
        • 2015-04-23
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多