MATLAB Answers

0

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

Takaki Fujii さんによって質問されました 2018 年 12 月 5 日
最新アクティビティ Takaki Fujii さんによって コメントされました 2018 年 12 月 6 日
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 件のコメント

サインイン to comment.

2 件の回答

Akira Agata
回答者: Akira Agata
2018 年 12 月 6 日
編集済み: Akira Agata
2018 年 12 月 6 日
 採用された回答

各データファイルには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 件のコメント

Takaki Fujii 2018 年 12 月 6 日
大変分かりやすいご回答誠にありがとうございます。無事に線形補間を行う事が出来ました。
また質問させていただくこともあるかと思いますが、何卒よろしくお願いいたします。ありがとうございました。

サインイン to comment.


Shoumei
回答者: Shoumei
2018 年 12 月 6 日

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 件のコメント

Takaki Fujii 2018 年 12 月 6 日
ご回答ありがとうございます。ご指摘いただいたやり方で、2時間ごとのファイル名を出力することに成功しました。この2時間ごとのファイル名で行列データそのものも数値を線形補間し、2時間ごとのテキストデータとして出力したいのですがどのようにすればい良いでしょうか?
初歩的な質問で申し訳ありません。必要あればデータも添付します。
よろしくお願いします。
Shoumei
2018 年 12 月 6 日
得られたデータを、ファイル名に使えるようテキストデータとして出力したいということでよろしいでしょうか?
Takaki Fujii 2018 年 12 月 6 日
データの中身はある値が入った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の行列データとして出力したいです。
説明が分かりづらくて申し訳ありません。

サインイン to comment.