normpdf ведет себя странно

Таким образом,

function ret = f(pIx5, dS)
    sigma = 1;    

    rho = dS(1);
    theta = dS(2);

    mu_x = rho*cos(theta);

    display(pIx5);
    display(mu_x);

    pdf = normpdf(pIx5, mu_x, sigma);

    ret = max(pdf);
end

Я получаю следующее сообщение об ошибке,

pIx5 =
       54   65   11    0    0

mu_x =
       11.9218

Error using normpdf (line 36) Non-scalar arguments must match in size.

Error in f (line 11)

        pdf = normpdf(pIx5, mu_x, sigma);

Но он отлично работает следующим образом:

function ret = f(pIx5, dS)
    sigma = 1;    

    rho = dS(1);
    theta = dS(2);

    pIx5 = [54,65, 11, 0, 0];

    mu_x = 11.9218;

    display(pIx5);
    display(mu_x);

    pdf = normpdf(pIx5, mu_x, sigma);

    ret = max(pdf);
end

Что здесь происходит?


person user366312    schedule 26.06.2017    source источник
comment
Я не могу воспроизвести вашу ошибку.   -  person rayryeng    schedule 26.06.2017


Ответы (1)


Я готов поспорить на значительные суммы денег, что проблема связана с типом типа вашего ввода pIx5. Обратите внимание на это:

>> pdf = normpdf([54 65 11 0 0], 11.9218, 1);  % Works fine
>> pdf = normpdf(uint8([54 65 11 0 0]), 11.9218, 1);
Error using normpdf (line 36)
Non-scalar arguments must match in size.

Почему выдает ошибку размера для того, что должно быть связано с типом? Взглянув на код для normpdf, вы получите ответ. С маршрутов 33-37, R2016b:

...
try
    y = exp(-0.5 * ((x - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
catch
   error(message('stats:normpdf:InputSizeMismatch'));
end

Обычно любая ошибка при оценке этого уравнения сообщается как ошибка несоответствия размера. В этом случае проблема связана с тем, что exp не работает для целых чисел. типы данных (поддерживаются только типы single и double):

>> x = uint8([54 65 11 0 0]);
>> mu = 11.9218;
>> sigma = 1;
>> y = exp(-0.5 * ((x - mu)./sigma).^2) ./ (sqrt(2*pi) .* sigma);
Undefined function 'exp' for input arguments of type 'uint8'.

Тогда решение? Просто передайте свои оскорбительные данные в single или double:

pdf = normpdf(double(pIx5), mu_x, sigma);
person gnovice    schedule 26.06.2017
comment
Точно! Как я могу это обойти? - person user366312; 26.06.2017
comment
Это серьезная ошибка. Я впервые увидел, что MATLAB выдает сообщение об ошибке без корреляции с тем, что на самом деле происходит в методе. - person rayryeng; 26.06.2017
comment
@anonymous Просто передайте свои входные данные double перед использованием normpdf. - person rayryeng; 26.06.2017
comment
Хороший улов! Это try catch действительно недоброжелательно. - person kedarps; 27.06.2017