WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Bestimmte Spalten eines Cell-Arrays auslesen

 

punkNgrind
Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 06.07.2016, 15:12     Titel: Bestimmte Spalten eines Cell-Arrays auslesen
  Antworten mit Zitat      
Ich möchte eine bestimmte Spalte aus einem verschachtelten Cell-Array auslesen.

Das Cell-Array ist in der Form: {1xVariabel cell}
die Anzahl des Cell-Arrays in der unteren Ebene ist variabel, aber immer in der Form {1x3 cell}

Jetzt möchte ich eine bestimmte Spalte aller (Unter-)Cell-Arrays auslesen.

Code:

>> x(:)

ans =

    {1x3 cell}    {1x3 cell}

>> x{:}

ans =

    'test1'    'NameA'    'Wert1'


ans =

    'test2'    'NameB'    'Wert2'
 


Also, in diesem Falle z.B. Spalte 2 mit den Namen.

Dies geht:
Code:

>> x{1}(2)

ans =

    'NameA'

K>> x{2}(2)

ans =

    'NameB'
 


Dies nicht:
Code:

>> x{:}(2)
Bad cell reference operation.
 
 


Jemand eine Idee wie ich das (ohne for-Schleife) mache?

Danke schonmal im vorraus.
Private Nachricht senden Benutzer-Profile anzeigen


gs
Forum-Century

Forum-Century


Beiträge: 172
Anmeldedatum: 17.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2016, 06:12     Titel:
  Antworten mit Zitat      
Hi,

funktioniert es hiermit?

Code:


Grüße gs
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 07.07.2016, 07:36     Titel:
  Antworten mit Zitat      
Hallo gs,

leider nicht, das ergiebt:

Code:

>> x(:,2)

ans =

    {1x3 cell}
 


und x{:,2} ergibt den Inhalt des zweiten (Unter-)Cell-Arrays:

Code:

>> x{:,2}

ans =

    'test2'    'NameB'    'Wert2'


 


Zuletzt bearbeitet von punkNgrind am 07.07.2016, 07:53, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 07.07.2016, 07:46     Titel:
  Antworten mit Zitat      
Weitere Varianten die ich probiert habe, bringen mich auch nicht weiter:

Code:

>> x{:,1}(2)

ans =

    'NameA'

>> x{:,2}(2)

ans =

    'NameB'

>>  x{:,:}(2)
Bad cell reference operation.

>> x{1,:}(2)
Bad cell reference operation.

>> x{:}(2)
Bad cell reference operation.

>> x{2}(:)

ans =

    'test2'
    'NameB'
    'Wert2'

 


usw. Question
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2016, 08:06     Titel:
  Antworten mit Zitat      
Hallo,

welcher Wert aus deinem Test-Cell-Array soll denn herauskommen als Beispiel?
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2016, 08:07     Titel:
  Antworten mit Zitat      
Ahh jetzt verstehe ich,

also in diesem Beispiel alle 2.Spalten deiner unter-Arrays oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.07.2016, 08:20     Titel:
  Antworten mit Zitat      
Hallo,

so sollte es funktionieren;

Code:


Data = cellfun(@(x)(x{spaltennumer}), x);

 


Lg rob
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 07.07.2016, 11:31     Titel:
  Antworten mit Zitat      
Hallo ro_mat,

Danke schonmal für deine Antwort.

ro_mat hat Folgendes geschrieben:
Ahh jetzt verstehe ich,

also in diesem Beispiel alle 2.Spalten deiner unter-Arrays oder?



Ja genau so ist das gemeint, wobei die Anzahl der Unter-Cell-Array variabel sein kann.

Ich habe das jetzt mal spontan so ausprobiert:
Code:

>> cellfun(@(x)(x{2}), x)
Error using cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
 


Muss mich aber erstmal in den Aufruf cellfun einlesen, weiß garnicht was der macht.
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 07.07.2016, 11:36     Titel:
  Antworten mit Zitat      
Ah genial, so funktioniert es:

Code:

>> cellfun(@(x)(x(2)), x)

ans =

    'NameA'    'NameB'
 


Vielen Dank, ro_mat! Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 08.07.2016, 09:33     Titel:
  Antworten mit Zitat      
Code:

cellfun(@(x)(x(2)), x)
 


Da ich den Aufruf noch nicht wirklich verstehe, wie muss ich den jetzt "lesen"?

Code:

[A1,...,Am] = cellfun(func,C1,...,Cn)
 


C1 ist der Übergabeparameter des komplette Cell-Arrays.
func ist hier @(x)(x(2))

1. Bedeutet das @(x) -> führe eine Funktion auf alle (Unter-)Cell-Arrays von x aus?
2. Und, ist das (x(2)) die eigentliche Funktion die ausgeführt werden soll?

Also, kann ich das so lesen:
Nehme C1 = x und übergebe sie an @(x).
@(x) führe in allen vorhanden Cell-Array von x die Funktion x(2) aus.
Die Funktion gibt den zweiten Wert des Übergebenen (Unter-)Cell-Arrays aus.

Habe ich das richtig verstanden?
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 12.07.2016, 11:35     Titel:
  Antworten mit Zitat      
Kann mir keine/r sagen, ob ich mit meiner Annahme vom vorherigen Post richtig liege?
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 12:03     Titel:
  Antworten mit Zitat      
Hallo,

diese Art die hier verwendet werden sind sogenannte Anonymous Functions! Also Funktionen die nirgends gespeichert sind, die aber mit einer Variable verbunden werden kann!

Also der @-Operator generiert das function_handle und das (x) dahinter sind die Input-Argumente! Das heißt deine Funktion hat auch nur ein einfaches Input (In deinem Fall das Haupt-Cell-Array)! Das x(2) dahinter beschreibt deinen Funktionsausgang - in deinem Fall eben angewendet auf die 2.Spalte aller Sub-Arrays! Das Argument nach dem Beistrich ist sogleich deine Variable auf die die Funktion angewendet wird!

Lg
Private Nachricht senden Benutzer-Profile anzeigen
 
ro_mat
Forum-Century

Forum-Century


Beiträge: 158
Anmeldedatum: 20.10.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.07.2016, 12:06     Titel:
  Antworten mit Zitat      
Also,

du kannst zum Verständnis die Funktion auch extra abspeichern:

Code:

fun = @(x) x(2); % Kann auch @(z) z(2) heißen Smile
Mat = fun(Variable des Cell-Arrays - bei dir eh x);
 


Und fertig is de gschicht
Private Nachricht senden Benutzer-Profile anzeigen
 
punkNgrind
Themenstarter

Forum-Century

Forum-Century


Beiträge: 136
Anmeldedatum: 10.03.11
Wohnort: Hamburg
Version: R2014b
     Beitrag Verfasst am: 12.07.2016, 12:24     Titel:
  Antworten mit Zitat      
:daumen-hoch:

Sehr vielen Dank für die kurze und präzise Antwort.
Dies mit den 'Anonymous Functions' war mit bisher noch kein Begriff.

Schönen Gruß
Lars
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.