[英]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)
。 將這些部分替換為ft
和N_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.