【问题标题】:Matlab integral function & function handles in a loop循环中的Matlab积分函数和函数句柄
【发布时间】: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


【解决方案1】:

您的错误似乎是由无效的函数定义引起的。

如果你像这样尝试它应该可以工作:

fun = @(x,y,z) (exp(-1/2)*z(x,y).^2)

现在可以这样调用,例如:

fun(1,2,magic(4))

【讨论】:

  • 我将函数句柄替换为:fun = @(x,y,z) (exp(-1/2)*z(x,y).^2);和积分函数: q(x,y) = integral(fun(x,y,z),xmin(x,y),xmax(x,y),'ArrayValued',true);它也出现了同样的错误.....
  • @GingerMonster 请使用dbstop if error 运行它,并在代码停止的那一行描述您尝试输入的变量。
  • 错误在“integral”行停止,并返回到函数句柄“fun”。此时的变量是: x = 1 y = 1 z = 0.2502 xmax = 1.9428 xmin = 1.9104 如果有帮助,这里是相同的代码,但没有循环,变量替换为常量:n = 7; z = abs(4.3794 - 1)/1; xmax = 1+z*1; xmin = 1-z*1; p = 1/(1*2.5066);乐趣 = @(z) exp(-1/2*z.^2); q = 积分(乐趣,xmin,xmax); pq = p*q;值 = 6*1/pq;计数 = 逻辑(值
  • @GingerMonster 您在此评论中发布的功能对我来说运行没有问题。如果您不是这种情况,请重新启动 matlab 并重试。 -- 我想你可能会要求integral 做一些它不能做的事情。请尝试踩help integral,然后从一个小问题开始,从那里开始。
  • 只是为了确认一下,re: 可以毫无问题地运行的代码,是带循环还是不带循环的代码?我已经重新启动了 matlab 并且没有喜悦(在循环中运行)。我已经通读了关于 Integral 和 FunctionHandles 的帮助(多次!)。感谢您迄今为止的帮助和时间 - 希望解决方案很快就会出现!
【解决方案2】:

循环问题的解决方案,由 Andrei Bobrov 通过 Matlab Central 提供,链接如下:

http://www.mathworks.com/matlabcentral/answers/103958#comment_177000

注意:请注意,我在问题描述中解释的目的代码并不完整,但它确实解决了循环错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多