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 列" として表示される行列です。このような行列を生成する 1 つの方法は、findすべてが false である行列、または長方形の空の行列自体に対して 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)NaN決して何にも等しくありません。これは、バグが次のセクションでの割り当て方法にある可能性が高いことを示していますNaNssPref

そのバグを自分で見つける必要があります。しかし、これは「不適切な割り当て」エラーに関する質問に答えるはずです。

求められていないアドバイス

  • この質問には「matlab」というタグを付ける必要があります。問題が発生している主要なツールまたは言語で投稿にタグを付けて、適切な人がそれを読むようにします。

  • 再現する一連の短い手順により、質問への回答がはるかに簡単になります。乱数を使用した多数のステップのセットよりも、いくつかのシード値を試して関数呼び出しrngを含める方がよいでしょう。daa

于 2013-01-03T20:36:02.850 に答える