这个matlab函数代码有什么问题?

时间:2013-06-02 01:32:32

标签: matlab

我不确定为什么这段代码不会运行。请帮助

function y = PdfMixUnfmBeta(x,alpha)
    if x < 0 
y = (1-alpha).*1/2;
    elseif x >= 0 
y = (1-alpha).*1/2 + alpha.*6*x*(1-x);
end;

当我按如下方式执行此功能时,出现错误

EDU>> x=-1:0.01:1;
EDU>> a=PdfMixUnfmBeta(x,0.4)
Error in PdfMixUnfmBeta (line 2)
if x < 0 

1 个答案:

答案 0 :(得分:0)

你的函数的问题在于你假设x是单个值,然后你已经传递了一个向量。你的代码无法解决这个问题。

如果您尝试使用单个值运行代码,例如:a=PdfMixUnfmBeta(15,0.4)您的函数应该运行。

让我们看看你的代码究竟出了什么问题,当我尝试运行你的代码时,我遇到了以下错误:

Output argument "y" (and maybe others) not assigned during call

这表示分配给y的行从未实际执行过。这表明条件语句(x < 0x >= 0)都没有评估为真。 if语句需要一个标量逻辑值,但在您的示例中,它提供了一个逻辑向量。

因此,为了解决这个问题,你需要通过将它包装在for循环中来一次处理一个x值,例如:

function y = PdfMixUnfmBeta(x_vec, alpha)
  for x = x_vec
    %do your function here
  end
end

或者,您可以对代码进行矢量化,这是目前最好的解决方案:

y = zeros(1,length(x));
% where x is < 0 use this formula
y(x < 0) = (1-alpha) .*(1/2); 
% where x is >= 0 use this formula instead.
y(x >= 0) = (1-alpha) .* (1/2) + (alpha .* 6 .* x .* (1-x)); 

在上面的解决方案中,我使用逻辑索引并将部分*更改为.*。您可能会发现查找*.*之间的差异并阅读矢量化非常有用。