44 votes

Comment dois-je faire affectation multiple dans MATLAB?

Voici un exemple de ce que je suis à la recherche de:

>> foo = [88, 12];
>> [x, y] = foo;

Je préfère attendre quelque chose de ce genre par la suite:

>> x

x =

    88

>> y

y =

    12

Mais au lieu de cela j'ai des erreurs comme:

??? Too many output arguments.

J'ai pensé deal() pourrait le faire, mais cela semble être la seule à travailler sur les cellules.

>> [x, y] = deal(foo{:});
??? Cell contents reference from a non-cell array object.

Comment puis-je résoudre mon problème? Je dois constamment indice 1 et 2 si je veux les traiter séparément?

43voto

Ramashalanka Points 5481

Vous n'avez pas besoin d' deal à tous (edit: pour Matlab 7.0 ou version ultérieure) et, par votre exemple, vous n'avez pas besoin d' mat2cell; vous pouvez utiliser num2cell n'ayant pas d'autres arguments::

foo = [88, 12];
fooCell = num2cell(foo);
[x y]=fooCell{:}

x =

    88


y =

    12

Si vous souhaitez utiliser deal pour une autre raison, vous pouvez:

foo = [88, 12];
fooCell = num2cell(foo);
[x y]=deal(fooCell{:})

x =

    88


y =

    12

17voto

jullybobble Points 41

Notez que deal accepte une "liste" comme argument, pas une cellule de tableau. Donc ce qui suit fonctionne comme prévu:

> [x,y] = deal(88,12)
x = 88

y = 12

La syntaxe c{:} transforme une cellule de tableau dans une liste et une liste de valeurs séparées par des virgules, comme dans les arguments de la fonction. Ce qui signifie que vous pouvez utiliser l' c{:} de la syntaxe comme argument à d'autres fonctions que deal. Pour voir cela, essayez les solutions suivantes:

> z = plus(1,2)
z = 3

> c = {1,2};
> z = plus(c{:});
z = 3

8voto

Sander Evers Points 51

Pour utiliser l' num2cell solution en une ligne, de définir une fonction d'assistance list:

function varargout = list(x)
% return matrix elements as separate output arguments
% example: [a1,a2,a3,a4] = list(1:4)

varargout = num2cell(x);

end

4voto

Jonas Points 54073

Ce mtrw dit. Fondamentalement, vous voulez utiliser composer avec une cellule de tableau (bien que beaucoup(88,12) fonctionne aussi bien).

En supposant que vous commencez avec un tableau foo qui est le n-par-2, et que vous souhaitez affecter à la première colonne de x et la seconde à y, vous effectuez les opérations suivantes:

foo = [88,12;89,13;90,14];
%# divide the columns of foo into separate cells, i.e. do mat2cell(foo,3,[1,1])
fooCell = mat2cell(foo,size(foo,1),ones(size(foo,2),1));
[x,y] = deal(fooCell{:});

1voto

mtrw Points 10098

FACE est vraiment utile, et vraiment déroutant. foo doit être une matrice de cellules de lui-même, je crois. La suite semble fonctionner en Octave, si je me souviens bien, il va travailler dans MATLAB ainsi:

> foo = {88, 12}
foo =

{
  [1,1] =  88
  [1,2] =  12
}

> [x,y] = deal(foo{:})
x =  88
y =  12

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X