MATLAB Answers

0

行列の分散について

Asked by Taiki Murakawa on 1 Oct 2018
Latest activity Commented on by Taiki Murakawa on 2 Oct 2018

現在、画像の輝度値の分散を求めることを目標に勉強しており、分散値を求めるvar関数について知りました。 そこで、ドキュメンテーションで調べていたら、行列の分散で以下のようなプログラムが記載されていました。

A = [4 -7 3; 1 4 -2; 10 7 9]; var(A)

ans = 1×3

   21.0000   54.3333   30.3333

これはどのような計算手順で求め、先のような答えになったのか分からないです。 ちなみに、分散の定義については理解しており、行列での求め方に困っている状態です。 分かる方ご教示願います。

  0 Comments

Sign in to comment.

1 Answer

Answer by Hirokazu Tanaka on 1 Oct 2018
 Accepted Answer

var 関数や sum 関数もそうですが、行列に対して計算する場合には、基本的には縦方向、すなわち各列に対してそれぞれ計算します。

 A = [4 -7 3; 1 4 -2; 10 7 9];
 var(A)

と計算した場合には、[4,1,10] の分散、[-7,4,7] の分散、[3,-2,9] の分散がそれぞれ計算されています。

定義自体は https://jp.mathworks.com/help/matlab/ref/var.html の下部にあります。

  4 Comments

Show 1 older comment
Taiki Murakawa on 1 Oct 2018
回答ありがとうございます。 求め方について理解することができました。
また、もう一点質問させていただきたいのですがよろしいでしょうか。 コメントで記載されていた var(A(:))を打つとエラーが出てきます。 以下にそのプログラムを示します。
>> A=imread('sample.PNG'); >> var(A(:)) エラー: var (line 66) データ型が無効です。最初の入力引数は single または double でなければなりません。
sample.PNGを読み込んで、輝度値の行列を確認しました。 しかし、次にvar関数を用いようとするとエラーが発生します。 お時間がありましたら、ご教示願います。
Hirokazu Tanaka on 1 Oct 2018
最初の入力引数は single または double でなければなりません。
とのエラーメッセージを転記頂いている通り、A が single型あるいはdouble型の数値でないことが原因かと。恐らく、、整数型で読み込まれているのではと推測していますが、
whos A
と実行するとデータ型を確認できますので、一応確認してみてください。
もし double 型に変換して分散を計算するのであれば、
Ad = double(A);
var(Ad(:))
でいけるかと思います。
ふと検索してみたところ、Image Processing Toolbox は画像データのための関数があるようです。もし Image Processing Toolbox も使えるようでしたら見てみてください。
Taiki Murakawa on 2 Oct 2018
回答ありがとうございます。 無事に分散を求めることができました。 Image Processing Toolboxの方に関しては、もう少し検討させていただきます。
この回答を採用させていただきます。 本当にありがとうございました。

Sign in to comment.