在某些执行路径上未分配输出参数

时间:2015-04-18 17:58:08

标签: matlab matlab-coder

我正在尝试运行MATLAB Coder将MATLAB .m文件转换为.mex,以便更快地运行代码。当尝试通过MATLAB Coder引擎构建文件时,我收到以下错误:

Output argument 'summstat' is not assigned on some execution paths

其中summstat是我试图编译的函数的输出参数。在我的代码的最后一行,我指定summstat

summstat = pinc;

其中pinc是整个代码中使用的另一个变量。当输出变量在if分支内部分配时,会发生此类问题,但这种情况并非如此。虽然我在整个代码中都有iffor,但分配不在其中任何一个(就像我说的那样,它是函数的最后一行)。

function summstat = fun(para,T)
coder.extrinsic('clock');
summstat = 0;
pinc = 0;

prob   = [ .8 .2; .5 .5];

A      = 1.00;

theta  = 0.05;
Kstart = 10.0;
g      = 0.20;


sigma = para(1);
beta = para(2);
delta = para(3);
alpha = para(4);

maxkap = 20;
inckap = 0.025;
nkap   = round(maxkap/inckap+1);



D = zeros(length(prob));
[ev,ed] = eig(prob);
[emax,inmax] = max(diag(ed));
if emax~=1;
   disp('are you sure the matrix prob is correct?');
end;
D(inmax,inmax) = real(emax);

pinf = ev*D*inv(ev);
pempl = pinf(inmax,inmax);
N = 1.0*pempl + theta*(1-pempl);

liter   = 1;
maxiter = 50;
toler   = 0.001;
metric  = 10;
K = Kstart;
Kold = 0;
nstates = size(prob,1);
decis = zeros(nkap,nstates);
rent=0;
wage=0;

while  (metric > toler) & (liter <= maxiter);

   wage = (1-alpha) * A * K^(alpha)   * N^(-alpha);
   rent = (alpha)   * A * K^(alpha-1) * N^(1-alpha);

   util1=-10000*ones(nkap,nkap);
   util2=-10000*ones(nkap,nkap);

   for i=1:nkap;
         kap=(i-1)*inckap;
         for j=1:nkap;
               kapp = (j-1)*inckap;
               cons1 = wage + (rent + delta)*kap - kapp;
               if cons1 > 0;

                  util1(j,i)=real((cons1)^(1-sigma)/(1-sigma));
               end;
           cons2 = theta*wage + (rent + delta)*kap - kapp;
               if cons2 > 0;

                  util2(j,i)=real((cons2)^(1-sigma)/(1-sigma));
               end;
         end;
   end;

   v       = zeros(nkap,2);
   decis   = zeros(nkap,2);
   test    = 10;
   [rs,cs] = size(util1);

   r1=zeros(size(util1(:,1),1),cs);
   r2=zeros(size(util2(:,1),1),cs);
   while test ~= 0;
       for i=1:cs;
           r1(:,i)=util1(:,i)+beta*(prob(1,1)*v(:,1)+ prob(1,2)*v(:,2));
           r2(:,i)=util2(:,i)+beta*(prob(2,1)*v(:,1)+ prob(2,2)*v(:,2));
       end;

       [tv1,tdecis1]=max(r1);
       [tv2,tdecis2]=max(r2);
       tdecis=[tdecis1' tdecis2'];
       tv=[tv1' tv2'];

       test_mex = true;

       test_mex = max(any(tdecis-decis));
       v=tv;
       decis=tdecis;

   end;
   decis=(decis-1)*inckap;

   g2=zeros(cs,cs);
   g1=zeros(cs,cs);

   for i=1:cs
       g1(i,tdecis1(i))=1;
       g2(i,tdecis2(i))=1;
   end
   trans=[ prob(1,1)*g1 prob(1,2)*g1; prob(2,1)*g2 prob(2,2)*g2];
   trans=trans';
   probst = (1/(2*nkap))*ones(2*nkap,1);
   test=1;
   while test > 10^(-8);
      probst1 = trans*probst;
      test = max(abs(probst1-probst));
      probst = probst1;
   end;

   kk=decis(:);
   meanK=probst'*kk;

   lambda=zeros(cs,2);
   lambda(:)=probst;

   [v1,d1]=eig(prob');
   [dmax,imax]=max(diag(d1));
   probst1=v1(:,imax);
   ss=sum(probst1);
   probst1=probst1/ss;
   probk=sum(lambda');
   probk=probk';

   Kold = K;
   Knew = g*meanK + (1-g)*Kold;
   metric = abs((Kold-meanK)/Kold);
   K = Knew;

   liter = liter+1;
end;

grid = [ (0:inckap:maxkap)' ];
    income = zeros(size(grid,1),2);

    income = [real((rent*grid + wage)) real((rent*grid + wage*theta)) ];
 [ pinc, index ] = sort(income(:));

summstat = pinc;

end

2 个答案:

答案 0 :(得分:2)

这是一个不幸的消息。简而言之,问题源于while循环条件:

while test ~= 0;

是无限的,可以在代码生成期间确定为无限。请注意,test在循环之前设置为10,并且在循环期间永远不会写入test

因此,实际上,输出永远不会被写入,因为控制永远不会超出此循环。为了测试这个理论,我补充道:

test = test - 1;

while循环内部并且能够生成代码:

codegen fun -args {1:4,1} -report

我向MATLAB Coder团队报告了这一点,因此我们可以考虑在未来改进此案例。

为了完整性,如果实际上需要无限循环(例如,对于服务器循环),那么包含它的函数可以被写入没有输出,因为该函数永远不会返回。

答案 1 :(得分:0)

我的第一个想法是隐藏的breakwhile似乎永远存在。

话虽如此,我无法在你的代码中发现那些,所以这就是你如何处理这个问题。

  1. 如果删除summstat = pinc部分,问题是否会消失?
  2. 或者如果您将其更改为summstat = 0
  3. 否则我建议你开始削减部分代码,直到错误消失,然后你可以放大一些可疑的行。也许你可以先从第一行删除summstat = 0以外的每一行,然后看看它是否按预期工作。