0

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

矩形空矩阵分配不当。错误daa(第 26 行) favoritec(i)=find(sPref(i,:)==bestmatch(i));

当我增加和的维度时,这尤其是一个n问题m

这是代码

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
4

1 回答 1

5

背景

我相信“矩形空矩阵分配不当”意味着您尝试将矩形空矩阵分配给标量位置。矩形空矩阵是显示为“空矩阵:0×1”的矩阵。生成这样一个矩阵的一种方法是find对一个全部为假的矩阵或本身是一个矩形空矩阵的矩阵执行 a。

回答

在您的代码中,出现此错误是因为没有 sPref(i,:)==bestmatch(i) 的实例。

如果你输入

rng(1237)

然后执行你的代码(没有全部清除)。您可以重现该错误。

查看调用 daa 之前的变量,您会发现它daa([2, 1; 2, 1; 1, 2; 2, 1], [2, 1, 3, 4; 4, 2, 1, 3], [1;1])失败了。另一个断点揭示了这一点sPref(1,:) = [2,NaN],事实就是如此notProposed=[false, true]——它永远不等于任何东西。这表明错误可能在于您在下一节中分配的方式。bestmatch(1)NaNNaNssPref

您需要自己找到该错误。但这应该可以回答您关于“分配不当”错误的问题。

不请自来的建议

  • 这个问题应该标记为“matlab”。使用您遇到问题的主要工具或语言标记您的帖子,以便合适的人阅读它。

  • A short set of steps to reproduce makes it much easier to answer your question. It would have been better to try a few seed values to rng and include the daa function call than the large set of steps with random numbers.

于 2013-01-03T20:36:02.850 回答