簡體   English   中英

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

如果您的原始代碼與您發布的代碼相似(此處使用的變量與原始代碼的類型相同),則此方法應該有效

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM