作业帮 > 综合 > 作业

用matlab编写一个高斯核密度函数

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/27 15:34:16
用matlab编写一个高斯核密度函数

上面是高斯核密度函数的形式,h为窗宽,x1,x2,.xn是样本的点,用matlab编写的程序如下:
function c=yanyan(x,y,z)
n=length(y)
 zz=vectorize(sum(exp(-(x-y)^2)/(2*z^2)))
yux=n*z*(2*pi)^0.5
c=zz/yux
end
x----未知数
y----x1,x2.xn这个向量
z-----窗宽
zz是指
这些相加
yux是指

,但是matlab现实too many  input,
1、你是怎样调用的?照理说,如果是正常的调用,例如
yanyan(1.5,1:10,.1)
应该会出现Matrix must be square的提示,而不会是too many  input.
 
2、vectorize不是这样用的,它只能把一个char类型的表达式或sym、inline对象给替换成点运算,而对于一个double类型的数值,会强制转换为char类型,可能导致丢失精度(因为char的表示范围有限,即使在中文环境下,范围也只是0-65535,而且只能是整数).
 
3、表达式写错了,把2h^2给放到指数函数外面了,也就是说
exp(-(x-y)^2)/(2*z^2)
应为
exp(-(x-y)^2/(2*z^2))
 
4、可以简单修改如下:
function c=yanyan(x,y,z)
n=length(y);
zz=sum(exp(-(x-y).^2/(2*z^2)));
yux=n*z*(2*pi)^0.5;
c=zz/yux;
但这样的写法不支持x为向量的情况,可以考虑改成
function c=yanyan(x,y,z)
n=length(y);
yux=n*z*(2*pi)^0.5;
c=arrayfun(@(x)sum(exp(-(x-y).^2/(2*z^2))),x)/yux;