У меня есть файл со строками известной длины, но без разделителя.
% What should be the result
vals = arrayfun(@(x) ['Foobar ', num2str(x)], 1:100000, 'UniformOutput', false);
% what the file looks like when read in
strs = cell2mat(vals);
strlens = cellfun(@length, vals);
Самый простой подход довольно медленный:
out = cell(1, length(strlens));
for i=1:length(strlens)
out{i} = fread(f, strlens(i), '*char');
end % 5.7s
Чтение всего и последующее деление намного быстрее:
strs = fread(f, sum(strlens), '*char');
out = cell(1, length(strlens));
slices = [0, cumsum(strlens)];
for i=1:length(strlens)
out{i} = strs(slices(i)+1:slices(i+1));
end % 1.6s
С мекс-функцией я могу снизить до 0,6 с, так что есть еще много возможностей для улучшения. Можно ли получить сопоставимую производительность с чистым Matlab (R2016a)?
Редактировать: казалось бы, идеальная mat2cell
функция не помогает:
out = mat2cell(strs, 1, strlens); % 2.49s