簡體   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