読者です 読者をやめる 読者になる 読者になる

理科系の備忘録

Linux/Ubuntu/Mac/Emacs/Computer vision/Robotics

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);

これで上手くいった!
エラーメッセージを信用してはならないという教訓を得た.