Main Content

Listas separadas por comas

¿Qué es una lista separada por comas?

Cuando se escribe una serie de números separados por comas, MATLAB® crea una lista separada por comas y devuelve cada valor de forma individual.

1,2,3
ans =

     1


ans =

     2


ans =

     3

Cuando se utilizan con estructuras de datos grandes y complejas, como los arreglos de celdas y las estructuras de MATLAB, las listas separadas por comas pueden ayudar a simplificar su código.

Generación de una lista separada por comas

Puede generar una lista separada por comas desde un arreglo de celdas o una estructura de MATLAB.

Generación de una lista desde un arreglo de celdas

Cuando se extraen diferentes elementos de un arreglo de celdas, el resultado es una lista separada por comas. Defina un arreglo de celdas de 4 por 6.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
C
C =

  4×6 cell array

    {[2]}    {[10]}    {[18]}    {[26]}    {[34]}    {[42]}
    {[4]}    {[12]}    {[20]}    {[28]}    {[36]}    {[44]}
    {[6]}    {[14]}    {[22]}    {[30]}    {[38]}    {[46]}
    {[8]}    {[16]}    {[24]}    {[32]}    {[40]}    {[48]}

Extraiga la quinta columna para generar una lista separada por comas.

C{:,5}
ans =

    34


ans =

    36


ans =

    38


ans =

    40

Es lo mismo que introducir directamente la lista.

C{1,5},C{2,5},C{3,5},C{4,5}

Generación de una lista desde una estructura

Cuando se extrae un campo de un arreglo de estructuras que existe en una de sus dimensiones, el resultado es una lista separada por comas.

Comience convirtiendo el arreglo de celdas que ha utilizado anteriormente en una estructura de 4 por 1 de MATLAB con seis campos: de f1 a f6. Lea el campo f5 de todas las filas y MATLAB devolverá una lista separada por comas.

S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
S.f5
ans =

    34


ans =

    36


ans =

    38


ans =

    40

Es lo mismo que introducir directamente la lista.

S(1).f5,S(2).f5,S(3).f5,S(4).f5

Asignación de la salida de una lista separada por comas

Puede asignar cualquier elemento o todos los elementos consecutivos de una lista separada por comas a las variables con una simple instrucción de asignación. Defina el arreglo de celdas C y asigne la primera fila a las variables c1-c6.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
[c1,c2,c3,c4,c5,c6] = C{1,1:6};
c5
c5 =

    34
Si especifica menos variables de salida que el número de salidas que devuelve la expresión, MATLAB asigna las primeras N salidas a las N variables y después ignora las salidas restantes. En este ejemplo, MATLAB asigna C{1,1:3} a las variables c1, c2 y c3 e ignora C{1,4:6}.
[c1,c2,c3] = C{1,1:6};
Puede asignar salidas de estructura de la misma forma.
S = cell2struct(C,{'f1','f2','f3','f4','f5','f6'},2);
[sf1,sf2,sf3] = S.f5;
sf3
sf3 =

    38
También puede utilizar la función deal para este fin.

Asignación a una lista separada por comas

La forma más sencilla de asignar diferentes valores a una lista separada por comas es utilizar la función deal. Esta función distribuye sus argumentos de entrada a los elementos de una lista separada por comas.

Este ejemplo utiliza deal para sobrescribir cada elemento de una lista separada por comas. Primero, inicialice una lista de dos elementos. Este paso es necesario, porque no puede usar una asignación de lista separada por comas con una variable no definida cuando emplea : como índice. Para obtener más información, consulte Asignación de una lista separada por comas a una variable indefinida.

c{1} = []; 
c{2} = [];
c{:}
ans =

     []


ans =

     []

Utilice deal para sobrescribir cada elemento de la lista.

[c{:}] = deal([10 20],[14 12]);
c{:}
ans =

    10    20


ans =

    14    12

Este ejemplo funciona de la misma forma que el anterior, pero con una lista separada por comas de vectores en un campo de estructura.

s(1).field1 = [[]];
s(2).field1 = [[]];
s.field1
ans =

     []


ans =

     []

Utilice deal para sobrescribir los campos de estructura.

[s.field1] = deal([10 20],[14 12]);
s.field1
ans =

    10    20


ans =

    14    12

Cómo utilizar las listas separadas por comas

Los usos más comunes de las listas separadas por comas son:

Estas secciones ofrecen ejemplos del uso de listas separadas por comas con arreglos de celdas. Estos ejemplos también se aplican a las estructuras.

Creación de arreglos

Puede utilizar una lista separada por comas para introducir un conjunto de elementos a la hora de crear una matriz o un arreglo. Cuando especifica una lista de elementos con C{:,5}, MATLAB inserta los cuatro elementos individuales.

