2010-06-21 21 views
6

Je voudrais faire un réseau de cellules imbriquées comme suit:Comment accéder aux tableaux de cellules imbriqués dans MATLAB?

tag = {'slot1'} 
info = {' name' 'number' 'IDnum'} 
x = {tag , info} 

Et je veux être en mesure d'appeler x(tag(1)) et avoir afficher 'slot1'. Au lieu de cela, je reçois cette erreur:

??? Error using ==> subsindex 
Function 'subsindex' is not defined for values of class 'cell'. 

Si j'appelle x(1) affiche Matlab {1x1 cell}. Je veux être en mesure d'accéder à la première cellule de la liste x afin que je puisse faire une comparaison de chaîne avec une autre chaîne.

Je sais que je peux écrire ma propre classe pour faire ceci si la classe intégrée de MATLAB ne fonctionne pas mais y a-t-il une astuce simple pour résoudre ce problème?

Répondre

12

La valeur de retour de x(1) est en fait un réseau de cellules 1 par 1 contenant un autre réseau de cellules 1-by-1 qui lui-même contient la chaîne 'slot1'. Pour accéder au contenu des matrices de cellules (et pas seulement un sous-cellule de cellules), vous devez utiliser des accolades (c'est-à-dire "content indexing") au lieu de parenthèses (par exemple "cell indexing").

Par exemple, si vous voulez récupérer la chaîne 'slot1' de x afin de faire une comparaison de chaînes, vous pouvez le faire dans l'une des deux façons suivantes:

cstr = x{1}; %# Will return a 1-by-1 cell array containing 'slot1' 
str = x{1}{1}; %# Will return the string 'slot1' 

Ensuite, vous pouvez utiliser la fonction STRCMP avec soit de ce qui précède:

isTheSame = strcmp(cstr,'slot1'); %# Returns true 
isTheSame = strcmp(str,'slot1'); %# Also returns true 

les travaux ci-dessus parce cell arrays of strings dans Matlab sont traités de manière interchangeable avec des chaînes et des tableaux de caractères dans de nombreuses fonctions intégrées.

4

Au lieu d'utiliser un réseau de cellules, vous pouvez utiliser une structure:

x(1) = struct('tag','slot1','info',{{'something'}}); %# using '1' in case there are many 

Ensuite, vous obtenez la première balise comme

x(1).tag 

Sinon, vous pouvez utiliser les noms de balises comme fieldnames. Si les noms de balises et les informations sont des matrices de cellules, vous pouvez passer les matrices de cellules au lieu de 'slot1' et 'information here', et vous avez créé la structure en une fois.

x = struct('slot1','information here') 
tagName = 'slot1'; 
%# access the information via tag names 
x.(tagName) 
+0

J'ai rencontré le même problème mais la cause était que j'utilisais le nom de ma fonction (par erreur) de la même manière qu'une cellule déjà connue dans une autre fonction. Les erreurs sont là pour nous apprendre. Je voulais juste partager ça – pac