【发布时间】:2013-10-25 10:05:59
【问题描述】:
'Outliers.m' 从更高级别的 .m 文件中调用。这些变量都在更高级别的文件中定义,并设置为全局变量以供 Outliers.m 访问。代码的目的是使用 Chauvenets Criterion 识别异常值,为此,我必须使用 Integral 函数和函数句柄来计算高斯分布的积分。当我输入特定变量作为测试时,代码可以工作并给出合理的值,但我无法让它在循环中工作。我的数据集由 7 个单独的样本组成,每个样本为 1x30,所有这些样本都需要进行分析。我遇到了各种错误,通读了关于 Integral 和函数句柄的指南,但似乎找不到解决方案......任何帮助或指导将不胜感激......这是我的代码:
n = 7
for x = 1:n
for y = 1:30
z(x,y) = abs((cc(x,y) - mastercc(1,y))/masterccstd(1,y));
xmax(x,y) = mastercc(1,y)+z(x,y)*masterccstd(1,y);
xmin(x,y) = mastercc(1,y)-z(x,y)*masterccstd(1,y);
p(x,y) = 1/(masterccstd(1,y)*(sqrt(2*pi)));
fun(x,y)= @(x,y,z) (exp(-1/2)*z(x,y).^2);
q(x,y) = integral(fun(x,y),xmin(x,y),xmax(x,y),'ArrayValued',true);
pq(x,y) = p(x,y)*q(x,y); % probability
value(x,y) = n*(1/pq(x,y));
count(x,y) = logical(value(x,y) <0.5);
badbins(x)=sum(count(x,:));
end
end
【问题讨论】:
-
您的问题是什么?如果您遇到错误消息,请说明确切的消息,出现在哪一行,并描述相关变量。
-
嗨 Denis - 抱歉,忘记输入错误了!这是:错误使用@(x,y,z)(exp(-1/2).*z(x,y).^2) 输入参数不足。异常值错误(第 30 行)q(x,y) = integral(fun(x,y),xmin(x,y),xmax(x,y),'ArrayValued',true); mastercal_diameters(第 46 行)异常值中的错误
-
您为什么要打开
'ArrayValued'选项并将其设置为true?据我所知,你的函数fun的输出是一个标量,不是吗?但是从您下面的评论看来,您甚至可能没有使用此代码。您是否正确定义、传入和调用函数句柄?:fun = @(z)exp(-1/2)*z.^2;q(x,y) = integral(fun(z(x,y)),xmin(x,y),xmax(x,y));。 -
@horchler - 结果应该是 7x30 双倍,因为我需要 7x30 双倍中每个数据点的概率,称为“cc”。我已经运行了上面的原始代码,但是替换了您建议的 2 行代码并得到一个新错误:“使用积分时出错(第 83 行)第一个输入参数必须是函数句柄。异常值中的错误(第 30 行)q(x, y) = 积分(fun(z(x,y)),xmin(x,y),xmax(x,y));"有趣的是,'fun' 确实在工作区中显示为函数句柄(确认:isa(fun,'function_handle') = 1)
标签: matlab loops integral function-handle