我想在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
不会导致任何问题的代码?
答案 0 :(得分:0)
问题在于您尝试访问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
如果您的原始代码类似(此处使用的变量与原始代码中的变量类型相同),那么这应该适用于您发布的代码