文本扫描使用速度提高

时间:2014-05-14 17:45:32

标签: performance matlab textscan

我做了一个程序,该程序接受.csv文件,并在512x512xNumberOfFiles单元阵列的相应第三维中堆叠每个文件的第3列。代码如下:

[filenames,filepath] = uigetfile('*.csv','Opening the data files','','Multiselect','on');
filenames = fullfile(filepath,filenames);
NumFiles = numel(filenames);

Pixel = cell(512,512,NumFiles);

count=0;
num_pixels = size(Pixel,1)*size(Pixel,2);
for k = 1:NumFiles
    fid = fopen(char(filenames(k)));
    C = textscan(fid, '%d, %d, %d','HeaderLines',1);
    Pixel(count + sub2ind(size(Pixel),C{1}+1,C{2}+1)) = num2cell(C{3});
    count = count + num_pixels;
    fclose(fid);
end

这里的文本扫描调用每个文件大约需要0.5 +/- 0.03s(长度为262144(512x512)),而我的sub2ind调用每个文件大约需要0.2 +/- 0.01s。

有没有办法减少这个时间,或者这似乎是运行代码的最佳方式?我每次都会处理大约1000个文件,所以等待8-9分钟才能获得正确的数据似乎有点过分(考虑到我还没有用过其他任何文件)。

任何提示?

马克 - 奥利弗

1 个答案:

答案 0 :(得分:1)

希望通过仍然保持textscan来改善这一点。另外,请确保值看起来很好。

<强>代码

[filenames,filepath] = uigetfile('*.csv','Opening the data files',...
    '','Multiselect','on');
filenames = fullfile(filepath,filenames);
NumFiles = numel(filenames);

PixelDouble = NaN(512*512,NumFiles);
for k = 1:NumFiles
    fid = fopen(char(filenames(k)));
    C = textscan(fid, '%d, %d, %d','HeaderLines',1);
    PixelDouble(:,k) = C{3};
    fclose(fid);
end
Pixel = num2cell(permute(reshape(PixelDouble,512,512,[]),[2 1 3]))

我必须鼓励您关注此问题 - Fastest Matlab file reading?及其答案。