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

时间:2017-07-01 17:17:52

标签: matlab function loops nested anonymous

我想在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-loop和arrayfun部分的代码时,它没有问题(fit = 10)。但是,使用arrayfun,我收到错误消息。如何更改arrayfun不会导致任何问题的代码?

1 个答案:

答案 0 :(得分:0)

问题在于您尝试访问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

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