0

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 in daa (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

1 Answer 1

5

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 find on 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

rng(1237)

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 that sPref(1,:) = [2,NaN] and that notProposed=[false, true] so bestmatch(1) is NaN - which is never equal to anything. This indicates that the bug likely lies in how you assign NaNs to sPref in 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 rng and include the daa function call than the large set of steps with random numbers.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.