Matlab - 使用 arrayfun 评估嵌套匿名函数

Matlab - Evaluating nested anonymous function with arrayfun

我想在 Matlab 中计算一个匿名函数,它又由几个匿名函数组成。

请原谅变量标记有些混乱,因为这是原始问题的高度简化版本:

C.B_MT = 2; C.T = 24; C.OM_MT = 1/24; C.P_WTmax = 2;
ub = 3;
ObjFcn = @(x) CostFcn1(x,C,ub);
x = 1:4;
fit = ObjFcn(x)

ObjFcn调用的函数如下:

function F = CostFcn1(x,C,ub)
    F = f_t(x,C,ub) + OM_DG(C) + TCPD_BES(x,C);
    function ft = f_t(x,C,ub)
        N = cell(1,2);
        ft = x(2)*C.B_MT+ub;
        for i = 1:2
            N{i} = C.B_MT*x(i+2)+ub;
        end
        ft = ft(x) + sum(arrayfun(@(N_q) N_q{1}(x), N));
    end

    function om_dg = OM_DG(C)
        om_dg = C.T*C.OM_MT;
    end

    function tcpd = TCPD_BES(x,C)
        tcpd = x(1)*C.P_WTmax;
    end
end

当我 运行 没有 for 循环和 arrayfun 部分的代码时,它可以正常工作 (fit = 10)。然而,使用 arrayfun,我得到一个错误。如何更改 arrayfun 不会导致任何问题的代码?

问题出在您尝试访问 ft(x)N_q{1}(x) 的部分。用 ftN_q{1} 替换这些部分,你应该可以开始了。

此外,除非您需要在您拥有的三个嵌套函数中执行任何其他操作。你可以去掉这些函数,直接使用它们里面的语句。这将为您节省很多开销。这里我添加优化代码:

function F = CostFcn1(x,C,ub)
    om_dg = C.T*C.OM_MT;
    tcpd = x(1)*C.P_WTmax;
    N = zeros(1,2);
    ft = x(2)*C.B_MT+ub;
    for i = 1:2
        N(i) = C.B_MT*x(i+2)+ub;
    end
    ft = ft + sum(N);
    F = ft + om_dg + tcpd;
end

如果您的原始代码与您发布的代码相似(此处使用的变量与原始代码中的变量类型相同),这应该有效