C = cell(4,6);
for k = 1:24
    C{k} = k*2;
end
A = {'Hello',C{:,5},magic(4)}
A =

  1×6 cell array

    {'Hello'}    {[34]}    {[36]}    {[38]}    {[40]}    {4×4 double}

Cuando especifica la celda C por sí sola, MATLAB inserta el arreglo de celdas completo.

A = {'Hello',C,magic(4)}
A =

  1×3 cell array

    {'Hello'}    {4×6 cell}    {4×4 double}

Visualización de arreglos

Utilice una lista para mostrar una parte o el todo de una estructura o un arreglo de celdas.

A{:}
ans =

    'Hello'


ans =

  4×6 cell array

    {[2]}    {[10]}    {[18]}    {[26]}    {[34]}    {[42]}
    {[4]}    {[12]}    {[20]}    {[28]}    {[36]}    {[44]}
    {[6]}    {[14]}    {[22]}    {[30]}    {[38]}    {[46]}
    {[8]}    {[16]}    {[24]}    {[32]}    {[40]}    {[48]}


ans =

    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1

Concatenación

Escribiendo una lista separada por comas entre corchetes se extraen los elementos especificados de la lista y se concatenan.

A = [C{:,5:6}]
A =

    34    36    38    40    42    44    46    48

Argumentos de las llamadas a las funciones

A la hora de escribir el código de una llamada a una función, introduzca los argumentos de entrada como una lista con cada argumento separado por una coma. Si estos argumentos están almacenados en una estructura o un arreglo de celdas, puede generar la lista de argumentos al completo o una parte de ella desde la estructura o el arreglo de celdas en su lugar. Esto puede ser especialmente útil a la hora de transferir un número variable de argumentos.

En este ejemplo se pasan diferentes argumentos nombre-valor a la función plot.

X = -pi:pi/10:pi;
Y = tan(sin(X)) - sin(tan(X));
C = cell(2,3);
C{1,1} = 'LineWidth';
C{2,1} = 2;
C{1,2} = 'MarkerEdgeColor';
C{2,2} = 'k';
C{1,3} = 'MarkerFaceColor';
C{2,3} = 'g';
figure
plot(X,Y,'--rs',C{:})

Valores de retorno de las funciones

Las funciones de MATLAB también pueden devolver más de un valor al autor de la llamada. Estos valores se devuelven en una lista con cada valor separado por una coma. En lugar de enumerar cada valor de retorno, puede utilizar una lista separada por comas con una estructura o un arreglo de celdas. Esto es más útil para las funciones que tienen números variables de valores de retorno.

En este ejemplo se devuelven tres valores a un arreglo de celdas.

C = cell(1,3);
[C{:}] = fileparts('work/mytests/strArrays.mat')
C =

  1×3 cell array

    {'work/mytests'}    {'strArrays'}    {'.mat'}

Ejemplo de transformada rápida de Fourier

La función fftshift intercambia las mitades izquierda y derecha de cada dimensión de un arreglo. Para el vector [0 2 4 6 8 10], la salida es [6 8 10 0 2 4]. En un arreglo multidimensional, fftshift realiza este intercambio en cada dimensión.

fftshift utiliza vectores de índices para realizar el intercambio. En el vector que se ha mostrado anteriormente, el índice [1 2 3 4 5 6] se reordena para formar un nuevo índice [4 5 6 1 2 3]. De este modo, la función utiliza este vector de índices para volver a posicionar los elementos. En un arreglo multidimensional, fftshift crea un vector de índices para cada dimensión. Una lista separada por comas hace que esta tarea sea mucho más sencilla.

A continuación se muestra la función fftshift.

function y = fftshift(x)
    numDims = ndims(x);
    idx = cell(1,numDims);
    for k = 1:numDims
        m = size(x,k);
        p = ceil(m/2);
        idx{k} = [p+1:m 1:p];
    end
    y = x(idx{:});
end

La función almacena los vectores de índices en el arreglo de celdas idx. Crear este arreglo de celdas es relativamente sencillo. En cada una de las dimensiones de N, determine el tamaño de dicha dimensión y busque el índice entero más cercano al punto intermedio. Posteriormente, cree un vector que intercambie las dos mitades de dicha dimensión.

Utilizando un arreglo de celdas para almacenar los vectores de índices y una lista separada por comas para la operación de indexado, fftshift desplaza los arreglos de cualquier dimensión con una única operación: y = x(idx{:}). Si utiliza el indexado explícito, debe escribir una instrucción if para cada dimensión que desea que gestione la función.

    if ndims(x) == 1
        y = x(index1);
    else if ndims(x) == 2
        y = x(index1,index2);
        end
    end

