MATLAB:读取文本文件并将其拆分为多维单元格数组

时间:2014-09-30 03:07:09

标签: arrays matlab matrix split

我有一个大文本文件,其格式如下:

M23 I13 C11 D12 A13
K15 I01 L19 D02 O15

我想将文件读入矩阵,以便逐个处理ID。每行都是独立的。

例如,我希望有一个matlab代码可以执行与以下Perl代码相同的操作:

my @AoA = map { chomp; [ split /\t/, $_ ] } <FILE>;
有人可以帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

这里有两个建议,两个建议都会在最后生成一个完整行的单元格数组。

首先将整个文件加载到内存中,然后将每个变量转换为单元格元素。 这更紧凑。缺点是它在内存中保留了两个数据副本。

第二个版本逐行读取文件,并将每个值转换为单元格元素。 优点是它需要更少的内存,而且似乎更快。

时序:

  1. 0.0175769秒。
  2. 0.00976515秒。
  3. 0.0175769 - 0.00976515 = 0.0078117

    或版本1

    0.0078117/0.0175769 = 0.44443慢了。

    版本1:

    tic;
    formatSpec = '%s';
    
    fileID = fopen ('datafile.txt');
    C = textscan(fileID,formatSpec,...            
                    'Delimiter', '\n', ...
                    'CollectOutput', true);
    
    B= C{1};
    D = cellfun(@(x) textscan(x, '%s'), B);
    toc
    D
    
    
    Elapsed time is 0.0175769 seconds.
    D =
    {
      [1,1] =
      {
        [1,1] = M23
        [2,1] = I13
        [3,1] = C11
        [4,1] = D12
        [5,1] = A13
      }
      [2,1] =
      {
        [1,1] = K15
        [2,1] = I01
        [3,1] = L19
        [4,1] = D02
        [5,1] = O15
      }
    }
    

    第2版

    tic;
    formatSpec = '%s';
    
    fileID = fopen ('datafile.txt');
    rowNr = 1;
    y=0;
    C={};
    tline = fgetl(fileID);
    while ischar(tline)
       A = textscan(tline,formatSpec);
       C{rowNr} = A{1};
    
       %Check for end of file
       matches = strfind(tline, '\n');
       num = length(matches);
       if num > 0
          y = y + num;
          fprintf(1,'%d:%s\n',num,tline);
       end
    
       tline = fgetl(fileID);
       rowNr = rowNr+1;
    end
    fclose(fileID);
    
    toc
    C
    
    
    
    Elapsed time is 0.00976515 seconds.
    C =
    {
      [1,1] =
      {
        [1,1] = M23
        [2,1] = I13
        [3,1] = C11
        [4,1] = D12
        [5,1] = A13
      }
      [1,2] =
      {
        [1,1] = K15
        [2,1] = I01
        [3,1] = L19
        [4,1] = D02
        [5,1] = O15
      }
    }