細かいgriddat​aを荒いgridda​taに直す方法

緯度・経度ごとのgriddata(海面水温)があります(sizeは4500×3251の配列です)。
これを,緯度(2°間隔)・経度(5°間隔)の分解能へ粗くして,sizeを90×72の配列にしたいです。
代表となる緯度(2°間隔)・経度(5°間隔)のdataを中心として,その周辺のデータの代表値(平均値)として取り出したいです。
その際に,interp2がいいのか,それとも別な方法があるのか知りたいです。
よろしくお願いいたします。

Answers (1)

Hernia Baby
Hernia Baby on 7 Apr 2022

0 votes

interp2 ですと 内挿値をとるので@Hiroki Takeda さんが意図しているものとは違うものができる気がします。
参考になる回答がこちらにありますので、こちら試していただくことをオススメします。

4 Comments

Hiroki Takeda
Hiroki Takeda on 8 Apr 2022
すみません、こちらまだよくわかっておりません。
確かに、一定区画ごとのmeanを取るのがよろしいと思っています。
ただ、いただいたリンク先は画像データを元にしているためか、私の理解が追いついておりません。
例えば、sizeは4500×3251→90×72にするとして、90×72の1区画(1ブロック)に入るdataのmeanを取るとすると、どのようなものになるかご教示いただけると幸いです。
ちょっと思ったのですが、
3251が素数なのでどのように分割すればいいかわからないです
とりあえずやり方のみ書きます
-----
データを作ります
clc,clear;
n = 4500;
m = 3251;
data = reshape(1:n*m,n,[])
data = 4500×3251
1 4501 9001 13501 18001 22501 27001 31501 36001 40501 45001 49501 54001 58501 63001 67501 72001 76501 81001 85501 90001 94501 99001 103501 108001 112501 117001 121501 126001 130501 2 4502 9002 13502 18002 22502 27002 31502 36002 40502 45002 49502 54002 58502 63002 67502 72002 76502 81002 85502 90002 94502 99002 103502 108002 112502 117002 121502 126002 130502 3 4503 9003 13503 18003 22503 27003 31503 36003 40503 45003 49503 54003 58503 63003 67503 72003 76503 81003 85503 90003 94503 99003 103503 108003 112503 117003 121503 126003 130503 4 4504 9004 13504 18004 22504 27004 31504 36004 40504 45004 49504 54004 58504 63004 67504 72004 76504 81004 85504 90004 94504 99004 103504 108004 112504 117004 121504 126004 130504 5 4505 9005 13505 18005 22505 27005 31505 36005 40505 45005 49505 54005 58505 63005 67505 72005 76505 81005 85505 90005 94505 99005 103505 108005 112505 117005 121505 126005 130505 6 4506 9006 13506 18006 22506 27006 31506 36006 40506 45006 49506 54006 58506 63006 67506 72006 76506 81006 85506 90006 94506 99006 103506 108006 112506 117006 121506 126006 130506 7 4507 9007 13507 18007 22507 27007 31507 36007 40507 45007 49507 54007 58507 63007 67507 72007 76507 81007 85507 90007 94507 99007 103507 108007 112507 117007 121507 126007 130507 8 4508 9008 13508 18008 22508 27008 31508 36008 40508 45008 49508 54008 58508 63008 67508 72008 76508 81008 85508 90008 94508 99008 103508 108008 112508 117008 121508 126008 130508 9 4509 9009 13509 18009 22509 27009 31509 36009 40509 45009 49509 54009 58509 63009 67509 72009 76509 81009 85509 90009 94509 99009 103509 108009 112509 117009 121509 126009 130509 10 4510 9010 13510 18010 22510 27010 31510 36010 40510 45010 49510 54010 58510 63010 67510 72010 76510 81010 85510 90010 94510 99010 103510 108010 112510 117010 121510 126010 130510
区画を決めます
n1 = 90;
m1 = 72;
何分割にするか決めます
step = round([n m]./[n1 m1]);
cellに格納します
for ii = 1:n1
for jj = 1:m1
A{ii,jj} = data(step(1)*(ii-1)+1:step(1)*ii,step(2)*(jj-1)+1:step(2)*jj);
end
end
各区画で平均を取ります
B = cellfun(@(x) mean(x,["all"]),A)
B = 90×72
1.0e+07 * 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972 0.0099 0.0302 0.0504 0.0707 0.0909 0.1112 0.1314 0.1517 0.1719 0.1922 0.2124 0.2327 0.2529 0.2732 0.2934 0.3137 0.3339 0.3542 0.3744 0.3947 0.4149 0.4352 0.4554 0.4757 0.4959 0.5162 0.5364 0.5567 0.5769 0.5972
-----
ここで問題になるのが、3251は72で割り切れないことです
つまり『あまりの列』が存在し、それらは切り捨てられます
(data(1,end)-A{1,end}(1,end))/n
ans = 11
11列分のデータが切り捨てられてしまいます
ありがとうございます。
実際、下記のようなものを組んでいます。エラーが出てしまいます。どのようにすればよろしいでしょうか。
要は、Bを、緯度(2°間隔、90データ)・経度(5°間隔、72データ)にしたいです。
最終的には、Bをメルカトル図法で描画することをイメージしています。
申し訳ございませんが、ご教示いただけますと幸いです。よろしくお願いいたします。
<変数>
mT, lon, lat 4500×2001
<エラー>
Index in position 2 exceeds array bounds. Index must not exceed 2001.
clear; close;
numfiles = 12;
mydata = cell(1, numfiles);
temp=[];
for k = 1:numfiles
filename = sprintf('../data/2000_%02d_t.nc', k);
Temp = ncread(filename,'water_temp');temp=[temp,Temp];
lon=ncread(filename,'lon');lat=ncread(filename,'lat');
close;
end
lon=repmat(lon,1,size(lat,1));lat=repmat(lat',size(lon,1),1);
temp=reshape(temp,[size(lon,1) size(lon,2) numfiles]);
mT=mean(temp,3); %3Dでmeanを取る。
%% 区画平均を取る
n=size(lon,1); m=size(lon,2); %区画を決めます
n1=90; m1=72; %何分割にするか決めます
step = round([n m]./[n1 m1]);
% cellに格納します
for ii = 1:n1
for jj = 1:m1
A{ii,jj} = mT(step(1)*(ii-1)+1:step(1)*ii,step(2)*(jj-1)+1:step(2)*jj);
end
end
% 区画で平均を取ります
B = cellfun(@(x) mean(x,["all"]),A);
Hernia Baby
Hernia Baby on 12 Apr 2022
Edited: Hernia Baby on 12 Apr 2022
エラー行は
for ii = 1:n1
for jj = 1:m1
A{ii,jj} = mT(step(1)*(ii-1)+1:step(1)*ii,step(2)*(jj-1)+1:step(2)*jj);
end
end
でしょうか?
であれば、これは丸め方がダメです
round 関数が 28 > m/m1 で計算しているので、このようなエラーが置きます
27 < m/m1 のようにするには fixfloor を使用してください
% step = round([n m]./[n1 m1]);
step = fix([n m]./[n1 m1]);
です

Sign in to comment.

Products

Asked:

on 7 Apr 2022

Edited:

on 12 Apr 2022

Community Treasure Hunt

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

Start Hunting!