首页 > 解决方案 > 在 Matlab 中嵌套多个函数

问题描述

我在 Matlab 中有两个嵌套函数。外部使用fminunc,我希望您帮助如何正确传递一些参数。这是我的代码

clear
rng default

%Some useful parameters
number_starting=10^3; 
r=10^5; 
J=2; 
epsilon_sim=-evrnd(0,1,r,J+1); %rx(J+1) 
options =  optimoptions(@fminunc, 'MaxFunctionEvaluations', 10^4 ,'MaxIterations', 10^4, 'StepTolerance', 10^(-8), 'Display', 'off');
u_starting=normrnd(0,1,number_starting,J); %rxJ

这是使用的外部功能fminunc

function conv_conjugate=G_star(P, number_starting, options, u_starting,epsilon_sim)

         fval=NaN(number_starting,1);
         exitflag=NaN(number_starting,1);

         for t=1:number_starting
             try
             coeff=u_starting(t,:).';  %starting values, column vector
             [~,fval_temp,exitflag_temp]=fminunc(@obj,coeff, options);
             fval(t)=fval_temp;
             exitflag(t)=exitflag_temp;
            catch 
             end
         end

         fval(exitflag>0,:);
         conv_conjugate=-min(fval);       
end

这是内部函数

function inner=obj(coeff)

comp1=sum(P.*(coeff.'));

comp2=mean(max(epsilon_sim+[coeff.' 0],[],2));

inner=-(comp1-comp2);
end

例如,在这里我尝试在给定的情况下评估外部函数,P它显然给了我一个错误,因为某些参数没有正确传递obj。你能建议吗?

P_0=[0.7387,0.1562];
G_star(P_0, number_starting, options, u_starting,epsilon_sim);

标签: matlab

解决方案


有两种不同的方法可以实现这一点。

1:简单的方法

我们创建一个封装函数值的匿名函数。您的内部功能变为:

function inner=obj(coeff,P,epsilon_sim)
    comp1 = sum(P.*(coeff.'));
    comp2 = mean(max(epsilon_sim+[coeff.' 0],[],2));
    inner = -(comp1-comp2);
end

这样它使用的所有值都作为参数传递给它,然后我们创建一个带有一个参数的匿名函数,该函数使用它obj的所有参数调用:

@(x)obj(x,P,epsilon_sim)

用法如下:

[~,fval_temp,exitflag_temp] = fminunc(@(x)obj(x,P,epsilon_sim),coeff, options);

2:更晦涩的方式

我说的比较晦涩,因为这种方法更难看出变量发生了什么。

在这里,我们创建了一个嵌套函数,它与嵌套它的函数共享变量。嵌套函数定义在另一个函数内部,并且只对该函数可见:

function conv_conjugate = G_star(P,number_starting,options,u_starting,epsilon_sim)
fval = NaN(number_starting,1);
exitflag = NaN(number_starting,1);
for t = 1:number_starting
   coeff = u_starting(t,:).';  %starting values, column vector
   [~,fval_temp,exitflag_temp] = fminunc(@obj,coeff, options);
   fval(t) = fval_temp;
   exitflag(t) = exitflag_temp;
end
fval(exitflag>0,:);
conv_conjugate = -min(fval);
   % Nested function:
   function inner=obj(coeff)
      comp1 = sum(P.*(coeff.'));
      comp2 = mean(max(epsilon_sim+[coeff.' 0],[],2));
      inner = -(comp1-comp2);
   end
end % Note this "end" terminates the enclosing function, and is mandatory.

在嵌套函数中,Pepsilon_sim与封闭函数共享。


推荐阅读