2

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
4

4 に答える 4

4

内部的にdatenumは、多くの異なる日付形式を処理するために大量の操作を行います。datenummx次に、日付形式と呼び出した構文に応じて、さまざまな入力引数を使用して内部関数を呼び出しますdatenum

呼び出す構文と使用する日付形式が事前にわかっている場合はdatenum、直接呼び出すことができますdatenummx。は組み込みの MEX ファイルであり、すべてのオーバーヘッド処理を回避するためdatenummx、通常は非常に高速です。

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

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 に答える
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 に答える