normpdf and integral: non-scalalr arguments must match in size

30 views (last 30 days)
I want to compute a numerical integration problem, the code for which is as follows
mu=0;
sig2_tmp=1;
k=100;
samps=normrnd(mu,sig2_tmp,[k,1]);
func=@(x)prod(normpdf(samps,mu,x));
c(j)=integral(func,0,inf);
It gives the following error message:
Error using normpdf (line 36)
Non-scalar arguments must match in size.
Error in @(x)prod(normpdf(samps,mu,x))
But when I evaluate func at x=1, it works fine. So, I don't know how to fix this error.
Please help.

Answers (1)

Torsten
Torsten on 11 Oct 2018
Does it make sense to integrate the pdf's over the standard deviation ?
In any case:
Try
func=@(x)prod(normpdf(samps,ones(size(x))*mu,x));
Best wishes
Torsten.
  2 Comments
Torsten
Torsten on 12 Oct 2018
This code works for me:
function main
mu=0;
sig2_tmp=1;
k=100;
samps=randn(k,1);
samps=mu+sig2_tmp*samps;
func=@(x)prod(normpdf_gnu(samps,mu,x));
c=integral(func,0,inf)
end
function p = normpdf_gnu(x,m,s);
% NORMPDF returns normal probability density
%
% pdf = normpdf(x,m,s);
%
% Computes the PDF of a the normal distribution
% with mean m and standard deviation s
% default: m=0; s=1;
% x,m,s must be matrices of same size, or any one can be a scalar.
%
% see also: NORMCDF, NORMINV
% Reference(s):
% $Revision: 1.6 $
% $Id: normpdf.m,v 1.6 2003/03/13 16:00:33 schloegl Exp $
% Version 1.28 Date: 13 Mar 2003
% Copyright (c) 2000-2003 by Alois Schloegl <a.schloegl@ieee.org>
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
if nargin==1,
m=0;s=1;
elseif nargin==2,
s=1;
end;
% allocate output memory and check size of argument
z = (x-m)./s; % if this line causes an error, input arguments do not fit.
%p = ((2*pi)^(-1/2))*exp(-z.^2/2)./s;
SQ2PI = 2.5066282746310005024157652848110;
p = exp(-z.^2/2)./(s*SQ2PI);
p((x==m) & (s==0)) = inf;
p(isinf(z)~=0) = 0;
p(isnan(x) | isnan(m) | isnan(s) | (s<0)) = nan;
end

Sign in to comment.

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!