Wie macht man verketten cell-arrays, die Teil eines cell Arrays in MATLAB?
Habe ich ein cell-array allData
die Nx1. Jede Zelle enthält eine Struktur mit einem names
Eigenschaft (der name ist ein benutzerdefiniertes Objekt, sondern betrachten Sie es als ein cell array mit strings, wenn Sie möchten). Ich möchte eine einzelne Zelle ein array mit allen Namen. Zum Beispiel, wenn N=3, so dass allData
ist eine 3x1-cell-array, dann werden die folgenden erledigen würde, mein Ziel:
A = allData{1};
B = allData{2};
C = allData{3};
allNames = [A.names B.names C.names];
Das problem bei diesem Ansatz ist, dass N groß ist und ändert sich je nach Eingabe, also hoffe ich, dass es ist ein cleverer Weg, dies zu tun mit cellfun
, aber alles, was ich versucht habe, ein Fehler auf (z.B. es nicht zu tun allNames = [cellfun(@(x) {x.names}, allData)];
).
UPDATE: Dank der vorgeschlagenen Lösungen, die ich bekommen kann, alles in ein cell-array, wobei jede Zelle enthält ein cell-array. Mein Ziel ist es hier zu verketten diese. Mehr oder weniger das, was ich habe, ist:
{A.names B.names C.names}
und was ich will und kann nicht scheinen zu bekommen, ist
{A.names{1} A.names{2} ... A.names{end} B.names{1} ... B.names{end} ...}
LÖSUNG:
Ich brauchte die Stücke von jeder Antwort unten, also hier die Lösung, die für mich gearbeitet:
vom Andrew Lazarus:
allNames = arrayfun(@(x) x.name, [allData{:}], 'UniformOutput', false);
dann, aus gnovice:
allNames = vertcat(allNames{:});
Danke an beide!!
- Sind die Strukturen Skalare (d.h. 1-von-1), oder können Sie eine Struktur-arrays?
- Ja, die Strukturen sind 1x1.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar mehr details über Ihre Handy-Inhalte, die notwendig wären für eine Allgemeine Lösung, aber wenn die
names
- Eigenschaft gibt immer eine Zelle array von strings ist, und wenn Ihre Strukturen sind alle Skalare (d.h. 1-by-1 Struktur-arrays), dann ist die folgende Lösung mit CELLFUN, CHAR, und CELLSTR geben Sie eine N-by-1 cell array von stringsallNames
mit all Ihren Namen:Und hier ist ein Beispiel, wo
allData
enthält drei verschiedene Strukturen:EDIT:
Verallgemeinern zu dem Fall, wo die
names
- Eigenschaft gibt ein cell-array von Objekte, nicht unbedingt Saiten, können Sie versuchen, diese Lösung, die formt jedes cell array in an M-by-1 cell-array, dann vertikal verkettet alle von Ihnen in ein N-um-1 cell array von Objekten:Oder, wenn Sie lieber am Ende mit einem 1-von-N cell array von Objekten, die Sie dies tun können:
vertcat
Funktion gearbeitet (nachdem ich ordnungsgemäß umgesetzt)! Vielen Dank für diese. Ich hatte keine Notwendigkeit, neu zu gestalten für mein Beispiel, aber bitte lassen Sie es in Ihre Lösung, falls jemand anderes schlägt seinen Kopf gegen die Wand auf diese ein.Versuchen, diese
Weglassen UniformOutput vararg für direkt-Verkettung. Dies gibt eine Zelle ausgegeben.
[allData{:}]
wird nur funktionieren, wenn die Elemente des cell-Arrays horizontal verkettet in eine array-Struktur, was bedeuten würde, gab es keinen wirklichen Grund für die Verwendung eines cell-array in den ersten Platz.