I have written this messy code. When I run the first part of the code using the function daa, some times it produces a result, but sometimes it produces an error message. Does anyone have some ideas how to correct it?
Improper assignment with rectangular empty matrix.
Error indaa(line 26)
favoritec(i)=find(sPref(i,:)==bestmatch(i));
It’s especially a problem, when I increased the dimension of n and m
This is the code
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)
Then the function daa is defined as following:
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
Background
I believe that ‘Improper assignment with rectangular empty matrix’ means that you tried to assign a rectangular empty matrix to a scalar location. A rectangular empty matrix is a matrix that displays as “Empty matrix: 0-by-1”. One way to generate such a matrix is to do a
findon a matrix that is all false or that is a rectangular empty matrix itself.Answer
In your code, this error occurs because there were no instances where sPref(i,:)==bestmatch(i).
If you type
And then execute your code (without the clear all). You can reproduce the error.
Looking at the variables just before daa is called, you can see that
daa([2, 1; 2, 1; 1, 2; 2, 1], [2, 1, 3, 4; 4, 2, 1, 3], [1;1])fails. Another breakpoint reveals thatsPref(1,:) = [2,NaN]and thatnotProposed=[false, true]sobestmatch(1)isNaN– which is never equal to anything. This indicates that the bug likely lies in how you assignNaNstosPrefin the next section.You’ll need to find that bug yourself. But this should answer your question about the ‘improper assignment’ error.
Unsolicited advice
This question should be tagged “matlab”. Tag your post with the principal tool or language with which you are having problems so that the right people read it.
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
rngand include thedaafunction call than the large set of steps with random numbers.