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

Filtern von Cell Arrays

 

Karen
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 10:15     Titel: Filtern von Cell Arrays
  Antworten mit Zitat      
Hallo,
ich bin absoluter Matlab Anfänger und stehe vor einem Problem bei dem ich nicht weiterkomme.
Ich habe eine Struktur nach folgendem Schema in einem function m-file angelegt.

Klasse{Schüler.Anton,1} = 'Anton'

Klasse{Schüler.Anton,2} = ' 04571-12345'

Klasse{Schüler.Anton,3} = [' Mathe' 'Musik' 'Philosophie' 'Sport']

Klasse{Schüler.Anton,4} = ' 1.3'



Klasse{Schüler.Anna,1} = 'Anna'

Klasse{Schüler.Anna,2} = ' 04571-23456'

Klasse{Schüler.Anna,3} = [' Kunst' 'Mathe']

Klasse{Schüler.Anna,4} = ' 2.1'



Klasse{Schüler.Marlon,1} = 'Anna'

Klasse{Schüler.Marlon,2} = ' 04571-345678'

Klasse{Schüler.Marlon,3} = [' Sport' 'Deutsch' 'Religion']

Klasse{Schüler.Marlon,4} = ' 4.1'



Klasse{Schüler.Susanna,1} = 'Marlon'

Klasse{Schüler.Susanna,2} = ' 04571-345667'

Klasse{Schüler.Susanna,3} = [' Kunst' 'Musik']

Klasse{Schüler.Susanna,4} = '2.3'


1 steht für Name, 2 für Telefonnummer, 3 für die Lieblingsfächer und 4 für den gesamten Notendurchschnitt des Zeugnisses. Klasse und Schüler sind globals in einer Struktur aus verschiedenen Skripts. Ich möchte jetzt die Schüler aussortieren, deren Lieblingsfach Kunst ist und dann if Bedingungen aufstellen und mit diesen Schülern weiterarbeiten. Beispielsweise möchte ich den Notendurchschnitt der ausgewählten Schüler berechnen. D.h. die anderen Attribute dürfen nicht verloren gehen. Kann ich ismember dafür benutzen? Z.B.:

k = ' Kunst'
If k (ismember(Schüler,3)),
mean N =…

Aber wie würde ich dann weiter vorgehen, um z.B den Durchschnitt zu berechnen? Muss ich die Fächer immer an die gleiche Stelle schreiben und zusätzliche Platzhalter wie '' einfügen und dann die konkrete Stelle zu finden anstatt des Namens des Faches? Sowohl die Anzahl der „Schüler“ als auch die Anzahl der „Lieblingsfächer“ wird am Ende sehr groß sein.
Ich würde mich super freuen, wenn mir da irgendjemand weiterhelfen kann.
Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.04.2013, 12:05     Titel: Re: Filtern von Cell Arrays
  Antworten mit Zitat      
Hallo Karen,

Der gepostete Pseudo-Code ist nicht sehr hilfreich. Es ist nicht klar, was "Schüler.Anton" sein soll, valid Matlab-Namen dürfen ja keine Umlaute enthalten.

"[' Mathe' 'Musik' 'Philosophie' 'Sport']" ergibt den String ' MatheMusikPhilosophieSport'. Soll das ein Cell-String sein, der verschiedene Fächernamen enthält? Ist das führende Leerzeichen nicht verwirrend, auch in den Telefon-Nummern?

Code:
k = ' Kunst'
If k (ismember(Schüler,3)),
mean N =…

Was soll dieser Code erreichen? Es ist schwer einen Ratschlag zu geben, wenn man nur eine ungefähre Beschreibung hat, die in einer unkorrekten Syntax forumuliert ist.

Bitte poste die vorhandenen Inputs nochmal so, dass sie direkt per Copy&Paste im Command-Window erkannte werden können. Dann erkläre nochmal präzise, was Du erreichen möchtest. Und "sehr groß" ist in einem Matlab-forum ein sehr relativer Begriff: Manche User finden Arrays mit 10'000 Elementen schon "groß", anderer verwenden diesen Ausdruck erst ab 10 Milliarden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Karen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 16:08     Titel:
  Antworten mit Zitat      
Hallo Jan,
danke für die schnelle Antwort. Ich prientiere mich an dem Buch Essential MATLAB for Engineers and Scientists und bin dabei Struktren zu erstellen. Ich dachte dass der Punkt dazu verwendet werden kann eine Unterstruktur einzuführen..
Auf schueler und Klasse soll auch in anderen Programmen zugegriffen werden können. Die Anzahl der Schüler (z.B.Anton) ist nach deiner Antwort eher klein (mit ca. 200 soll es am Ende möglich sein, das Programm laufen zu lassen, jetzt sind es erstmal nur ). Ich möchte als eine Größe (den Stresslevel) die in verchiedenen anderen skripts für die einzelnen Schüler berechnet werden addieren. Dabei sollen aber bestimmte Untergruppen von Schülern ausgewählt werden, die durch ihre Lieblingsfächer definiert werden. Danach möchte ich mit diesen einzelnen Summen weiterrechnen.

