配列の演算

6 views (last 30 days)
Uka
Uka on 21 Jan 2023
Commented: Uka on 21 Jan 2023
お世話になります。
3次元配列を、ページごとに違う値で割る計算をforループで行い、ループのすべての結果を格納しようとしていますが、結果がすべて同じ値になってしまいます。
具体的には、file_fig_t_yz(:,:,n)という3次元配列を、そのページごとの行と列の和であるfile_fig_sum_yz(:,n)で割り、ページごとの平均値を計算しMden_yz(:,n)にループのすべての結果を格納しようとしていますが、おそらくループの最後の結果のみがn個格納されてしまいます。
現在、書いているコードは以下の通りです。
Mden_yz=zeros(1,632)
n=1;
file_fig_t_yz=zeros(1109,1064,632);file_fig_sum_yz=zeros(1,632);
for i=1:632;
file_fig_t_yz(:,:,n)=boxes01(i-dif_x,1:ymax-ymin+1+dif_y,1:zmax-zmin+1+dif_z)-boxes00(i,1-dif_y:ymax-ymin+1,1-dif_z:zmax-zmin+1);
file_fig_sum_yz(:,n)=sum(sum(file_fig_t_yz(:,:,n)));
Mden_yz(:,n)=mean(mean(mean(file_fig_t_yz(:,:,n))/file_fig_sum_yz(:,n)));
 n=n+1;
end
Matlab初心者なので色々問題あるかもしれないですが、アドバイスよろしくお願いいたします。

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 21 Jan 2023
Mden_yz(:,n) = mean(mean(mean(file_fig_t_yz(:,:,n))/file_fig_sum_yz(:,n)));
ここが意図しない動作の原因になっています。file_fig_t_yz(:,:,n)という3次元配列を、そのページごとの行と列の和であるfile_fig_sum_yz(:,n)で割る前に平均値を演算してしまっています。
Mden_yz(:,n) = mean(mean( ... % ← 平均値を自分で演算するのにmean関数を使うのはおかしい
mean(file_fig_t_yz(:,:,n)) ... % ←ここ 括弧の順番が違う。各要素を合計値で割る前にmean関数がある
/file_fig_sum_yz(:,n) ...
));
しかも、mean(file_fig_t_yz(:,:,n)) は、サイズが 1 ではない最初の配列の次元に沿った A の要素の平均値を返すのですが、入力が行列の場合は各列の平均値を含む行ベクトルを返します。つまり dim — 演算の対象の次元 のデフォルト値は1です。
直すなら下記の様に直すべきだと思います。
Mden_yz(n) = sum(sum(file_fig_t_yz(:,:,n)/file_fig_sum_yz(:,n)));
  9 Comments
Uka
Uka on 21 Jan 2023
すみません、私も計算の意味を考えなおします。
ご丁寧なアドバイス、誠にありがとうございます。
配列の要素を、配列の合計値で割り、要素ごとに合計値との比を出すことが目的です。とりあえず以下のように書き換えました。ページごとの平均値をページごとの和で割りたいので引き続き検討します。
for i=1:632;
file_fig_t_yz(:,:,i)=boxes01(i-dif_x,1:ymax-ymin+1+dif_y,1:zmax-zmin+1+dif_z)-boxes00(i,1-dif_y:ymax-ymin+1,1-dif_z:zmax-zmin+1);
file_fig_sum_yz(i)=sum(sum(file_fig_t_yz(:,:,i)));%ページごとの和
end
Mden_yzB=mean(mean(file_fig_t_yz,1),2); %ページごとの平均値
Mden_yzC=squeeze(Mden_yzB);
Uka
Uka on 21 Jan 2023
アドバイスいただいてから、色々計算の意味などを見直し、無事解決致しました。誠にありがとうございます!

Sign in to comment.

More Answers (0)

Categories

Find more on ループと条件付きステートメント in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!