【问题标题】:Matlab referencing of part of string in cell arrayMatlab引用单元格数组中部分字符串
【发布时间】:2015-10-18 01:13:15
【问题描述】:

我正在寻找一种方法来引用存储在元胞数组中的部分字符串。我需要这样做是为了做出一个逻辑语句,将我正在寻找的字符串与元胞数组中的字符串部分相匹配。

假设我的单元格数组如下所示:

cellname = { 'B_1J_1234_1236' , 'A_1W_2345_2349' , 'C_2J_9876_9879' , 'B_1W_5432_5438'}

我正在寻找满足的单元格数组中的字符串:

  1. 'B' 作为字符串的第一部分
  2. '1W' 作为字符串的第二部分
  3. 第一个数字(第三部分)小于5434
  4. 第二个数(第四部分)大于5436

我知道我可以通过以下方式获得满足我的前两个搜索条件的元素的索引:

find(strncmp(cellname,'B_1W',4))

但我找不到包含后一种条件的方法。有什么想法吗?

编辑: 理想情况下,我想我想做点什么:

find(strncmp(cellname,'B_1W',4) & cellname{ "any element" } (6:9) < 5434 & cellname{ "any element" } (11:14) > 5436)

但这是对“任何元素”的一部分的引用,我不知道该怎么做。

【问题讨论】:

    标签: string matlab cell


    【解决方案1】:

    使用正则表达式:

    cellfun(@(x) ~isempty(x) && str2num(x.m)<5434 && str2num(x.n)>5436, ...
        regexp(cellname, '^B_1W_(?<m>\d+)_(?<n>\d+)', 'names'))
    

    【讨论】:

      【解决方案2】:

      您可以通过使用cellfun 和自定义函数来解决此问题。在此函数中,您可以使用 strsplit 和分隔符 _ 将字符串拆分为子字符串。然后只需检查是否满足所有条件,相应地返回truefalse。请注意,我们需要将第三和第四字段中的字符串转换为数字。这可以通过str2double 完成。

      function main
          cellname = { 'B_1J_1234_1236' , ...
                       'A_1W_2345_2349' , ...
                       'C_2J_9876_9879' , ...
                       'B_1W_5432_5438' };
      
          R = cellfun(@check, cellname, 'UniformOutput',1)
          find(R==true)
      end
      
      
      function out = check(in)
          S = strsplit(in,'_');
          out = strcmp(S{1},'B') && strcmp(S{2},'1W') && ...
                str2double(S{3})<5434 && str2double(S{4})>5436
      end
      

      这是输出:

      R =
           0     0     0     1
      ans =
           4
      

      如果您想使用与您提议的类似的东西,您也可以使用cellfun

      find(strncmp(cellname,'B_1W',4) & ...
               cellfun(@(x)str2double(x(6:9))<5434,cellname) & ...
               cellfun(@(x)str2double(x(11:14))>5436,cellname))
      

      【讨论】:

        【解决方案3】:

        与马特的非常相似,但在一行中

        cellfun(@(x) strcmp(x{1}, 'B') && strcmp(x{2}, '1W') && (str2num(x{3}) < 5434) && (str2num(x{4}) > 5436), cellfun(@(x) strsplit(x, '_'), cellname(:)', 'uni', 0))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-03-22
          • 1970-01-01
          • 2019-05-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多