Main Content

Acceder a datos en arreglos de celdas

Indexación básica

Un arreglo de celdas es un tipo de datos con contenedores de datos indexados llamados celdas. Cada celda puede contener cualquier tipo de datos. Los arreglos de celdas se utilizan a menudo para almacenar datos de un archivo que tiene un formato incoherente, como columnas que contienen datos numéricos y de texto.

Por ejemplo, considere un arreglo de celdas de datos combinados de 2 por 3.

C = {'one','two','three'; 
     100,200,rand(3,3)}
C=2×3 cell array
    {'one'}    {'two'}    {'three'   }
    {[100]}    {[200]}    {3x3 double}

Cada elemento está dentro de una celda. Si indexa en este arreglo utilizando paréntesis estándar, el resultado es un subconjunto del arreglo de celdas que incluye las celdas.

C2 = C(1:2,1:2)
C2=2×2 cell array
    {'one'}    {'two'}
    {[100]}    {[200]}

Para leer o escribir el contenido de una celda concreta, encierre los índices entre llaves.

R = C{2,3}
R = 3×3

    0.8147    0.9134    0.2785
    0.9058    0.6324    0.5469
    0.1270    0.0975    0.9575

C{1,3} = 'longer text in a third location'
C=2×3 cell array
    {'one'}    {'two'}    {'longer text in a third location'}
    {[100]}    {[200]}    {3x3 double                       }

Para sustituir el contenido de varias celdas a la vez, utilice paréntesis para referirse a las celdas y llaves para definir un arreglo de celdas de un tamaño similar.

C(1,1:2) = {'first','second'}
C=2×3 cell array
    {'first'}    {'second'}    {'longer text in a third location'}
    {[  100]}    {[   200]}    {3x3 double                       }

Leer datos de varias celdas

La mayoría de las funciones de procesamiento de datos de MATLAB® operan sobre un arreglo rectangular con un tipo de datos uniforme. Dado que los arreglos de celdas pueden contener una mezcla de tipos y tamaños, a veces es necesario extraer y combinar los datos de las celdas antes de procesarlos. Esta sección describe algunas situaciones habituales.

Texto en celdas específicas

Cuando todo el arreglo de celdas o un subconjunto conocido de celdas contiene texto, puede indexar y pasar las celdas directamente a cualquiera de las funciones de procesamiento de texto de MATLAB. Por ejemplo, encuentre dónde aparece la letra t en cada elemento de la primera fila de C.

ts = strfind(C(1,:),'t')
ts=1×3 cell array
    {[5]}    {0x0 double}    {[8 11 18 28]}

Números en celdas específicas

Las dos maneras principales de procesar datos numéricos en un arreglo de celdas son:

  • Combinar el contenido de esas celdas en un único arreglo numérico y, a continuación, procesar ese arreglo.

  • Procesar las celdas individuales por separado.

Para combinar celdas numéricas, utilice la función cell2mat. Los arreglos de cada celda deben tener tamaños compatibles para la concatenación. Por ejemplo, los dos primeros elementos de la segunda fila de C son valores escalares. Combínelos en un vector numérico de 1 por 2.

v = cell2mat(C(2,1:2))
v = 1×2

   100   200

Para procesar celdas individuales, puede utilizar la función cellfun. Cuando llame a cellfun, especifique la función que se aplicará a cada celda. Utilice el símbolo @ para indicar que se trata de una función y crear un identificador de función. Por ejemplo, calcule la longitud de cada una de las celdas de la segunda fila de C.

len = cellfun(@length,C(2,:))
len = 1×3

     1     1     3

Datos en celdas con índices desconocidos

Cuando algunas de las celdas contengan datos que desee procesar, pero no conozca los índices exactos, puede utilizar una de estas opciones:

  • Encuentre todos los elementos que cumplan una determinada condición mediante indexación lógica y, a continuación, procese dichos elementos.

  • Compruebe y procese las celdas de una en una con un bucle for o while.

Por ejemplo, supongamos que desea procesar únicamente las celdas que contengan vectores de caracteres. Para aprovechar la indexación lógica, utilice primero la función cellfun con ischar para encontrar esas celdas.

