Zugreifen auf Daten in einem Zellen-Array
Grundlegende Indizierung
Ein Zellen-Array ist ein Datentyp mit indizierten Datenbehältern, die Zellen genannt werden. Jede Zelle kann einen beliebigen Datentyp enthalten. Zellarrays werden oft verwendet, um Daten aus einer Datei zu speichern, die eine uneinheitliche Formatierung aufweist, z. B. Spalten, die sowohl numerische als auch Textdaten enthalten.
Betrachten Sie zum Beispiel ein 2×3-Zellen-Array mit gemischten Daten.
C = {'one','two','three';
100,200,rand(3,3)}C=2×3 cell array
{'one'} {'two'} {'three' }
{[100]} {[200]} {3×3 double}
Jedes Element befindet sich innerhalb einer Zelle. Wenn Sie in dieses Array mithilfe von Standardklammern indizieren, ist das Ergebnis eine Teilmenge des Zellen-Arrays, die die Zellen enthält.
C2 = C(1:2,1:2)
C2=2×2 cell array
{'one'} {'two'}
{[100]} {[200]}
Schließen Sie die Indizes in geschweifte Klammern ein, um den Inhalt einer bestimmten Zelle zu lesen oder zu schreiben.
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 }
Um den Inhalt mehrerer Zellen gleichzeitig zu ersetzen, verwenden Sie Klammern, um auf die Zellen zu verweisen, und geschweifte Klammern, um ein gleich großes Zellen-Array zu definieren.
C(1,1:2) = {'first','second'}C=2×3 cell array
{'first'} {'second'} {'longer text in a third location'}
{[ 100]} {[ 200]} {3×3 double }
Lesen von Daten aus mehreren Zellen
Die meisten Datenverarbeitungsfunktionen in MATLAB® wirken auf ein rechteckiges Array mit einem einheitlichen Datentyp. Da Zellen-Arrays eine Mischung aus verschiedenen Typen und Größen enthalten können, müssen Sie manchmal Daten aus Zellen extrahieren und kombinieren, bevor Sie diese Daten verarbeiten können. In diesem Abschnitt werden einige gängige Szenarien beschrieben.
Text in bestimmten Zellen
Wenn das gesamte Zellen-Array oder eine bekannte Teilmenge von Zellen Text enthält, können Sie die Zellen indizieren und direkt an eine der Textverarbeitungsfunktionen in MATLAB übergeben. Finden Sie zum Beispiel heraus, wo der Buchstabe t in jedem Element der ersten Zeile von C auftritt.
ts = strfind(C(1,:),'t')ts=1×3 cell array
{[5]} {0×0 double} {[8 11 18 28]}
Zahlen in bestimmten Zellen
Es gibt zwei Hauptmethoden, um numerische Daten in einem Zellen-Array zu verarbeiten:
Kombinieren Sie die Inhalte dieser Zellen in einem einzigen numerischen Array und verarbeiten Sie dieses Array dann.
Verarbeiten Sie die einzelnen Zellen separat.
Verwenden Sie zur Kombination numerischer Zellen die cell2mat-Funktion. Für die Verknüpfung müssen die Arrays in jeder Zelle kompatible Größen haben. Zum Beispiel sind die ersten beiden Elemente der zweiten Zeile von C skalare Werte. Kombinieren Sie sie zu einem numerischen 1×2-Vektor.
v = cell2mat(C(2,1:2))
v = 1×2
100 200
Zur Verarbeitung einzelner Zellen können Sie die cellfun-Funktion verwenden. Geben Sie beim Aufrufen von cellfun die Funktion an, die auf jede Zelle angewendet werden soll. Verwenden Sie das @-Symbol, um anzuzeigen, dass es sich um eine Funktion handelt und um einen Function Handle zu erstellen. Ermitteln Sie zum Beispiel die Länge jeder Zelle in der zweiten Zeile von C.
len = cellfun(@length,C(2,:))
len = 1×3
1 1 3
Daten in Zellen mit unbekannten Indizes
Wenn einige der Zellen Daten enthalten, die Sie verarbeiten möchten, Sie aber die genauen Indizes nicht kennen, können Sie eine der folgenden Optionen verwenden:
Finden Sie anhand logischer Indizierung alle Elemente auf, die eine bestimmte Bedingung erfüllen, und verarbeiten Sie dann diese Elemente.
Prüfen und verarbeiten Sie die Zellen nacheinander mit einer
for- oderwhile-Schleife.
Nehmen wir zum Beispiel an, Sie möchten nur jene Zellen verarbeiten, die Zeichenvektoren enthalten. Um die Vorteile der logischen Indizierung zu nutzen, verwenden Sie zunächst die cellfun-Funktion mit ischar zum Auffinden dieser Zellen.
idx = cellfun(@ischar,C)
idx = 2×3 logical array
1 1 1
0 0 0
Verwenden Sie dann das logische Array, um in das Zellen-Array C(idx) zu indizieren. Das Ergebnis der Indizierungsoperation ist ein Spaltenvektor, den Sie an eine Textverarbeitungsfunktion übergeben können, wie z. B. strlength.
len = strlength(C(idx))
len = 3×1
5
6
31
Der andere Ansatz besteht darin, eine Schleife zu verwenden, um den Inhalt jeder Zelle zu überprüfen und zu verarbeiten. Finden Sie beispielsweise Zellen auf, die den Buchstaben t enthalten, und kombinieren Sie sie zu einem String Array, indem Sie eine Schleife über die Zellen ausführen. Verfolgen Sie, wie viele Elemente die Schleife dem String Array in der Variablen n hinzufügt.
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"
In mehrere Zellen indizieren
Wenn Sie sich mit den geschweiften Klammern auf mehrere Zellen beziehen, gibt MATLAB den Inhalt der Zellen als eine kommagetrennte Liste zurück. Zum Beispiel ist
C{1:2,1:2}
identisch zu
C{1,1}, C{2,1}, C{1,2}, C{2,2}.
Da jede Zelle einen anderen Datentyp enthalten kann, können Sie diese Liste nicht einer einzigen Variablen zuordnen. Sie können die Liste jedoch der gleichen Anzahl von Variablen wie Zellen zuordnen.
[v1,v2,v3,v4] = C{1:2,1:2}v1 = 'first'
v2 = 100
v3 = 'second'
v4 = 200
Wenn jede Zelle die gleiche Art von Daten mit kompatiblen Größen enthält, können Sie eine einzige Variable erstellen, indem Sie den Array-Verknüpfungsoperator [] auf die kommagetrennte Liste anwenden.
v = [C{2,1:2}]v = 1×2
100 200
Wenn die Zellinhalte nicht verknüpft werden können, speichern Sie die Ergebnisse in einem neuen Zellen-Array, einer Tabelle oder einem anderen heterogenen Container. Wandeln Sie zum Beispiel die numerischen Daten in der zweiten Zeile von C in eine Tabelle um. Verwenden Sie die Textdaten in der ersten Zeile von C als Variablennamen.
t = cell2table(C(2,:),VariableNames=C(1,:))
t=1×3 table
first second longer text in a third location
_____ ______ _______________________________
100 200 {3×3 double}
In Arrays innerhalb von Zellen indizieren
Wenn eine Zelle ein Array enthält, können Sie auf bestimmte Elemente innerhalb dieses Arrays über zwei Indizierungsebenen zugreifen. Verwenden Sie zunächst geschweifte Klammern, um auf den Inhalt der Zelle zuzugreifen. Verwenden Sie dann die Standard-Indizierungssyntax für den Typ des Arrays in dieser Zelle.
Zum Beispiel gibt C{2,3} eine 3×3-Matrix mit Zufallszahlen zurück. Indizieren Sie mit Klammern, um die zweite Zeile dieser Matrix zu extrahieren.
C{2,3}(2,:)ans = 1×3
0.9058 0.6324 0.5469
Wenn die Zelle ein Zellen-Array enthält, verwenden Sie geschweifte Klammern zum Indizieren, und wenn sie ein Struktur-Array enthält, verwenden Sie die Punktnotation, um auf bestimmte Felder zu verweisen. Betrachten Sie zum Beispiel ein Zellen-Array, das ein 2×1-Zellen-Array und eine Skalarstruktur mit den Feldern f1 und f2 enthält.
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}
Extrahieren Sie die Arrays von Einsen aus dem verschachtelten Zellen-Array und der Struktur.
A1 = C{1}{2}A1 = 3×4
1 1 1 1
1 1 1 1
1 1 1 1
A2 = C{2}.f2A2 = 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
Sie können eine beliebige Anzahl von Zellen- und Struktur-Arrays verschachteln. Wenden Sie die gleichen Indizierungsregeln auf die unteren Ebenen der Hierarchie an. Diese Syntaxen sind zum Beispiel gültig, wenn die referenzierten Zellen das erwartete Zellen- oder Struktur-Array enthalten.
C{1}{2}{3}
C{4}.f1.f2(1)
C{5}.f3.f4{1}
Wenn Sie sich auf einer Indizierungsebene auf mehrere Zellen beziehen, gibt MATLAB eine kommagetrennte Liste zurück. Weitere Informationen finden Sie unter In mehrere Zellen indizieren.