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

16 次查看(过去 30 天)
Takaki Fujii
Takaki Fujii 2018-12-5
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,のようにしたいです。
よろしくお願いします。

采纳的回答

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

请先登录,再进行评论。

更多回答(1 个)

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 个评论
Shoumei
Shoumei 2018-12-6
得られたデータを、ファイル名に使えるようテキストデータとして出力したいということでよろしいでしょうか?
Takaki Fujii
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の行列データとして出力したいです。
説明が分かりづらくて申し訳ありません。

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 timetable 的更多信息

Community Treasure Hunt

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

Start Hunting!