2010-02-25 23 views
42

He aquí un ejemplo de lo que estoy buscando:¿Cómo hago una asignación múltiple en MATLAB?

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

me había esperan algo como esto después:

>> x 

x = 

    88 

>> y 

y = 

    12 

Pero en vez tengo 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 puedo resolver mi problema? ¿Debo indexar constantemente por 1 y 2 si quiero tratar con ellos por separado?

+3

reparto sólo funciona si foo es una célula. Usted ha definido a foo como una matriz estándar. Es por eso que tienes el '??? Referencia de contenido de celda de un objeto de matriz no celda. Mensaje de error. –

Respuesta

40

Usted don' t necesita deal (edit: para Matlab 7.0 o posterior) y, para su ejemplo, no necesita mat2cell; puede utilizar num2cell con ningún otro argumento ::

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

x = 

    88 


y = 

    12 

Si desea utilizar deal por alguna otra razón, puede:

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

x = 

    88 


y = 

    12 
+3

Como nota al margen, creo que solo puede salirse con la suya sin utilizar el acuerdo (como en el primer ejemplo) en Matlab 7+. –

+0

Interesante. No sabía que el trato es innecesario hoy en día. Sin embargo, utilicé mat2cell a propósito, ya que supongo que el OP podría separar columnas entre sí. – Jonas

+1

Esto es realmente bueno. Pero, ¿hay alguna forma de tenerlo todo en una línea? Tal vez algo así como: '[x y] = num2cell (foo) {:}' (Lo siento, todavía confundido por Matlab bastante a menudo.) –

1

DEAL es realmente útil y realmente confuso. foo necesita ser una matriz de celdas, creo. El siguiente parece funcionar en la octava, si no recuerdo mal va a trabajar en MATLAB, así:

> foo = {88, 12} 
foo = 

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

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

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

Suponiendo que se inicia con un foo matriz que es n-por-2, y que desea asignar la primera columna para X y el segundo ay, de hacer lo siguiente:

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{:}); 
11

Tenga en cuenta que deal acepta una "lista" como argumento no, una matriz de celdas. Por lo tanto, las siguientes obras: como se esperaba

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

y = 12 

La sintaxis c{:} transforma un conjunto de celdas en una lista, y una lista es una comma separated values, como en argumentos de la función. Lo que significa que puede usar la sintaxis c{:} como argumento para otras funciones además de deal. Para ver esto, pruebe lo siguiente:

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

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

utilizar la solución num2cell en una sola línea, defina una función auxiliar list:

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

varargout = num2cell(x); 

end 
+0

no mostrará el error '[a1, a2, a3, a4] = list (1: 4)' causa 'Demasiados argumentos de salida' – zhangxaochen

1

que no puedo comentar otras respuestas, además de manera separada.

you can use deal(88,12) if you are starting from scalars

deal se puede utilizar como una sola línea para los no escalares, así, por supuesto, si usted ya tiene en variables independientes, por ejemplo:

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

y ahora los trata con una sola 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 indica en otras respuestas.

0

Crear una arr2vars de funciones para la comodidad

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 

Usted puede usarlo luego como esto

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

Usted podría estar buscando

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

resultando en

x = 
    88 

y = 
    12 

Así que tiene un trabajo de una sola línea.

1

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.

Cuestiones relacionadas