Code:
% Das Programm berechnet die Summe des empfundenen Schulstresses  von einer
% bestimmten Auswahl von Schülern (definiert nach Lieblingsfächern)
% 1 = Name
% 2 = Tel
% 3 = Lieblingsfach
% 4 = Stresslevel auf einer Skala von 1-10

global Klasse schueler

Klasse{schueler.Anton,1} = 'Anton';
Klasse{schueler.Anton,2} = ' 04571-12345';
Klasse{schueler.Anton,3} = [' Mathe' 'Musik' 'Philosophie' 'Sport'];
Klasse{schueler.Anton,4} = ' 5' ;

Klasse{schueler.Anna,1} = 'Anna';
Klasse{schueler.Anna,2} = ' 04571-23456';
Klasse{schueler.Anna,3} = [' Kunst' 'Mathe'];
Klasse{schueler.Anna,4} = ' 2';

Klasse{schueler.Marlon,1} = 'Anna';
Klasse{schueler.Marlon,2} = ' 04571-345678';
Klasse{schueler.Marlon,3} = [' Sport' 'Deutsch' 'Religion'];
Klasse{schueler.Marlon,4} = ' 4';

s= 'Sport';
if s(ismember(schueler.n,3)),
    s_cum = sum(schueler.n,4,);
   
end


Also die Stresslevel aller Schüler, die Sport als Lieblingfach angegeben haben sollen addiert werden. Das mit den Leerzeichen hab ich so aus dem Buch Essential MATLAB for Engineers and Scientists. Vielleicht hab ich da etwas falsch verstanden?

Sorry, dass ich mich noch nicht so gut in der Matlabsprache ausdrücken kann..

Danke schonmal!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 04.04.2013, 16:53     Titel:
  Antworten mit Zitat      
Hallo Karen,

Ich würde unbedingt und auf alle Fälle verhindern, dass die Feld-Namen des Structs relevante Informationen enthalten. "schueler.Anton" ist prinzipiell eine schlechte Idee, weil danach das Programm vom Namen der "bearbeiteten Daten" abhängt. Besser:
Code:
Klasse.Schueler(1).Name = 'Anton';
Klasse.Schueler(1).Telefon = '04571-12345';  % Kein Leerzeichen am Anfang?!
Klasse.Schueler(1).Kurse = {'Mathe', 'Musik', 'Philosophie', 'Sport'};  % Cell string!!!
Klasse.Schueler(1).Level = 5 ;  % Nicht als String '5'!
 

Von globalen Variablen sollte man grundsätzlich die Finger lassen, da sie ohne Not die Komplexität eines Programms deutlich erhöhen. Wenn in einer globalen Variablen plötzlich unerwartete Werte stehen, ist es sehr müsam mit dem Debugger herauszufinden, welche Funktion diese erzeugt hat. Und alles, was das Debuggen erschwert, ist im realen Programmieralltag die Pest.

Zitat:
s= 'Sport';
if s(ismember(schueler.n,3)),
s_cum = sum(schueler.n,4,);
end

Das ist deutlich zu abstrakt für eine Programmiersprache. Du musst diese Anleitung in viele kleine Unterschritte zerlegen.
Code:
sumStress = 0;
Fach = 'Sport';
for iSchueler = 1:length(Klasse.Schueler)
  aSchueler = Klasse.Schueler(iSchueler);
  if any(strcmp(Fach, aSchueler.Kurse))
    sumStress = sumStress + aSchueler.Level;
  end
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Karen
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 04.04.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 17:47     Titel:
  Antworten mit Zitat      
Danke! Smile das ist genau das, was ich wollte.
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.04.2013, 22:22     Titel:
  Antworten mit Zitat      
Deutlich klarer finde ich die Trennung zwischen Filterregel und Summenbildung:
Code:
Fach = 'Sport';
index = arrayfun(@(s)any(strcmp(s.Kurse, Fach)), Klasse.Schueler);
Summe_Sport = sum([Klasse.Schueler(index).Level]);
Summe_NoSport = sum([Klasse.Schueler(~index).Level]);


Das mit den Leerzeichen: Nach Kommas, oder um Operatoren sollen Leerzeichen die Lesbarkeit erhöhen. Das gilt aber nicht für Strings.

Grüße
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 05.04.2013, 13:56     Titel:
  Antworten mit Zitat      
Hallo Sirius3,

Ja, das ist ohne Frage klarer. Ich vermute, es ist für einen Matlab-Anfänger aber erschlagend.

Gruß, Jan
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 - 2025 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.