Вероятно, это занимает часы, потому что вы не предварительно выделяете , заставляя MATLAB постоянно искать новые блоки непрерывной памяти вместо того, чтобы выделять блок правильного размера с самого начала, что приводит к значительному снижению производительности. Предварительное распределение и sscanf
, который выводит правильный класс данных (textscan
выводит массив ячеек), резко сокращает время:
LocationCell = {'3926.611 -1534.095 26.324';
'4122.978 882.279 -67.495';
'4078.042 1072.946 60.384';
'4047.521 -1182.700 10.520';
'4188.222 -468.615 -57.303'};
ncells = numel(LocationCell);
LocationNumbers = zeros(ncells, 3);
for n = 1:(ncells)
LocationNumbers(n,:) = sscanf(LocationCell{n}, '%f %f %f');
end
Что обеспечивает следующее в R2018a (полный временной код ниже):
Timing Results
n cells: 125000
================
Original: 6.638
regex: 3.840
strsplit: 11.957
sscanf: 0.958
LocationCell = repmat({'3926.611 -1534.095 26.324'; ...
'4122.978 882.279 -67.495'; ...
'4078.042 1072.946 60.384'; ...
'4047.521 -1182.700 10.520'; ...
'4188.222 -468.615 -57.303'}, ...
25000, 1);
t1 = timeit(@()thing1(LocationCell));
t2 = timeit(@()thing2(LocationCell));
t3 = timeit(@()thing3(LocationCell));
t4 = timeit(@()thing4(LocationCell));
fprintf(['Timing Results\n', ...
'n cells: %u\n', ...
'================\n', ...
'Original: %0.3f\n', ...
'regex: %0.3f\n', ...
'strsplit: %0.3f\n', ...
'sscanf: %0.3f\n'], numel(LocationCell), t1, t2, t3, t4)
function out = thing1(in)
for n = 1: (numel(in))
out(n,:) = textscan(in{n}, '%f %f %f ');
end
end
function out = thing2(in)
S = regexp(in,'(\-?\d+\.\d+)[ ]+(\-?\d+\.\d+)[ ]+(\-?\d+\.\d+)','tokens','once');
S = vertcat(S{:});
out = str2double(S);
end
function out = thing3(in)
S = cellfun(@(x)strsplit(x,' '), in, 'UniformOutput', false);
S = vertcat(S{:});
out = str2double(S);
end
function out = thing4(in)
ncells = numel(in);
out = zeros(ncells, 3);
for n = 1:(numel(in))
out(n,:) = sscanf(in{n}, '%f %f %f ');
end
end