如何在混合单元格数组中找到某个字符串并将其替换为整数?

时间:2017-08-30 22:42:51

标签: string matlab comparison cell-array

我有一个带字符串和整数的混合单元格数组。例如:

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

我想进入此单元格数组,查找'NF'的所有实例并将其转换为0

3 个答案:

答案 0 :(得分:3)

使用strcmp

的简单解决方案
myData(strcmp(myData,'NF'))={0}

答案 1 :(得分: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则更宽松,允许不同数据类型的输入在其基础数据为实际上是一样的。在选择解决方案之前,您应该考虑需要哪种行为。

答案 2 :(得分:0)

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

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)找到混合单元格数组的列数。