Увеличение скорости для использования textscan

Я сделал программу, которая берет файл .csv и укладывает 3-й столбец каждого файла в соответствующее 3-е измерение массива ячеек 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 минут только для получения правильных данных кажется немного чрезмерным (учитывая, что я еще не использовал его ни для чего другого).

Какие-нибудь советы?

Марк-Оливье


person Vissenbot    schedule 14.05.2014    source источник
comment
Позвольте мне спросить вас, есть ли у вас элементы размером 512x512 во всех этих файлах, и все ли они имеют одинаковый шаблон строк и столбцов для первых двух столбцов текстовых файлов с разделителями-запятыми?   -  person Divakar    schedule 14.05.2014
comment
Да, они все по одному шаблону, и все они имеют элементы 512x512. Это все в формате Row, Column, Intensity.   -  person Vissenbot    schedule 14.05.2014
comment
Есть ли какая-то конкретная причина, по которой вы используете массив ячеек?   -  person excaza    schedule 14.05.2014
comment
Не совсем. Я подумал, что было бы естественно поместить его в массив ячеек, учитывая, что у меня было 512x512x1000 элементов, но, возможно, я что-то неправильно понимаю.   -  person Vissenbot    schedule 14.05.2014


Ответы (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? и его ответы.

person Divakar    schedule 14.05.2014
comment
Вы говорите, что я мог бы сэкономить много времени, используя sscanf вместо textscan? Как я понимаю, у одного у другого примерно так же... - person Vissenbot; 14.05.2014
comment
Что ж, похоже, textscan работает довольно быстро. Просто любопытно, сколько улучшений вы увидите! - person Divakar; 14.05.2014
comment
Ваше решение, очевидно, вырезало часть sub2ind. Так как мне не нужно C{1} and C{2}, я просто набрал вместо него C = textscan(fid, '%*d, %*d, %d','HeaderLines',1);, но это сэкономило всего несколько миллисекунд (все еще несколько секунд, когда у вас тысяча файлов!) Спасибо за помощь! - person Vissenbot; 14.05.2014