MATLAB: L’affectation nulle d’un élément réussit-elle

Quelqu’un peut-il m’aider à comprendre pourquoi cela réussit (CAS 1):
 
A = magic(3);
isFeasible = false;
A(isFeasible,1) = 0; % lhs is 0-by-1, rhs is 1-by-1
 
Bien que cela échoue (CAS 2):
 
A = magic(3);
isFeasible = false;
A(isFeasible,:) = [0 0 0]; % lhs is 0-by-3, rhs is 1-by-3

'Unable to perform assignment because the size of the left side is 0-by-3 and the size of the right side is 1-by-3.'
 
Dans les deux cas, les tailles des côtés gauche et droit ne correspondent pas, mais une erreur n’est générée que dans le deuxième cas. Il s’agit d’un comportement malheureux car cela signifie qu’un code supplémentaire est requis pour des cas particuliers. Par exemple, au lieu de CASE 2, je devrais faire quelque chose comme:
 
A = magic(3);
isFeasible = false;
if any(isFeasible)
A(isFeasible,:) = [0 0 0]; % lhs is 0-by-3, rhs is 1-by-3
end
 

Meilleure réponse

  • Même si les tailles ne correspondent pas, la première affectation réussit car 0 est un scalaire. MATLAB réplique les scalaires selon les besoins lors de l’affectation. Vois ici:https://blogs.mathworks.com/loren/2006/02/22/scalar-expansion-and-more-take-2/
    Dans le second cas, le côté droit n’est pas un scalaire, donc les tailles doivent correspondre pour faire l’affectation. Une solution générale serait de répliquer le vecteur [0 0 0] verticalement le nombre de fois que vous en avez besoin:
     

    A = magic(3);
    isFeasible = false;
    A(isFeasible,:) = repmat([0 0 0],numel(find(isFeasible)),1);