[解決済み] エラー「Improper assignment with rectangular empty matrix」の解決方法を教えてください。
質問内容
こんな雑なコードを書きました。コードの最初の部分を関数
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
解決方法は?
背景
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
- となり、何にも等しくならない。このことから、バグはおそらく
NaNs
を
sPref
を次のセクションで紹介します。
そのバグは自分で見つける必要があります。しかし、これで「不適切な代入」エラーについての質問には答えられるはずです。
勝手なアドバイス
-
この質問には "matlab" のタグが必要です。適切な人に読んでもらえるように、問題のある主要なツールまたは言語をタグ付けしてください。
-
再現するための短いステップのセットは、あなたの質問に答えることをより容易にします。へのシード値をいくつか試したほうがよかったかもしれません。
rng
を含み、その中にdaa
関数呼び出しは、乱数による大きなステップのセットよりも
関連
-
[解決済み] MATLABでctrl+Aを使わずにすべてのコードを自動インデントする
-
[解決済み] ある行列から固有ベクトルの異なる解を得ることができるでしょうか?
-
[解決済み] 部分ピボットによるガウス消去の実装【終了しました
-
[解決済み] エラー --> 整数には同じクラスの整数か、スカラー倍数しか組み合わせることができません。
-
[解決済み] MATLABで分数を10進数に変換する【重複】。
-
[解決済み] Matlab Error: ポジション1のインデックスが配列の境界を越えています
-
[解決済み] MATLABでベクトルの線形スパンを求める
-
[解決済み] Ax = B の形の行列を解く ==> エラー。行列が特異に近い、またはスケールが悪い
-
[解決済み] matlabで三角行列を作る
-
[解決済み] ホールドオンでセミログプロット
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] MATLABで軸の制限をグローバルに設定し、プロットされたデータの最小値と最大値にする方法は?
-
[解決済み] Matlabのリスト理解
-
[解決済み] Matlab: 逆コサイン(acos)の完全解を返す
-
[解決済み] matlabの*と.*の違いは何ですか?
-
[解決済み] Wolfram AlphaとMATLABでは伝達関数のプロットが異なる
-
[解決済み] MATLABでベクトルの線形スパンを求める
-
[解決済み] Matlab - rectangle関数を使用せずに矩形をプロットする
-
[解決済み] Matlabでファイル名を変更する - movefileがファイルの代わりにフォルダを作成する
-
[解決済み] キュービックスプライン補間と多項式補間の比較
-
[解決済み] matlabで三角行列を作る