我有一个非常重要的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 斯特拉普利特192750电话13.388 s
编辑:该内容在文件中具有此结构
0.000000, -0.00271, 5394147
0.000667, -0.00271, 5394148
0.001333, -0.00271, 5394149
0.002000, -0.00271, 5394150发布于 2017-04-25 14:56:33
我认为通过不同的调用文本扫描可以得到很大的改进。
你这样做:
g = textscan(fid,'%s','delimiter','\r\n');然后调用tdata = g{1};
如果文本扫描被正确调用,它应该已经拆分了所有的数据,并将其作为数字返回。
试试这个:
g=textscan(fid,'%f,%f,%f,'delimiter','\r\n')它应该给出三个单元格数组,列中包含您的值。若要转换为矩阵,可以使用:
g=cell2mat(g)我在0.12秒内输入了200 K行。
您的代码似乎有其他一些解决办法。从r=4开始,你似乎有3行你不想读的。所以打开后你可以打三次电话
[~] =fgetl(fid) 进入你档案中有趣的部分。
您还首先用分隔符“,”分隔行。但用“.”代替“所有”。这不会有任何作用,所有的“,”已经消失了,因为他们被用作分隔器。
发布于 2017-04-25 14:20:36
如果你使用csvread,你不需要使用str2double或strsplit,你说这是慢行.对csv来说可能更快。
您可以通过以下方式替换所有上述代码:
results = csvread(inputfile);https://stackoverflow.com/questions/43612164
复制相似问题