1. ホーム
  2. matlab

[解決済み] エラー「Improper assignment with rectangular empty matrix」の解決方法を教えてください。

2022-02-09 05:32:19

質問内容

こんな雑なコードを書きました。コードの最初の部分を関数 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

解決方法は?

背景

Improper assignment with rectangular empty matrix」は、スカラーの位置に矩形の空の行列を割り当てようとしたことを意味していると思います。矩形空行列とは、"Empty matrix.と表示される行列のことです。0-by-1"と表示される行列です。このような行列を生成する一つの方法として find を、すべて偽の行列、あるいはそれ自体が長方形の空行列である行列に適用します。

回答

あなたのコードでは、sPref(i,:)==bestmatch(i)となるインスタンスがなかったため、このエラーが発生します。

と入力すると

rng(1237)

そして、あなたのコードを実行してください(clear allを使用せずに)。エラーを再現することができます。

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 関数呼び出しは、乱数による大きなステップのセットよりも