我正在尝试运行MATLAB Coder将MATLAB .m文件转换为.mex,以便更快地运行代码。当尝试通过MATLAB Coder引擎构建文件时,我收到以下错误:
Output argument 'summstat' is not assigned on some execution paths
其中summstat
是我试图编译的函数的输出参数。在我的代码的最后一行,我指定summstat
:
summstat = pinc;
其中pinc
是整个代码中使用的另一个变量。当输出变量在if
分支内部分配时,会发生此类问题,但这种情况并非如此。虽然我在整个代码中都有if
和for
,但分配不在其中任何一个(就像我说的那样,它是函数的最后一行)。
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
答案 0 :(得分:2)
这是一个不幸的消息。简而言之,问题源于while
循环条件:
while test ~= 0;
是无限的,可以在代码生成期间确定为无限。请注意,test
在循环之前设置为10,并且在循环期间永远不会写入test
。
因此,实际上,输出永远不会被写入,因为控制永远不会超出此循环。为了测试这个理论,我补充道:
test = test - 1;
在while
循环内部并且能够生成代码:
codegen fun -args {1:4,1} -report
我向MATLAB Coder团队报告了这一点,因此我们可以考虑在未来改进此案例。
为了完整性,如果实际上需要无限循环(例如,对于服务器循环),那么包含它的函数可以被写入没有输出,因为该函数永远不会返回。
答案 1 :(得分:0)
我的第一个想法是隐藏的break
或while
似乎永远存在。
话虽如此,我无法在你的代码中发现那些,所以这就是你如何处理这个问题。
summstat = pinc
部分,问题是否会消失? summstat = 0
? 否则我建议你开始削减部分代码,直到错误消失,然后你可以放大一些可疑的行。也许你可以先从第一行删除summstat = 0
以外的每一行,然后看看它是否按预期工作。