2010-06-21 15 views
6

me gustaría hacer una serie de células anidada de la siguiente manera:¿Cómo puedo acceder a matrices de células anidadas en MATLAB?

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

Y yo quiero ser capaz de llamar a x(tag(1)) y tienen que mostrar 'slot1'. En cambio, estoy consiguiendo este error:

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

Si llamo x(1) MATLAB muestra {1x1 cell}. Quiero poder acceder a la primera celda de la lista x para poder hacer una comparación de cadenas con otra cadena.

Sé que puedo escribir mi propia clase para hacer esto si la clase incorporada de MATLAB no funciona pero ¿hay algún truco simple para resolver este problema?

Respuesta

12

El valor de retorno de x(1) es en realidad una serie de células de 1-a-1 que contiene otro matriz de células de 1 por 1 que a su vez contiene la cadena 'slot1'. Para acceder al contenido de arreglos de celdas (y no solo un subarreglo de celdas) debe usar llaves (es decir, "content indexing") en lugar de paréntesis (es decir, "cell indexing").

Por ejemplo, si desea recuperar la cadena 'slot1' de x con el fin de hacer una comparación de cadenas, que podría hacerlo en una de dos maneras:

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

continuación, puede utilizar la función STRCMP con cualquiera de los anteriores:

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

los trabajos anteriores porque cell arrays of strings en MATLAB se manejan como sinónimos con cadenas y matrices de caracteres en muchas funciones incorporadas.

4

En lugar de utilizar una serie de células, se puede utilizar una estructura:

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

A continuación, se obtiene la primera etiqueta como

x(1).tag 

Como alternativa, puede utilizar los nombres de etiquetas como nombres de campos. Si los nombres e información de las etiquetas son matrices de celdas, puede pasar las matrices de celdas en lugar de 'slot1' e 'información aquí', y tiene la estructura creada de una vez.

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

Me he encontrado con el mismo problema, pero la causa fue que estaba usando el nombre de mi función (por error) al igual que una celda ya conocida en otra función. Los errores están ahí para hacernos aprender. Solo quería compartir eso – pac

Cuestiones relacionadas