0

我做了一个程序,它采用 .csv 文件并将每个文件的第三列堆叠在 512x512xNumberOfFiles 单元数组的适当第三维中。代码如下:

[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

此处的 textscan 调用每个我打开的文件大约需要 0.5 +/- 0.03 秒(即 262144 (512x512) 数据长),而我的 sub2ind 调用每个文件大约需要 0.2 +/- 0.01 秒。

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

有小费吗?

马克-奥利维尔

4

1 回答 1

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]))

我必须鼓励您关注这个问题 -最快的 Matlab 文件阅读?它的答案。

于 2014-05-14T18:36:50.997 回答