2010-05-12 14 views
11

estoy escribiendo una función para eliminar algunos valores de una serie de células, así:Si una función MATLAB devuelve un número variable de valores, ¿cómo puedo conseguir todos ellos como una serie de células?

function left = remove(cells, item); 
left = cells{cellfun(@(i) ~isequal(item, i), cells)}; 

Pero cuando corro esto, left sólo tiene el primer valor, como la llamada a las células {} con una matriz lógica devuelve todas las celdas coincidentes como valores separados. ¿Cómo puedo agrupar estos valores de devolución por separado en una única matriz de celdas?

También, quizás ya es una forma de eliminar un elemento determinado de una serie de células? No pude encontrarlo en la documentación.

Respuesta

25

usted tiene que utilizar () en lugar de {} para indexar las células:

function left = remove(cells, item) 
    left = cells(cellfun(@(i) ~isequal(item, i), cells)); 

Usando () para la indexación le dará un subconjunto de células, mientras que el uso de {} devolverá los contenidos de un subconjunto de células como comma-separated list, y sólo la primera entrada de la lista conseguirá colocado en left en su ejemplo.

Se puede extraer de this MATLAB documentation para obtener más información sobre el uso de células matrices.


EDIT: respuesta al comentario ...

Si usted tiene una operaciónque termina dándole una lista separada por comas, puede colocar los elementos individuales de la lista en las células de una matriz de células rodeando la operación con llaves. Por su ejemplo, se podría hacer:

left = {cells{cellfun(@(i) ~isequal(item, i), cells)}}; 

El conjunto interior de llaves crea una lista separada por comas de los contenidos de cells que no son iguales a item, y el conjunto exterior a continuación recoge esta lista en una célula formación. Esto, por supuesto, dar el mismo resultado que sólo usar paréntesis para la indexación, que es el enfoque más sensible en este caso.

Si usted tiene una funciónque devuelve varios argumentos de salida, y se quiere recoger estos múltiples valores en una matriz celular, entonces es un poco más complicado. Primero hay que decidir cuántos argumentos de salida obtendrá, o puede utilizar la función NARGOUT para obtener todas las salidas posibles:

nOut = 3;     %# Get the first three output arguments 
%# Or... 
nOut = nargout(@some_fcn); %# Get all the output arguments from some_fcn 

A continuación, puede obtener los resultados en una serie de células de 1 a paso nOutoutArgs por haciendo lo siguiente:

[outArgs{1:nOut}] = some_fcn(...); 

Cabe señalar que NARGOUT devolverá un valor negativo si la función tiene un variable number of output arguments, por lo que tendrá que elegir el valor de nOut a sí mismo en un caso así.

+0

Aha! Por supuesto. Entonces, ¿qué ocurre si hay una función que devuelve múltiples valores? ¿Hay alguna manera de agruparlos en un cellarray después del hecho? – prismofeverything

+1

@kaleidomedallion: No estoy seguro si se refiere a una * función * o una * operación * que devuelve varios valores, por lo que actualicé mi respuesta para explicar ambas. – gnovice

+1

Esto respondió completamente mi pregunta. ¡Muchas gracias! – prismofeverything

Cuestiones relacionadas