将 100,000 个日期字符串转换为 datenums,Matlab 真的很慢...... 20 秒!有没有更快的方法来做到这一点?
%strDay
%strTime
dblDate = zeros(1, nLines);
for i = 1 : nLines
dblDate(j) = datenum([strDay{i}, ' ', strTime{i}], 'yy.mm.dd HH:MM:SS.FFF');
j = j + 1;
end
将 100,000 个日期字符串转换为 datenums,Matlab 真的很慢...... 20 秒!有没有更快的方法来做到这一点?
%strDay
%strTime
dblDate = zeros(1, nLines);
for i = 1 : nLines
dblDate(j) = datenum([strDay{i}, ' ', strTime{i}], 'yy.mm.dd HH:MM:SS.FFF');
j = j + 1;
end
在内部,datenum
做了大量的摆弄来处理许多不同的日期格式。datenummx
然后它根据日期格式和您调用的语法使用不同的输入参数调用内部函数datenum
。
如果您提前知道您将使用哪种语法进行调用datenum
,以及您将使用哪种日期格式,您可以datenummx
直接调用。由于datenummx
是一个内置的 MEX 文件,并且避免了所有的开销处理,它通常要快得多。
查看datenum
(type edit datenum
) 以找出调用datenummx
您的应用程序的适当方式。
(另外,做其他答案建议的所有矢量化)。
这是我发现将时间从 20 秒减少到 2 秒的方法:
dblDate = datenum(strDay, 'yy.mm.dd') + ...
datenum(strTime, 'HH:MM:SS.FFF') - ...
datenum('00:00:00.000', 'HH:MM:SS.FFF');
您可以尝试避免循环:
tmp = repmat({' '}, length(strDay), 1);
datenum(cell2mat([strDay (:), tmp(:), strTime(:)]))
〜编辑〜
到目前为止所有解决方案的一些基准测试:
% creating some bogus data
a = ones(10000,1).*(now.*rand(10000,1));
str = datestr(a,'yy.mm.dd HH:MM:SS.FFF');
strDay = cellstr(str(:,1:8));
strTime = cellstr(str(:,10:end));
%% jdl's original code
disp('jdl''s original code')
tic
nLines = length(strDay);
dblDate = zeros(1, nLines);
j = 1;
for i = 1 : nLines
dblDate(j) = datenum([strDay{i}, ' ', strTime{i}]);
j = j + 1;
end
toc
%% hmuster's solution
disp('hmuster''s solution')
tic
tmp = repmat({' '}, length(strDay), 1);% cell(size(str1));
b = datenum(cell2mat([strDay(:), tmp(:), strTime(:)]));
toc
%% ThijsW's solution
disp('ThijsW''s solution')
tic
strDay = cell2mat(strDay);
strTime = cell2mat(strTime);
dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd HH:MM:SS.FFF');
toc
% jdl's solution
disp('jdl''s solution')
tic
dblDate = datenum(strDay, 'yy.mm.dd') + ...
datenum(strTime, 'HH:MM:SS.FFF') - ...
datenum('00:00:00.000', 'HH:MM:SS.FFF');
toc
这导致:
jdl's original code
Elapsed time is 19.624597 seconds.
hmuster's solution
Elapsed time is 4.029291 seconds.
ThijsW's solution
Elapsed time is 0.183376 seconds.
jdl's solution
Elapsed time is 0.222996 seconds.
尝试不使用 for 循环。datenum
应该能够处理向量。
strDay = cell2mat(strDay);
strTime = cell2mat(strTime);
dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd HH:MM:SS.FFF');