Otra forma de gestionar este proceso sin una lista separada por comas es repetir el proceso en cada dimensión, convirtiendo una dimensión a la vez y moviendo los datos en cada ocasión. Con una lista separada por comas, solo tiene que mover los datos una vez. Una lista separada por comas facilita la generalización de la operación de intercambio a cualquier número de dimensiones.

Resolución de problemas de operaciones con listas separadas por comas

Algunas técnicas de indexación y operaciones comunes de MATLAB no funcionan directamente en listas separadas por comas. Esta sección detalla varios errores que puede encontrarse cuando trabaje con listas separadas por comas y explica cómo resolver los problemas relacionados.

La indexación intermedia ha producido una lista separada por comas

Las expresiones de indexación compuesta con llaves o puntos pueden producir listas separadas por comas. Debe indexar en los elementos individuales de la lista para acceder a ellos.

Por ejemplo, cree un arreglo de celdas de 1 por 2 que contenga dos matrices de dobles de 3 por 3.

A = {magic(3),rand(3)}
A =

  1×2 cell array

    {3×3 double}    {3×3 double}

Utilice la indexación con llaves para mostrar ambos elementos.

A{1,:}
ans =

     8     1     6
     3     5     7
     4     9     2


ans =

    0.7922    0.0357    0.6787
    0.9595    0.8491    0.7577
    0.6557    0.9340    0.7431

Indexar en A de esta forma produce una lista separada por comas que incluye ambas matrices contenidas en el arreglo de celdas. No puede usar la indexación con paréntesis para recuperar las entradas de (1,2) en ambas matrices de la lista.

A{1,:}(1,2)
Intermediate brace '{}' indexing produced a comma-separated list with 
2 values, but it must produce a single value when followed by 
subsequent indexing operations.

Para recuperar las entradas de (1,2) en ambas matrices del arreglo de celdas, indexe en las celdas individualmente.

A{1,1}(1,2)
A{1,2}(1,2)
ans =

     1


ans =

    0.0357

Una expresión ha producido una lista separada por comas en lugar de un único valor

Los argumentos de las instrucciones condicionales, los operadores lógicos, los bucles y las instrucciones switch no pueden ser listas separadas por comas. Por ejemplo, no puede crear directamente un bucle de los contenidos de una lista separada por comas usando un bucle for.

Cree un arreglo de celdas de los tres primeros números primos.

A = cell(1,3);
A{1} = 2;
A{2} = 3;
A{3} = 5;

A{:} produce una lista separada por comas de los tres valores.

A{:}
ans =

     2


ans =

     3


ans =

     5

Use for para hacer un bucle por la lista separada por comas generada por errores de A{:}.

for c = A{:}
disp(c)
end
A brace '{}' indexing expression produced a comma-separated list with
3 values where only a single value is allowed.

Para hacer un bucle por los contenidos de A, encierre A{:} entre corchetes para concatenar los valores en un vector.

for c = [A{:}]
disp(c)
end
     2

     3

     5

Asignar varios elementos con la asignación simple

A diferencia que con los arreglos, use la asignación simple para asignar valores a varios elementos de errores de una lista separada por comas. Por ejemplo, defina un arreglo de celdas de 2 por 3.

B = cell(2,3);

Asigne un valor de 5 a todas las celdas del arreglo con : como un índice de los errores de B.

B{:} = 5
Assigning to 6 elements using a simple assignment statement is not
supported. Consider using comma-separated list assignment.

Una forma de conseguir la asignación es colocar B{:} entre corchetes y usar la función deal.

[B{:}] = deal(5)
B =

  2×3 cell array

    {[5]}    {[5]}    {[5]}
    {[5]}    {[5]}    {[5]}

Asignación de una lista separada por comas a una variable indefinida

No puede asignar una lista separada por comas a una variable indefinida usando : como índice. En el ejemplo de Asignación a una lista separada por comas, la variable x está definida como una lista separada por comas con índices explícitos antes de asignarle nuevos valores con : como índice.

x{1} = []; 
x{2} = [];
[x{:}] = deal([10 20],[14 12]);
x{:}
ans =

    10    20


ans =

    14    12

Llevar a cabo la misma asignación con una variable que no haya sido inicializada genera un error.

[y{:}] = deal([10 20],[14 12]);
Comma-separated list assignment to a nonexistent variable is not
supported when any index is a colon (:). Use explicit indices or
define the variable before performing the assignment.

Para resolver este problema, inicialice y de la misma forma que x o cree y usando suficientes índices explícitos para acomodar el número de valores producido por la función deal.

[y{1:2}] = deal([10 20],[14 12])
y =

  1×2 cell array

    {[10 20]}    {[14 12]}

Consulte también

| |