idx = cellfun(@ischar,C)
idx = 2x3 logical array

   1   1   1
   0   0   0

A continuación, utilice el arreglo lógico para indexar en el arreglo de celdas, C(idx). El resultado de la operación de indexación es un vector columna que puede pasar a una función de procesamiento de texto, como strlength.

len = strlength(C(idx))
len = 3×1

     5
     6
    31

El otro enfoque consiste en utilizar un bucle para comprobar y procesar el contenido de cada celda. Por ejemplo, busque las celdas que contengan la letra t y combínelas en un arreglo de cadenas haciendo un bucle por las celdas. Registre cuántos elementos añade el bucle al arreglo de cadenas en la variable n.

n = 0;
for k = 1:numel(C)
    if ischar(C{k}) && contains(C{k},"t")
        n = n + 1;
        txt(n) = string(C{k});
    end
end
txt
txt = 1x2 string
    "first"    "longer text in a third location"

Indexar en varias celdas

Si hace referencia a varias celdas mediante la indexación con llaves, MATLAB devuelve el contenido de las celdas como una lista separada por comas. Por ejemplo:

C{1:2,1:2}

es lo mismo que

C{1,1}, C{2,1}, C{1,2}, C{2,2}.

Como cada celda puede contener un tipo de datos diferente, no puede asignar esta lista a una sola variable. Sin embargo, puede asignar la lista al mismo número de variables como celdas.

[v1,v2,v3,v4] = C{1:2,1:2}
v1 = 
'first'
v2 = 100
v3 = 
'second'
v4 = 200

Si cada celda contiene el mismo tipo de datos, puede crear una sola variable aplicando el operador de concatenación de arreglos, [], a la lista separada por comas.

v = [C{2,1:2}]
v = 1×2

   100   200

Si el contenido de las celdas no se puede concatenar, almacene los resultados en una nuevo arreglo de celdas, tabla u otro contenedor heterogéneo. Por ejemplo, convierta los datos numéricos de la segunda fila de C en una tabla. Utilice los datos de texto de la primera fila de C para los nombres de las variables.

t = cell2table(C(2,:),VariableNames=C(1,:))
t=1×3 table
    first    second    longer text in a third location
    _____    ______    _______________________________

     100      200               {3x3 double}          

Indexar en arreglos dentro de celdas

Si una celda contiene un arreglo, puede acceder a elementos específicos dentro de ese arreglo utilizando dos niveles de índices. En primer lugar, utilice llaves para acceder al contenido de la celda. A continuación, utilice la sintaxis de indexación estándar para el tipo de arreglo en esa celda.

Por ejemplo, C{2,3} devuelve una matriz de 3 por 3 de números aleatorios. Indexe con paréntesis para extraer la segunda fila de esa matriz.

C{2,3}(2,:)
ans = 1×3

    0.9058    0.6324    0.5469

Si la celda contiene un arreglo de celdas, utilice llaves para la indexación, y si contiene un arreglo de estructuras, utilice la notación de puntos para referirse a campos específicos. Por ejemplo, considere un arreglo de celdas que contenga un arreglo de celdas de 2 por 1 y una estructura escalar con campos f1 y f2.

c = {'A'; ones(3,4)};
s = struct("f1",'B',"f2",ones(5,6)); 
C = {c,s}
C=1×2 cell array
    {2x1 cell}    {1x1 struct}

Extraiga los arreglos de unos del arreglo de celdas y estructura anidados.

A1 = C{1}{2}
A1 = 3×4

     1     1     1     1
     1     1     1     1
     1     1     1     1

A2 = C{2}.f2
A2 = 5×6

     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1
     1     1     1     1     1     1

Puede anidar cualquier número de arreglos de celdas y estructuras. Aplique las mismas reglas de indexación a los niveles inferiores de la jerarquía. Por ejemplo, estas sintaxis son válidas cuando las celdas a las que se hace referencia contienen la celda o arreglo de estructuras esperado.

C{1}{2}{3}

C{4}.f1.f2(1)

C{5}.f3.f4{1}

En cualquier nivel de indexación, si hace referencia a varias celdas, MATLAB devuelve una lista separada por comas. Para obtener más detalles, consulte Indexar en varias celdas.

Consulte también

| |

Temas relacionados