Contenu principal

Accéder aux données d’un cell array

Indexation de base

Un cell array est un type de données comportant des conteneurs de données indexés appelés cellules. Chaque cellule peut contenir n’importe quel type de données. On utilise souvent des cell arrays pour stocker les données d’un fichier dont le format n’est pas cohérent, comme des colonnes contenant à la fois des données numériques et textuelles.

Prenons l’exemple d’un cell array de dimension 2 x 3 contenant des données mixtes.

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

Chaque élément est contenu dans une cellule. Si vous indexez ce tableau avec des parenthèses standard, vous obtenez un sous-ensemble du cell array incluant les cellules.

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

Pour lire le contenu d’une cellule spécifique ou écrire dedans, mettez les indices entre accolades.

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]}    {3×3 double                       }

Pour remplacer le contenu de plusieurs cellules à la fois, utilisez des parenthèses pour faire référence aux cellules et des accolades pour définir un cell array de taille équivalente.

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

Lire les données de plusieurs cellules

La plupart des fonctions de traitement de données de MATLAB® s’appliquent à un tableau rectangulaire ayant un type de données uniforme. Comme les cell arrays peuvent contenir différents types et différentes tailles de données, il est parfois nécessaire d’extraire les données des cellules et de les combiner avant de les traiter. Cette section décrit quelques scénarios courants.

Texte dans des cellules spécifiques

Lorsque le cell array tout entier ou un sous-ensemble connu de cellules contient du texte, vous pouvez indexer les cellules et les passer directement à l’une des fonctions de traitement de texte de MATLAB. Par exemple, trouvez l’emplacement de la lettre t dans chaque élément de la première ligne de C.

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

Nombres dans des cellules spécifiques

Voici les deux principales méthodes permettant de traiter les données numériques d’un cell array :

  • Combiner le contenu des cellules concernées dans un seul tableau numérique, puis traiter ce tableau.

  • Traiter séparément chaque cellule.

Pour combiner des cellules numériques, utilisez la fonction cell2mat. Les tableaux de chaque cellule doivent être de tailles compatibles pour la concaténation. Par exemple, les deux premiers éléments de la deuxième ligne de C sont des valeurs scalaires. Combinez-les dans un vecteur numérique de dimension 1 x 2.

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

   100   200

Pour traiter séparément chaque cellule, vous pouvez utiliser la fonction cellfun. Lors de l’appel de cellfun, spécifiez la fonction à appliquer à chaque cellule. Utilisez le symbole @ pour indiquer qu’il s’agit d’une fonction et créer un handle de fonction. Par exemple, déterminez la longueur de chacune des cellules de la deuxième ligne de C.

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

     1     1     3

Données dans des cellules dont les indices sont inconnus

Lorsque certaines des cellules contiennent des données que vous souhaitez traiter mais que vous ne connaissez pas précisément leurs indices, vous disposez des options suivantes :

  • Trouver tous les éléments qui remplissent une certaine condition avec l’indexation logique, puis traiter ces éléments.

  • Vérifier et traiter une cellule à la fois avec une boucle for ou while.

Par exemple, supposons que vous souhaitiez traiter uniquement les cellules contenant des vecteurs de caractères. Pour tirer avantage de l’indexation logique, utilisez d’abord la fonction cellfun avec ischar pour trouver les cellules concernées.

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

   1   1   1
   0   0   0

Ensuite, utilisez ce tableau logique pour indexer le cell array, C(idx). Le résultat de l’opération d’indexation est un vecteur colonne que vous pouvez passer à une fonction de traitement de texte telle que strlength.

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

     5
     6
    31

L’autre approche consiste à utiliser une boucle pour vérifier et traiter le contenu de chaque cellule. Par exemple, trouvez les cellules qui contiennent la lettre t et combinez-les dans un tableau de chaînes de caractères en leur appliquant une boucle. Enregistrez le nombre d’éléments ajoutés par la boucle au tableau de chaînes de caractères dans 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 = 1×2 string
    "first"    "longer text in a third location"

Indexer plusieurs cellules

Si vous faites référence à plusieurs cellules avec une indexation par accolades, MATLAB renvoie le contenu de ces cellules sous forme de liste d’éléments séparés par des virgules. Par exemple,

C{1:2,1:2}

est identique à

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

Comme chaque cellule peut contenir un type de données différent, vous ne pouvez pas affecter cette liste à une seule variable. En revanche, vous pouvez l’affecter à un nombre de variables égal au nombre de cellules.

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

Si chaque cellule contient le même type de données et que les tailles sont compatibles, vous pouvez créer une seule variable en appliquant l’opérateur de concaténation de tableaux [] à la liste d’éléments séparés par des virgules.

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

   100   200

S’il est impossible de concaténer le contenu des cellules, stockez les résultats dans un nouveau cell array, une table ou un autre conteneur hétérogène. Par exemple, convertissez les données numériques de la deuxième ligne de C en table. Utilisez les données textuelles de la première ligne de C comme noms de variables.

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

     100      200               {3×3 double}          

Indexer les tableaux contenus dans des cellules

Si une cellule contient un tableau, vous pouvez accéder à des éléments spécifiques de ce tableau en utilisant deux niveaux d’indices. Utilisez d’abord des accolades pour accéder au contenu de la cellule. Utilisez ensuite la syntaxe d’indexation standard pour le type de tableau contenu dans cette cellule.

Par exemple, C{2,3} renvoie une matrice 3 x 3 de nombre aléatoires. Effectuez une indexation avec des parenthèses pour extraire la deuxième ligne de cette matrice.

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

    0.9058    0.6324    0.5469

Si la cellule contient un cell array, utilisez des accolades pour l’indexation. Si elle contient un tableau de structures, utilisez la notation pointée pour faire référence à des champs spécifiques. Prenons l’exemple d’un cell array contenant un cell array 2 x 1 et une structure scalaire avec les champs f1 et f2.

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

Extrayez les tableaux de uns du cell array et de la structure imbriqués.

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

Vous pouvez imbriquer autant de cell arrays et de tableaux de structures que vous le souhaitez. Appliquez les mêmes règles d’indexation aux niveaux inférieurs de la hiérarchie. Par exemple, les syntaxes suivantes sont valides lorsque les cellules référencées contiennent le cell array ou le tableau de structures attendu.

C{1}{2}{3}

C{4}.f1.f2(1)

C{5}.f3.f4{1}

Quel que soit le niveau d’indexation, si vous faites référence à plusieurs cellules, MATLAB renvoie une liste d’éléments séparés par des virgules. Pour plus d’informations, consultez Indexer plusieurs cellules.

Voir aussi

| |

Rubriques