繁体   English   中英

Matlab:使用字符串分析加快循环速度

[英]matlab: speed up for loop with string analysis

我有一个非常有趣的csv文件,其中包含三列。 现在,我想将这些列尽快加载到matlab矩阵中。

目前我正在做的是

    fid = fopen(inputfile, 'rt');
    g = textscan(fid,'%s','delimiter','\r\n');
    tdata = g{1};
    fclose(fid);

    results = zeros([numel(tdata)-4], 3);
    tic
    display('start reading data...');
    for r = 4:numel(tdata)
        if ~mod(r, 100) 
            display(['data row: ' num2str(r) ' / ' num2str(numel(tdata))]);
        end
        entries = strsplit(tdata{r}, ',');
        results(r-3,1) = str2double(strrep(entries{1},',', '.'));
        results(r-3,2) = str2double(strrep(entries{2},',', '.'));
        results(r-3,3) = str2double(strrep(entries{3},',', '.'));
    end

但是,对于20万行,这需要30秒钟。 这意味着每条线150 µs。 这真的很慢。 parfor不接受该代码。

现在,我想知道是什么原因导致了for循环中的瓶颈,以及如何提高它的速度。

这里是实测时间:

str2double 578253通话29.631s

strsplit 192750通话13.388s

编辑:内容在文件中具有此结构

  0.000000,  -0.00271,   5394147
  0.000667,  -0.00271,   5394148
  0.001333,  -0.00271,   5394149
  0.002000,  -0.00271,   5394150

如果您使用的是csvread ,则无需使用str2doublestrsplit ,它们表示速度很慢……对于csv来说可能要快得多。

您可以通过以下方式替换所有上述代码:

results = csvread(inputfile);

我认为可以通过不同方式调用textscan进行很多改进。

你做这个:

g = textscan(fid,'%s','delimiter','\r\n');

但是然后调用tdata = g {1};

如果正确调用了textscan,则它应该已经拆分了所有数据,并将其作为数字返回。

尝试这个:

g=textscan(fid,'%f,%f,%f,'delimiter','\r\n')

它应该给您返回三个单元格数组,并在列中包含您的值。 要转换为矩阵,可以使用:

g=cell2mat(g)

我在0.12秒内导入了20万行。

看来您的代码还有其他解决方法。 您从r = 4开始,看来您不想读3行。 所以开张后你可以打电话3次

[~] =fgetl(fid) 

进入文件中有趣的部分。

您还首先用','作为分隔符分割行。 但是用“。”替换所有“,”。 那将不会做任何事情,因为所有的','都已被用作分隔符,所以已经消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM