行列データの線形補間のついて

73 views (last 30 days)
Takaki Fujii
Takaki Fujii on 5 Dec 2018
Commented: Takaki Fujii on 6 Dec 2018
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,のようにしたいです。
よろしくお願いします。

Accepted Answer

Akira Agata
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
  1 Comment
Takaki Fujii
Takaki Fujii on 6 Dec 2018
大変分かりやすいご回答誠にありがとうございます。無事に線形補間を行う事が出来ました。
また質問させていただくこともあるかと思いますが、何卒よろしくお願いいたします。ありがとうございました。

Sign in to comment.

More Answers (1)

Shoumei
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
Takaki Fujii
Takaki Fujii on 6 Dec 2018
データの中身はある値が入った320×640の行列なのですが、それが6時間ごとに2012100100.txt(320×640),2012100106.txt(320×640),2012100112.txt(320×640),2012100118.txt(320×640),・・・とあります。これを2時間ごとに線形補間して、2012100100.txt(320×640),2012100102.txt(320×640),2012100104.txt(320×640),2012100106.txt(320×640),・・・という風に6時間ごとの元データの値から補間した2時間ごとの320×640の行列データとして出力したいです。
説明が分かりづらくて申し訳ありません。

Sign in to comment.

Categories

Find more on timetable in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!