【问题标题】:Use regexprep with cell array for colons to format使用带有单元格数组的 regexprep 来格式化冒号
【发布时间】:2019-09-06 13:54:54
【问题描述】:

我有一个单元格数组,格式为:

t = {'23:34:22.959511';
     '22:34:11.885113';
     '12:34:08.995146';
     '11:34:02.383092'}

我正在尝试将输出格式化为 4 个列向量:

a = 23
    22
    12
    11

b = 34
    34
    34
    34

c = 22
    11
    08
    02

d = 959511
    885113
    995146
    383092

我正在使用regexprep对数据进行操作:

a = regexprep(t,':34:22.959511', '')

但是,这只适用于数据集中的一个字符串,而不是所有字符串。

如何将字符串分成 4 个列向量 -- 使用 regexprep 作为冒号:并在下面显示输出?

【问题讨论】:

    标签: string matlab cell-array regexp-replace


    【解决方案1】:

    如果您愿意使用正则表达式的其他解决方案:strplit 可以拆分为任何所需的字符:

    a = zeros(numel(t),1);
    b = zeros(numel(t),1);
    c = zeros(numel(t),1);
    d = zeros(numel(t),1);
    
    for ii = 1:numel(t)
        C = strsplit(t{ii}, ':');
        a(ii) = str2double(C{1});
        b(ii) = str2double(C{2});
        tmp = strsplit(C{3},'.'); % Additional split for dot
        c(ii) = str2double(tmp{1});
        d(ii) = str2double(tmp{2});
    end
    

    当然,这只适用于您的数据始终具有这种结构(两个冒号,然后是一个点)

    【讨论】:

      【解决方案2】:

      这是一种方法:

      r = cell2mat(cellfun(@str2double, regexp(t, ':|\.', 'split'), 'uniformoutput', false));
      

      这给了

      r =
                23          34          22      959511
                22          34          11      885113
                12          34           8      995146
                11          34           2      383092
      

      如果你真的需要四个单独的变量,你可以使用:

      r = num2cell(r,1);
      [a, b, c, d] = r{:};
      

      【讨论】:

      • 为了加快获取四个变量,不将r 的第一行转换为矩阵,而是直接使用单元格不是更快吗?所以不是num2cell(cell2mat(cellfun(..)))直接做cellfun(..),还是尺寸/元素的顺序错误?
      • @Adriaan 是的,尺寸顺序错误。我们需要转置它们。这基本上就是cell2matnum2celldo:cell2mat 转换为矩阵,num2cell 提取其列
      【解决方案3】:

      我建议使用 split 而不是 strsplit。 split 将对向量进行操作,如果您使用字符串数据类型,您只需在字符串上调用 double 即可获取数值

      >> profFunc
      Adriaan's Solution: 5.299892
      Luis Mendo's Solution: 3.449811
      My Solution: 0.094535
      
       function profFunc()
      
          n = 1e4; % Loop to get measurable timings
      
          t = ["23:34:22.959511";
               "22:34:11.885113";
               "12:34:08.995146";
               "11:34:02.383092"];
      
          tic
          for i = 1:n
              a = zeros(numel(t),1);
              b = zeros(numel(t),1);
              c = zeros(numel(t),1);
              d = zeros(numel(t),1);
      
              for ii = 1:numel(t)
                  C = strsplit(t{ii}, ':');
                  a(ii) = str2double(C{1});
                  b(ii) = str2double(C{2});
                  tmp = strsplit(C{3},'.'); % Additional split for dot
                  c(ii) = str2double(tmp{1});
                  d(ii) = str2double(tmp{2});
              end
          end
          fprintf('Adriaan''s Solution: %f\n',toc);
      
          tic
          for i = 1:n
              r = cell2mat(cellfun(@str2double, regexp(t, ':|\.', 'split'), 'uniformoutput', false));
              r = num2cell(r,1);
             [a, b, c, d] = r{:};
          end
          fprintf('Luis Mendo''s Solution: %f\n',toc);
      
          tic
          for i = 1:n
              x = split(t,[":" "."]);
              x = double(x);
      
              a = x(:,1);
              b = x(:,2);
              c = x(:,3);
              d = x(:,4);
          end
          fprintf('My Solution: %f\n',toc);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-25
        • 2015-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多