Felder von MATLAB struct-Variablen in for-Schleifen, structfun

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.

  1. Zugriff über eine for-Schleife
  2. 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)

2 Replies to “Felder von MATLAB struct-Variablen in for-Schleifen, structfun”

  1. Sehr schönes Beispiel! War sehr hilfreich und leicht anzupassen!
    Vielen Dank