¿Cómo hago una asignación múltiple en MATLAB?

Aquí hay un ejemplo de lo que estoy buscando:

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

Esperaría algo como esto después:

 >> x x = 88 >> y y = 12 

Pero, en cambio, recibo errores como:

 ??? Too many output arguments. 

Pensé que deal() podría hacerlo, pero parece que solo funciona en las celdas.

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

¿Cómo resuelvo mi problema? ¿Debo indexar constantemente por 1 y 2 si quiero tratar con ellos por separado?

No necesita ningún tipo de deal (edit: para Matlab 7.0 o posterior) y, para su ejemplo, no necesita mat2cell ; puedes usar num2cell sin otros argumentos ::

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

Si desea utilizar el deal por algún otro motivo, puede:

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

Tenga en cuenta que deal acepta una “lista” como argumento, no una matriz de celdas. Entonces el siguiente funciona como se espera:

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

La syntax c{:} transforma una matriz de celdas en una lista, y una lista es una coma separada de valores , como en argumentos de funciones. Lo que significa que puede usar la syntax c{:} como argumento para otras funciones distintas a deal . Para ver eso, intente lo siguiente:

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

Para usar la solución num2cell en una línea, defina una list funciones auxiliares:

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

¿ Qué dijo mtrw ? Básicamente, desea usar el trato con una matriz de celdas (aunque el acuerdo (88, 12) también funciona).

Suponiendo que empiezas con una matriz foo que es n-por-2, y quieres asignar la primera columna a xy la segunda a y, haz lo siguiente:

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

DEAL es realmente útil y realmente confuso. foo necesita ser una matriz celular en sí misma, creo. Lo siguiente parece funcionar en Octave, si no recuerdo mal, también funcionará en MATLAB:

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

No puedo comentar otras respuestas, por lo tanto, por separado.

puedes usar deal (88,12) si estás empezando desde escalares

deal se puede usar como una línea para no escalares, por supuesto si ya los tiene en variables separadas, por ejemplo:

 a = 123; b = rand(3); c = {a, b}; d = struct('field','val') 

y ahora los tratas con una línea:

 >> [x,y,z,w] = deal(a,b,c,d) x = 123 y = 0.6370 0.2165 0.6711 0.2945 0.8803 0.2705 0.7633 0.1537 0.0767 z = [123] [3x3 double] w = field: 'val' 

Sin embargo, si están empaquetados en una variable, solo puede deal si están en una matriz de celdas o estructura – con deal(X{:}) para la matriz de celdas y deal(S.field) para la matriz de estructura. (En este último caso, solo se trata un campo, pero de todas las estructuras en el conjunto). Con Matlab v.7 + puede usar X{:} y S.field sin deal , como se señala en otras respuestas.

Crea una función arr2vars para mayor conveniencia

 function varargout = arr2vars(arr) % Distribute elements over variables N = numel(arr); if nargout ~= N error('Number of outputs does not match number of elements') end for k = 1:N varargout{k} = arr(k); end 

Puedes usarlo entonces así

 [~,roi] = imcrop(im); [x,w,y,h] = arr2vars(roi); 

Es posible que esté buscando

 >>> foo = [88, 12]; >>> [x, y] = deal(foo(1), foo(2)) 

Resultando en

 x = 88 y = 12 

Entonces tienes un trazador de líneas que funciona.

Hay una manera más fácil.

 x = foo (1, 1) y = foo (1, 2) 

Proporciona

 >> x x = 88 >> y y = 12 

Documentación completa en Mathworks.