2017-07-01 47 views
0

我想在Matlab中评估一个匿名函数,它又由几个匿名函数组成。Matlab - 用arrayfun评估嵌套匿名函数

请原谅的变量有点混乱的标签,因为这是原问题的一个非常简化的版本:

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不会导致任何问题的代码?

+0

问题与你试图访问'ft(x)'和'N_q {1}(x)'的部分。用'ft'和'N_q {1}'替换这些部件,你应该很好走。另外,除非你需要在三个嵌套函数中做其他任何事情。你可以摆脱这些功能,直接使用它们中的语句。这将为您节省大量的开销 – anyanwu

+0

谢谢@ammportal!这个小调整做了诀窍。真正的代码终于顺利运行。 – Maluquinho

+0

@ammportal,请考虑创建一个答案或OP(Maluquinho)可以自己做。 – m7913d

回答

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 

这应该工作,如果你原来的代码是相似的(这里使用的变量具有相同的类型在原始代码),您已发布了一个