2016-06-21 8 views
0

Ich habe eine 1x10 Struktur Array mit vielen Feldern und ich möchte aus dem struct Array das Element mit einem bestimmten Wert auf einer der Feldvariablen entfernen. Ich kenne den Wert, nach dem ich suche, und das Feld, nach dem ich suchen sollte, und ich weiß auch, wie ich das Element aus dem struct-Array löschen kann, sobald ich es gefunden habe. Frage ist, wie (wenn möglich) elegant identifiziert werden kann, ohne eine Brute-Force-Lösung zu durchlaufen, dh eine for-Schleife, die Elemente des struct-Arrays durchläuft, um sie mit dem gesuchten Wert zu vergleichen. Beispielcode: Käufer als 1x10 struct Array mit Feldern: id, n, Budget und der Variable in den ID-Werten wie id_test zu finden = 12Ein Element einer Struktur basierend auf einem Feldwert finden

Antwort

1

Sie die Tatsache nutzen, dass, wenn Sie haben eine Reihe von struct s , und Sie verwenden die Punktreferenzierung, erstellt dies eine comma-separated list. Wenn Sie das in [] einschließen, wird es versuchen, ein Array zu erstellen, und wenn Sie es in {} einschließen, wird es in einem Zellarray gezwungen.

a(1).value = 1; 
a(2).value = 2; 
a(3).value = 3; 

% Into an array 
[a.value] 

% 1 2 3 

% Into a cell array 
{a.value} 

% [1]  [2]  [3] 

Also Ihr Vergleich zu tun, können Sie das Feld Sie entweder in ein Array von Zellen-Array konvertieren Pflege den Vergleich zu tun. Dieser Vergleich ergibt dann ein logisches Array, mit dem Sie in die ursprüngliche Struktur indizieren können.

Zum Beispiel

% Some example data 
s = struct('id', {1, 2, 3}, 'n', {'a', 'b', 'c'}, 'Budget', {100, 200, 300}); 

% Remove all entries with id == 2 
s = s([s.id] ~= 2); 

% Remove entries that have an id of 2 or 3 
s = s(~ismember([s.id], [2 3])); 

% Find ones with an `n` of 'a' (uses a cell array since it's strings) 
s = s(ismember({s.id}, 'a')); 
+0

Das ist genau das, was ich gesucht habe! Ein One-Liner, der nicht nur das Element identifiziert, das ich durch eines seiner Felder entfernen muss, sondern auch entfernt. Vielen Dank! – Leon