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)
的部分。用 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
如果您的原始代码与您发布的代码相似(此处使用的变量与原始代码中的变量类型相同),这应该有效
我想在 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
如果您的原始代码与您发布的代码相似(此处使用的变量与原始代码中的变量类型相同),这应该有效