Main Content

Listas separadas por comas

¿Qué es una lista separada por comas?

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

1,2,3
ans =

     1


ans =

     2


ans =

     3

Cuando se utiliza junto a estructuras de datos grandes y más complejas, como los arreglos de celdas y las estructuras de MATLAB, las listas separadas por comas pueden ayudarle a simplificar el 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 escribir 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 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 escribir 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 e 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. En primer lugar, inicie una lista de dos elementos. Este paso es necesario porque no se puede utilizar la asignación de listas separadas por comas con una variable indefinida cuando se utiliza : 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, 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 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. En 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 la indexación explícita, tiene que 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 en operaciones con listas separadas por comas

Algunas operaciones y técnicas de indexación habituales de MATLAB no funcionan directamente con listas separadas por comas. En esta sección se detallan diferentes errores que pueden encontrarse cuando se trabaja con listas separadas por comas y se explica cómo resolver los problemas subyacentes.

La indexación intermedia produjo una lista separada por comas

Las expresiones de indexación compuestas 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 mediante 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 utilizar la indexación mediante paréntesis para recuperar las entradas en (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 en (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

La expresión produjo una lista separada por comas en lugar de un valor único

Los argumentos para instrucciones condicionales, operadores lógicos, bucles e instrucciones switch no pueden ser listas separadas por comas. Por ejemplo, no puede recorrer directamente el contenido de una lista separada por comas con un bucle for.

Cree un arreglo de celdas de los primeros tres 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

Utilizar for para recorrer la lista separada por comas generada por A{:} produce un error.

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 repetir el proceso por el contenido 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 mediante la asignación sencilla

A diferencia de lo que ocurre con los arreglos, utilizar la asignación sencilla para asignar valores a varios elementos de una lista separada por comas produce un error. Por ejemplo, defina un arreglo de celdas de 2 por 3.

B = cell(2,3);

Asignar un valor de 5 a todas las celdas del arreglo utilizando : como un índice para B produce un error.

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

Una forma de realizar esta asignación es encerrar B{:} entre corchetes y utilizar 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 utilizando : como un í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 utilizando : como un índice.

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

    10    20


ans =

    14    12

Realizar la misma asignación con una variable que no se ha iniciado produce 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 solucionar este problema, inicie y de la misma forma que x o cree y utilizando suficientes índices explícitos para admitir el número de valores producidos 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

| |