行列データの線形補間のついて
9 views (last 30 days)
Show older comments
6時間ごとの行列データ(320×640)があります。ファイル名は,YearMonthDayHourで例えば10月1日0時でしたら2012100100のような名前です。
(6時間ごとですので、2012100100,2012100106,2012100112,2012100118のようにあります。)
これを2時間ごとのデータに線形補間したいのですがやり方が分かりません。
出力するファイルは,2012100100,2012100102,2012100104,2012100106,2012100108,2012100110,2012100112,2012100114,2012100116,2012100118,2012100120,2012100122,のようにしたいです。
よろしくお願いします。
0 Comments
Accepted Answer
Akira Agata
on 6 Dec 2018
Edited: Akira Agata
on 6 Dec 2018
各データファイルには320x640の数値データのみがテキスト形式で保存されているとして、なおかつ全データファイルの内容をメモリ上に展開できるだけのメモリサイズがあるものと仮定します。
そうすると、全データをいったんtimetable型変数としてメモリ上に保持したうえでretime関数で線形補間をすることができます。ファイルの入出力処理も含めて、たとえば以下のようなプログラムではいかがでしょうか。
% 各ファイルに保存されたデータ配列のサイズ
nRow = 320;
nCol = 640;
% データファイル一覧を作成
s = dir('*.txt');
s = struct2table(s);
% 念のためソートっ!
s = sortrows(s,'name');
% ファイル名から6時間刻みのdatetime配列を作成
Time = erase(s.name,'.txt');
Time = datetime(Time,'InputFormat','yyyyMMddHH');
% データ全体を保存するためのtimetable型変数 TT を作成
TT = table(Time);
TT = [TT, array2table(zeros(height(TT),nRow*nCol))];
TT = table2timetable(TT);
% 各ファイルのデータを TT の各行に保存
for kk = 1:height(s)
A = dlmread(s.name{kk});
TT{kk,:} = A(:)';
end
% 2時間刻みのdatetime配列を作成
newTime = (Time(1):hours(2):Time(end))';
% retime関数を使って線形補間
newTT = retime(TT,newTime,'linear');
% 補間により生成したデータのみを保存
for kk = 1:height(newTT)
if ~ismember(newTT.Time(kk),Time)
fileName = [datestr(newTT.Time(kk),'yyyymmddHH'),'.txt'];
A = reshape(newTT{kk,:},nRow,nCol);
dlmwrite(fileName,A);
end
end
More Answers (1)
Shoumei
on 6 Dec 2018
MATLABでは日付と時刻を扱うことができるのですが、これではだめでしょうか?
一から2時間ごとの時間ベクトルを定義
tstart = datetime('2012100100', 'inputformat', 'yyyyMMddHH') % 開始時間
h = hours([0:29]*2)' % 時間間隔(2h)の設定。30個のデータを作成
t = tstart+h
または
data = [2012100100,2012100106,2012100112,2012100118]' % 元データ
t = datetime(num2str(data), 'inputformat', 'yyyyMMddHH') % 文字列にしてから時刻データに変換
tinterp = interp1((1:4)', t, (1:1/3:4)') % 6h=>2hに補間
3 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!