質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

2回答

8190閲覧

行列の一部分の平均値を取り出す

ytkytk

総合スコア8

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

0クリップ

投稿2018/06/22 17:15

編集2018/06/22 21:21

matlabです。
例えば、
A = [1,2,3,4,5;6,7,8,9,10;11,12,13,14,15]
とあった場合、
左上部1,2;6,7のみの平均値を出したい場合はどのようにしたらいいでしょうか。
このような処理を一度に大量に行うため、できるだけ簡潔な方法でしたいと思っています。

初心者な私が思いついた方法は、

X = A(1:2,:) XY = X(:,1:2)

と、指定ウィンドウを切り取り、
Mcol = mean(XY)
Colum方向に平均し、
Mrow = mean(Mcol,2)
最後にRow方向に平均する、という大変面倒くさい方法です。
もっと簡単なコマンドなどありましたら、教えて下さると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

おまじないの感覚で(:)を追加しておくと一次元にできますね。

Matlab

1m = mean(A(1:2,1:2)(:)); 2 3% これは次とだいたい同じ 4tmp=A(1:2, 1:2); 5m = mean(tmp(:));

投稿2018/06/22 23:31

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ytkytk

2018/06/22 23:55

ありがとうございます。先ほどその方法を試しまして、10倍以上早くなりました。ありがとうございます。
guest

0

自己解決

解決しました。
Some small improvements are:

Get XY using indexing in a single step: XY = A(1:2, 1:2)
Replace the two calls to mean by a single one on the linearized submatrix: mean(XY(:)).
Avoid creating XY. In this case you can linearize using reshape as follows: mean(reshape(A(1:2, 1:2), 1, [])).
If you want to do this for all overlapping submatrices, im2col from the Image Processing Toolbox may be handy:

submatrix_size = [2 2];
A_sub = im2col(A, submatrix_size);
gives

A_sub =
1 6 2 7 3 8 4 9
6 11 7 12 8 13 9 14
2 7 3 8 4 9 5 10
7 12 8 13 9 14 10 15
that is, each column is one of the submatrices linearized. So now you only need mean(A_sub, 1) to get the means of all submatrices.

投稿2018/06/22 23:53

ytkytk

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問