You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MATLAB函数调用fzero报错:未识别变量p的问题求助

问题原因

你的报错是因为fzero调用的匿名函数无法访问到log_likelihood的输入参数p。虽然匿名函数理论上应该捕获定义时所在函数工作区的变量,但在部分场景下(比如函数被作为句柄传递给其他优化工具时),这种捕获会失效。最稳妥的解决方式是显式将p作为额外参数传递给匿名函数。

解决方案

修改fzero的调用方式,让匿名函数接收p作为参数,并通过fzero的额外参数机制传递进去:

function llik = log_likelihood(p)
global d;
N = length(d);
% 显式将p作为参数传入匿名函数,并用fzero的额外参数传递
tau = fzero(@(t, p_val) (t - (t^2 * p_val + 1 - p_val) / (2 * (t * p_val + 1 - p_val))), [0,1], [], p);

loglik = 0;
for i = 1 : N
    % 修正原代码中的括号错误(原逻辑的括号位置会导致计算错误)
    loglik = loglik + log(isnan(d(i))*(1 - p*(1 - tau)) + ~isnan(d(i))*p*(1 - tau));
end

llik = loglik / N;
end
额外说明
  1. 原代码中log内的表达式存在括号错误:isnan(d(i)) * (1 - p*(1-tau) + ~isnan(d(i))*p*(1-tau))会导致错误的权重计算,修正为分情况相加的逻辑(当d(i)为NaN时取1-p*(1-tau),否则取p*(1-tau))。
  2. fzero的第四个参数及之后的参数会被传递给匿名函数作为额外输入,这里我们将p传递给匿名函数的p_val参数,确保作用域正确。

内容的提问来源于stack exchange,提问作者SZ2022

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:50:21