2010-06-21 6 views
6

Ich möchte eine verschachtelte Zellenfeld machen, wie folgt:Wie kann ich auf verschachtelte Zellenarrays in MATLAB zugreifen?

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

Und ich möchte in der Lage sein x(tag(1)) anrufen und haben es 'slot1' anzuzeigen. Stattdessen bekomme ich diesen Fehler:

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

Wenn ich x(1) MATLAB nennen {1x1 cell} zeigt. Ich möchte auf die erste Zelle in der Liste x zugreifen können, damit ich einen Zeichenfolgenvergleich mit einer anderen Zeichenfolge durchführen kann.

Ich weiß, ich kann meine eigene Klasse schreiben, um dies zu tun, wenn MATLABs eingebaute Klasse nicht funktioniert, aber gibt es einen einfachen Trick, um dieses Problem zu lösen?

Antwort

12

Der Rückgabewert von x(1) ist tatsächlich ein 1-mal-1 Zellenfeld enthält eine weitere 1-für-1-Zellen-Array, das sich die Schnur 'slot1' enthält. Um auf die Inhalte Zellenarrays (und nicht nur ein Unterfeld von Zellen) zuzugreifen, müssen Sie geschweifte Klammern (d. H. "content indexing") statt Klammern (d. H. "cell indexing") verwenden.

Zum Beispiel, wenn Sie die Zeichenfolge 'slot1' von x um abrufen möchten einen String-Vergleich zu tun, könnten Sie es auf eine von zwei Möglichkeiten:

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

Dann können Sie die Funktion STRCMP mit entweder der oben:

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

die oben genannten Arbeiten, weil cell arrays of strings in MATLAB sind etwas austauschbar mit Streichern und Zeichen-Arrays in vielen integrierten Funktionen behandelt.

4

Statt ein Zellenfeld verwenden, können Sie eine Struktur verwenden:

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

Dann erhalten Sie den ersten Tag als

x(1).tag 

Alternativ können Sie Tag-Namen als Feldnamen verwenden. Wenn Tagnamen und Informationen Zellenarrays sind, können Sie die Zellenarrays anstelle von "slot1" und "information here" übergeben, und Sie haben die Struktur auf einmal erstellt.

+0

Ich habe das gleiche Problem, aber die Ursache war, dass ich den Namen meiner Funktion (aus Versehen) die gleiche wie eine bereits bekannte Zelle in einer anderen Funktion verwendet. Fehler sind da, um uns zu lernen. Ich wollte das nur teilen – pac

Verwandte Themen