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
ときI for-loopの部分を使わずにコードを実行し、、問題なく動作します(fit = 10
)。しかし、arrayfun
ではエラーが発生します。 arrayfun
は何の問題も起こらないコードを変更するにはどうすればよいですか?
問題があるを掲載しているものに(ここで使用される変数は、あなたの元のコードと同じ型を持つ)と類似である場合、これは動作するはずですあなたが 'ft(x)'と 'N_q {1}(x)'にアクセスしようとしている部分で。これらの部分を 'ft'と' N_q {1} 'に置き換えてください。また、あなたが持っている3つのネストされた関数で何か他のことをする必要がない限り、これらの関数を取り除き、その中のステートメントを直接使用することができます。それはあなたに多くのオーバーヘッドを節約します – anyanwu
ありがとうございます@ammportal!この小さな微調整がトリックでした。実際のコードはついにスムーズに動いています。 – Maluquinho
@ammportal、回答を作成するか、OP(Maluquinho)が自分自身で行う可能性があります。 – m7913d