matlabエラーメッセージの怪
エラーメッセージに騙されて格闘した30分間に記録.
正規分布をつくるために,横軸0から255を256段階で用意し,標準偏差を適当にきめ,平均をグレースケールの画像上のある画素の輝度値から決めた.
normpdfは正規分布(matlab的には正規確率密度関数)を返す関数である.
img_gray = imread('sample.png'); lin = linspace(0,255,256); sigma = 10; mu = img_gray(1,1); pdfdata = normpdf(lin, mu, sigma);
すると以下の様なエラーが返ってきた.
Error using normpdf (line 36) Non-scalar arguments must match in size.
normpdfを使う上でエラーが発生した.スカラじゃない引数はサイズが一致している必要があるという.
もう一度引数を確認すると
lin <1x256 double>
mu 16
sigma 10
となっており,問題があるように思えない.試しに以下のようにmuを宣言して実行してみる.
mu = 16; pdfdata = normpdf(lin, mu, sigma);
するとうまくいった.直接値をmuに代入するとうまくいくようだ.
おそらくスカラとベクトルの問題ではなく,データ型の問題のような気がしてくる.
エラーメッセージより,normpdf.mの36行目付近を見にいく.
try y = exp(-0.5 * ((x - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma); catch error(message('stats:normpdf:InputSizeMismatch')); end
この条件分岐では,エラーが出たときはいつも「サイズのミスマッチ」と表示するようだ!
上の数式だけをコピーして実行すると
Undefined function 'exp' for input arguments of type 'uint8'.
というエラーメッセージが返ってきた.やはりデータ型の問題だったようだ.
今回グレースケールの画像は符号無し整数型で読み込んだが,expはdoubleを引数にとるんだね.
mu_double = cast(mu, 'double)'; pdfdata = normpdf(lin, mu_double, sigma);
これで上手くいった!
エラーメッセージを信用してはならないという教訓を得た.