【发布时间】:2015-06-25 13:57:51
【问题描述】:
我正在尝试运行 MATLAB Coder 以将 MATLAB .m 文件转换为 .mex,以希望更快地运行代码。尝试通过 MATLAB Coder 引擎构建文件时,出现以下错误:
Output argument 'summstat' is not assigned on some execution paths
summstat 是我要编译的函数的输出参数。在我的代码的最后一行我分配了summstat:
summstat = pinc;
其中pinc 是整个代码中使用的另一个变量。当输出变量在if 分支内分配时,这种类型的大多数问题都会发生,但这里不是这种情况。虽然我在整个代码中确实有ifs 和fors,但赋值不在其中任何一个(就像我说的,它是函数的最后一行)。
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
【问题讨论】:
-
你能发布这个功能吗?您使用的是哪个 matlab 版本?
-
你的函数中有返回语句吗?
-
我刚刚发布了代码,尝试了一些东西但仍然没有成功。我不明白为什么简单地在代码开头预先分配变量不起作用...
-
如果我将代码粘贴到 mfile 编辑器中,它会给出几个警告,主要是关于未使用的变量。您可能还想查看这些内容并稍微清理一下代码。 (如果您的代码看起来像
X=zeros(3), X=rand(3),您似乎想使用第一个公式进行预分配,但一般不推荐,因为后一个公式会自动返回正确大小的内容) -
我已经删除了 cmets,因为代码的其他部分可能会使用您提到的这些未使用的变量。关于预分配,我仍然习惯于需要为 mex 编译预分配的内容,所以我仍在努力。感谢您的提示。
标签: matlab matlab-coder