[英]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.