【问题标题】:normpdf behaves strangelynormpdf 行为异常
【发布时间】:2017-06-27 00:07:19
【问题描述】:

通过以下方式,

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

这是怎么回事?

【问题讨论】:

  • 我无法重现您的错误。

标签: matlab probability-density


【解决方案1】:

我愿意赌大笔的钱,问题在于您输入的type 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 不适用于整数数据类型的问题(它只支持singledouble 类型):

>> 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'.

那么解决方案呢?只需首先将您的违规输入发送到singledouble

pdf = normpdf(double(pIx5), mu_x, sigma);

【讨论】:

  • 没错!我该如何解决这个问题?
  • 这是一个严重的错误。这是我第一次看到 MATLAB 产生与方法中实际发生的情况无关的错误消息。
  • @anonymous 只需在使用normpdf 之前将您的输入转换为double
  • 好收获!那个trycatch真是恶毒。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-05
  • 2017-01-22
  • 2013-04-14
  • 2014-01-29
  • 1970-01-01
  • 2011-01-13
相关资源
最近更新 更多