matlab:使用字符串分析加速循环

时间:2017-04-25 13:32:21

标签: matlab performance for-loop

我有一个包含三列的非常激烈的csv文件。现在我想尽可能快地将这些列加载到matlab矩阵中。

目前我所做的就是这个

Workers<T>

然而,对于200 000行,这需要约30秒。这意味着每行150μs。这真的很慢。 parfor不接受该代码。

现在我想知道导致for循环瓶颈的原因以及我如何加快它的速度。

这里测量的时间:

  

str2double 578253调用29.631s

     

strsplit 192750调用13.388s

编辑: 内容在文件

中具有此结构
    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

2 个答案:

答案 0 :(得分:1)

如果您使用csvread,则不需要使用str2doublestrsplit,您说这是慢线......它可能会快得多对于csv。

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

results = csvread(inputfile);

答案 1 :(得分:1)

我认为通过不同的方式调用文本可以改善很多。

你这样做:

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秒内输入了200k行。

您的代码似乎还有其他一些解决方法。你从r = 4开始,你似乎有3行你不想读。所以在fopen之后你可以打3次

[~] =fgetl(fid) 

访问文件的有趣部分。

您还首先将该行与&#39;,&#39;分开。作为分隔符。但是替换所有&#39;,&#39;通过&#39;。&#39;。这不会做任何事情,所有&#39;,&#39;因为它们被用作分隔符而已经消失了。