配列の演算
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
0 개 추천
お世話になります。
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初心者なので色々問題あるかもしれないですが、アドバイスよろしくお願いいたします。
채택된 답변
Atsushi Ueno
2023년 1월 21일
0 개 추천
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
Atsushi Ueno
2023년 1월 21일
편집: Atsushi Ueno
2023년 1월 21일
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);
end
Mden_yz = mean(file_fig_t_yz,[1 2]);
Atsushi Ueno
2023년 1월 21일
file_fig_sum_yz(:,n)=sum(sum(file_fig_t_yz(:,:,n)));
この行を単独でみると「そのページごとの行と列の和」はスカラ値なので、file_fig_sum_yz(:,n)と2次元にする必要は無いなと思ってしまいます。なおスカラ値でも当該コードは問題無く動作します。何か file_fig_sum_yz を他の用途に使う為に2次元として持っているのかもしれません。
Uka
2023년 1월 21일
ご回答、誠にありがとうございます。
さっそくコマンドウィンドウの方でmean(file_fig_t_yz,[1 2])の計算を確認してみたのですが、以下のエラーが出てしまいました。配列の一部要素が0であるためかと思い、‘omitnan’など試したのですが、うまくいきません。
>> mean(file_fig_t_yz,[1 2])
??? エラー ==> sum
次元の引数は、インデックス付け範囲の中で、正の整数のスカラーでなければなりません。
エラー ==> mean at 30
y = sum(x,dim)/size(x,dim);
>> nanmean(file_fig_t_yz,[1 2])
??? 未定義の関数またはメソッド 'nanmean' (タイプ 'double' の入力引数)。
>> mean(file_fig_t_yz,[1 2],'omitnan')
??? エラー ==> mean
入力引数が多すぎます。
>> mean(file_fig_t_yz,'omitnan')
??? エラー ==> sum
文字列の入力の終わりは 'double' または 'native' でなければなりません。
Atsushi Ueno
2023년 1월 21일
先に紹介した vecdim を設定し mean(A,[1 2]) とする 機能は、R2018b でサポートされました。それより前のリリースで同じ事をするには mean(mean(A,1),2) または単に mean(mean(A)) とすれば良いです。
Uka
2023년 1월 21일
ご回答ありがとうございます。
おっしゃる通り、バージョンが古くサポートされていなかったようです。ありがとうございます。
そこで、以下のように書き換えてみたのですが、Mden_yzBの要素がある同じ数値の繰り返しとNaNだけになってしまいました(NaNはおそらく0÷0の結果)。ある同じ数値というのは、0÷0(NaN)になる1つ手前のループの計算結果です。
ループ計算ごとの格納がうまくいってないのでしょうか?
file_fig_t_yz=zeros(1109,1064,632);file_fig_sum_yz=zeros(1,632);Mden_yz=zeros(1109,1064,632); %Mden_yzB=zeros(1,1,632);
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)));
Mden_yz(:,:,i) = file_fig_t_yz(:,:,i)./file_fig_sum_yz(i).*SW./BS;
end
Mden_yzB=mean(mean(Mden_yz,1),2);
Atsushi Ueno
2023년 1월 21일
ちょっとこんがらがって来ました。改めて最初の質問を見直しました。
書くまでもありませんが平均値の定義は下記の通りです。
しかし最初の質問では、平均の定義とは異なる演算をしています。私も、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)
2次元配列のサイズがいつも同じ大きさになるのか、それとも最大1109*1064の可変サイズになるのかという事です。もし可変サイズなら、割る数も変更する必要があります。
Atsushi Ueno
2023년 1월 21일
이동: Atsushi Ueno
2023년 1월 21일
注目すべき点を抽出するとこういう事ですね。最後の結果のみがn個格納されてしまうのではなく、毎回同じ演算結果になっています。

rtN = 10;
N = rtN^2; % 100
for i=1:10
yz = rand(rtN,rtN);
mean(mean(yz/sum(sum(yz))))
end
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
ans = 0.0100
Uka
2023년 1월 21일
すみません、私も計算の意味を考えなおします。
ご丁寧なアドバイス、誠にありがとうございます。
配列の要素を、配列の合計値で割り、要素ごとに合計値との比を出すことが目的です。とりあえず以下のように書き換えました。ページごとの平均値をページごとの和で割りたいので引き続き検討します。
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
2023년 1월 21일
アドバイスいただいてから、色々計算の意味などを見直し、無事解決致しました。誠にありがとうございます!
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 Matrix Indexing에 대해 자세히 알아보기
태그
참고 항목
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)