如何解决错误'矩形空矩阵的不正确赋值'?

时间:2012-11-07 16:33:02

标签: matlab matrix

我写过这个凌乱的代码。当我使用函数daa运行代码的第一部分时,有时会产生结果,但有时会产生错误消息。有没有人有一些想法如何纠正它?

  

矩形空矩阵的不正确赋值。   daa中的错误(第26行)           favoritec(i)=find(sPref(i,:)==bestmatch(i));

当我增加nm

的维度时,这是一个特别的问题

这是代码

clear all;
n=4;
m=2;
Q=[1;1];
sPref=zeros(n,m);
cPref=zeros(m,n);
for i=1:n
sPref(i,:)=randperm(m);
end
for j=1:m
cPref(j,:)=randperm(n);
end
match=daa(sPref,cPref,Q)

然后函数daa定义如下:

function match=daa(sPref,cPref,Q)
proposition=false(size(sPref));    % keep track who has proposed to which. False= not proposed yet
match=zeros(length(sPref),1);
favoritec=zeros(length(sPref),1);
numberS=zeros(size(cPref,1),1);
bestmatch=zeros(length(sPref),1);
iter=0;
 while (min(match)==0)      % as long as there is one unmatched, continues the loop (except the break)
iter=iter+1;

app=find(match==0);
for i=app(1:end)'
    notProposed=(proposition(i,:)==false);
    bestmatch(i)=min(sPref(i,notProposed));
    favoritec(i)=find(sPref(i,:)==bestmatch(i));
    numberS(favoritec(i))= numberS(favoritec(i))+1;    % keep track of the no.of applicants
    proposition(i,bestmatch(i))=1;   % propsed to college j finishes,either reject or accept
end

% college deciding...
for j=1:size(cPref,1)
    S_comp=find(favoritec==j);   % find the students competing for the same Favoritec
    if numberS(j) <=Q(j)       % sum of students at the college smaller or equal than quota
    match(S_comp)=favoritec(S_comp);               % accept tentative offer
    numberS(j)=sum(match==j);
    sPref(S_comp,j)=NaN;
    else 
        noapl=setxor(1:length(cPref),S_comp);
        cPreft=cPref(j,:);          % truncated pref,change the pref of those who didn't apply to NaN
        cPreft(noapl)=NaN;           
        [r,I]=sort(cPreft);    
        topq=I(1:Q(j));                    % college takes the top quota q students
        match(S_comp)=0;                           % clean the previous assignment
        match(topq)= favoritec(topq);
        numberS(favoritec)=Q(j);
        rejapp=setxor(S_comp,topq);     % the students who got rejected
        sPref(rejapp,j)=NaN;
    end
    %display(match);
end
%% if all choices have proposed, then stop
 if proposition(i,:)==true;
        display('already proposed to every college')
        display(i)
        break
 end
 end

0 个答案:

没有答案