Es kommt häufig vor, dass ich nacheinander auf alle Felder einer Variable vom Typ struct zugreifen will. Hierzu gibt es in MATLAB verschiedene Möglichkeiten, von denen ich in diesem Artikel zwei vorstellen möchte.
- Zugriff über eine for-Schleife
- Zugriff über die Funktion structfun
In den folgenden Beispielen gehe ich jeweils davon aus, dass ich die Preise von einer beliebigen Anzahl von Artikeln als Variable vom Typ struct vorliegen habe. Ich habe mir das Beispiel aus Zufallszahlen erzeugt:
% Erzeugen der Struktur Feldnamen
feldnamen = strcat(repmat({'Artikel_'},11,1),num2str((1:11)','%02d'));
% Erzeugen der Struktur preis
preis = cell2struct(num2cell(round(rand(11,1)*10000)/100),feldnamen);
Mit folgender Eingabe können Sie den Preis von Artikel 4 abfragen:
>> preis.Artikel_04
ans =
80.0300
Möglichkeit 1: Zugriff auf eine struct über eine for-Schleife
Die erste Möglichkeit besteht darin, eine for-Schleife mit dem Feldnamen als Laufvariable zu erstellen und darin die gewünschte Operation durchzuführen. In diesem Beispiel zeige ich, wie Sie eine einfache Ausgabe des Artikelnamens und des Preises erstellen:
for fname = fieldnames(preis)'
thisFieldName = fname{:};
disp(sprintf([thisFieldName ' kostet %2.2f Euro.'],...
preis.(thisFieldName)))
end
In Zeile 1 bekomme ich über den Befehl fieldnames
die Namen der Felder der Variable preis. Es ist zu beachten, dass für die for-Schleife nur einzeilige cellarrays verwendet werden können.
In Zeile 4 greife ich über preis.(thisFieldName)
auf den Preis zum aktuell in der for-Schleife abgearbeiteten Feldnamen zu.
Die Ausgabe sieht dann so aus:
Artikel_01 kostet 84.91 Euro.
Artikel_02 kostet 93.40 Euro.
Artikel_03 kostet 67.87 Euro.
Artikel_04 kostet 80.03 Euro.
Artikel_05 kostet 74.31 Euro.
Artikel_06 kostet 39.22 Euro.
Artikel_07 kostet 65.55 Euro.
Artikel_08 kostet 17.12 Euro.
Artikel_09 kostet 70.60 Euro.
Artikel_10 kostet 3.18 Euro.
Artikel_11 kostet 27.69 Euro.
Möglichkeit 2: Zugriff auf eine struct über den MATLAB-Befehl structfun
Die zweite Möglichkeit ist eleganter, wird aber schnell unübersichtlich, wenn eine größere Anzahl an Befehlen auf jedes Feld angewandt werden soll. In diesem Beispiel erzeuge ich aus den Preisen die Bruttopreise indem ich alle Preise mit 1,19 multipliziere. Die Funktion structfun
wendet einen function-handle oder eine anonyme Funktion auf jedes Feld der Struktur an:
bruttopreis = structfun(...
@(x)x*1.19,preis);
Wenn Sie die Werte wieder in einer Struktur haben wollen, so hängen Sie einfach folgende Zeile mit dem Befehl struct dran:
bruttopreis = cell2struct(num2cell(bruttopreis),feldnamen)
Sehr schönes Beispiel! War sehr hilfreich und leicht anzupassen!
Vielen Dank
Vielen Dank! Es freut mich, wenn die Beispiele hilfreich sind.
Viel Spaß beim MATLAB-Programmieren!
Benjamin Becker
matlab-tutorials.de