[英]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
,則無需使用str2double
或strsplit
,它們表示速度很慢……對於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.