2

将 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
4

4 回答 4

4

在内部,datenum做了大量的摆弄来处理许多不同的日期格式。datenummx然后它根据日期格式和您调用的语法使用不同的输入参数调用内部函数datenum

如果您提前知道您将使用哪种语法进行调用datenum,以及您将使用哪种日期格式,您可以datenummx直接调用。由于datenummx是一个内置的 MEX 文件,并且避免了所有的开销处理,它通常要快得多

查看datenum(type edit datenum) 以找出调用datenummx您的应用程序的适当方式。

(另外,做其他答案建议的所有矢量化)。

于 2013-02-20T17:36:37.137 回答
2

这是我发现将时间从 20 秒减少到 2 秒的方法:

dblDate = datenum(strDay, 'yy.mm.dd') + ...
          datenum(strTime, 'HH:MM:SS.FFF') - ...
          datenum('00:00:00.000', 'HH:MM:SS.FFF');
于 2013-02-20T14:40:09.223 回答
2

您可以尝试避免循环:

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.
于 2013-02-20T14:27:00.440 回答
2

尝试不使用 for 循环。datenum应该能够处理向量。

strDay = cell2mat(strDay);
strTime = cell2mat(strTime);

dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd HH:MM:SS.FFF');
于 2013-02-20T14:28:03.963 回答