datenum に変換する 100,000 の日付文字列を使用すると、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 に変換する 100,000 の日付文字列を使用すると、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
。は組み込みの MEX ファイルであり、すべてのオーバーヘッド処理を回避するためdatenummx
、通常は非常に高速です。
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');
for ループなしで試してみてください。datenum
ベクトルを処理できる必要があります。
strDay = cell2mat(strDay);
strTime = cell2mat(strTime);
dblDate = datenum([strDay, (' ')*ones(size(strTime)), strTime], 'yy.mm.dd 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.