Verfasst am: 04.04.2013, 10:15
Titel: Filtern von Cell Arrays
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.
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!
Verfasst am: 04.04.2013, 12:05
Titel: Re: Filtern von Cell Arrays
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?
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.
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
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..
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);
ifany(strcmp(Fach, aSchueler.Kurse))
sumStress = sumStress + aSchueler.Level;
end end
Ja, das ist ohne Frage klarer. Ich vermute, es ist für einen Matlab-Anfänger aber erschlagend.
Gruß, Jan
Einstellungen und Berechtigungen
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
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.