2017-07-01 17 views
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は何の問題も起こらないコードを変更するにはどうすればよいですか?

+0

問題があるを掲載しているものに(ここで使用される変数は、あなたの元のコードと同じ型を持つ)と類似である場合、これは動作するはずですあなたが 'ft(x)'と 'N_q {1}(x)'にアクセスしようとしている部分で。これらの部分を 'ft'と' N_q {1} 'に置き換えてください。また、あなたが持っている3つのネストされた関数で何か他のことをする必要がない限り、これらの関数を取り除き、その中のステートメントを直接使用することができます。それはあなたに多くのオーバーヘッドを節約します – anyanwu

+0

ありがとうございます@ammportal!この小さな微調整がトリックでした。実際のコードはついにスムーズに動いています。 – Maluquinho

+0

@ammportal、回答を作成するか、OP(Maluquinho)が自分自身で行う可能性があります。 – m7913d

答えて

0

ft(x)N_q{1}(x)にアクセスしようとしている部分に問題があります。これらの部品をftN_q{1}に交換してください。

あなたが持っている3つのネストされた関数で何か他のことをする必要がない限り、また。これらの関数を取り除き、その中のステートメントを直接使用することができます。それはあなたに多くのオーバーヘッドを節約します。ここで私は、最適化されたコードを追加します。

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 

あなたの元のコードは、あなたが

関連する問題