Hallo!
Ich habe gerade erst mit Matlab angefangen und weiß nicht weiter ... Kann mir jemand den folgenden Code schneller schreiben?
Der Quellcode soll die Zeitstempel der Tabellenzeilen miteinander vergleichen und in die kleinere Tabelle, die Zeitstempel hineinschreiben, die sich am wenigsten von den Zeitstempeln der großen Tabelle unterscheiden.
Ich habe keine Idee, wie das anders gehen soll und bin am verzweifeln, weil mir nichts mehr einfällt. Die for-Schleifen müssen auf jeden Fall vermieden werden, weil die beiden Tabellen mit den Zeitstempeln 50000 Zeilen und 200000 Zeilen besitzen. Der Quellcode ist funktionsfähig, aber viel zu langsam.
for Zeile = 1 : Anz_Zeilen_t4
if CAN1_mKlima_EV_1_PTC_Strom_t4(Zeile,1) > 0 for x = 1 : Anz_Zeilen_t7
Unterschied = t7(x,1) - t4(Zeile,1);
if(-4*10^-4 < Unterschied < 4*10^-4)
t4(Zeile,2)=t7(x,1);
end end end end
Auch wird t4(Zeile,2) oft überschrieben. Ist das so gedacht?
Ich kann mir nicht ganz vorstellen, was dieser Code denn machen soll. Vielleicht kannst du
- an einem kleinen Beispiel testen, ob er wirklich das macht, was er soll
- an diesem Beispiel erklären, was der Code genau machen soll.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.02.2011, 00:07
Titel:
Vielen Dank für die schnelle Antwort!!!
Also ich versuche erstmal genauer zu erklären, was der Code machen soll.
Ich habe zwei Tabellen mit Messwerten. Die Tabelle T1 besitzt eine Spalte mit Zeitwerten und eine Spalte mit Spannungswerte. Die Tabelle T2 besitzt eine Spalte mit Zeitwerten, die sich jedoch von denen der ersten Tabelle unterscheiden und eine Spalte mit Stromwerten. Die Zeitwerte sind nicht genau gleich, sondern nur ungefähr gleich. Nun möchte ich aber die Spannungswerte mit den Stromwerte zeitabhängig multiplizieren, damit ich P(t) = U(t) * I(t) erhalte. Das Problem ist, dass die Tabellen unterschiedlich viele Zeilen haben. Daher möchte ich zu den Zeitwerten der Tabelle T2 mit den Stromwerten (dies ist auch die kürzere Tabelle)
die ungefähr gleichen Zeitwerte der anderen Tabelle T1 zuordnen, damit ich dann die richtige zeitliche Zuordnung der Spannungs- und Stromwerte ermitteln kann.
Ergebnis
Spalte 1 der Tabelle T1 Spalte 2 der Tabelle T1
5,56 5,57
6,45 6,41
So soll die Zuordnung dann hinterher aussehen, damit ich eine Tabelle mit
einer einheitlichen Länge erhalte, die ich weiterverarbeiten kann zur Leistungsberechnung. Ich habe den Code, so wie er ist, bei 10 Werten der Tabelle T1 getestet und es hat funktioniert. Nur ich musste bei 10 Werte schon ca. 1 Minute warten. Dann habe ich es mit 50000 Werte probiert und habe 20 Minuten gewartet. Nach 20 Minuten hatte ich keine Lust mehr, weil er immer noch gerechnet hat. Ja, das ist eigentlich so gedacht, das t4(Zeile,2) überschrieben wird, da der Parameter Zeile durch die for-Schleife immer um einen Wert wächst und dies immer in der 2. Spalte der Tabelle T1 abgespeichert wird. So wie ich es beim Ergebnis (siehe oben) erwarte.
Ich hoffe, ich konnte es hiermit verdeutlichen, was ich mit dem Code bezwecken will und dass mir jemand helfen kann.
Vielen Dank!
was du schreibst legt nahe, dass T2 feiner abgetastet ist.
Wie wäre es mit einer Interpolation der Spannungswerte für die Zeitwerte der Strommessungen?
Für bessere Ergebnisse kann man eine kubische Spline nehmen, dauert aber auch etwas länger.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.02.2011, 13:47
Titel:
Wenn ich das so versuche, zeigt er mir den folgenden Fehler an:
??? Error using ==> interp1 at 125
X and Y must be of the same length.
Ich habe keine Ahnung, wie ich das jetzt machen soll.
die Fehlermeldung ist an sich selbsterklärend. Um dir weiterhelfen zu können, müsste ich schon sehen, welcher Code diese Fehlermeldung erzeugt.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.02.2011, 19:05
Titel:
Hey,
Habe den Fehler schon gefunden ... Vielen Dank für deine Antwort! Es hat mir sehr weiter geholfen.
nur aus Neugierde... wie schnell ist das ganze jetzt?
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 11.02.2011, 22:17
Titel:
Hmmm ... Genau stoppen tue ich das nicht ... Ich kann nur sagen, das es richtig schnell ist ... Man sieht das Ergebnis in Matlab sofort, ohne auch nur eine minimale Verzögerung ... Echt cool! Danke!!!
Trafo
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.02.2011, 01:18
Titel:
Hallo,
ich häng mich einfach mal ran, wenn es ok ist (sonst bitte kurze Nachricht und ich mache einen eigenen Thread auf). Habe ein ähnliches Problem.
Ich bin auch absoluter Anfänger mit Matlab. Es geht darum, ein Warteschlangensystem zu simulieren. Das funktioniert mittlerweile auch, allerdings hab ich da auch eine For-Schleife, die die Simulation stark ausbremst. Simuliere ich für 10.000 Kunden dauert es um die 3-4 Minuten, nehme ich die Schleife raus, dauert es nur noch wenige Sekunden.
Bei 1.000.000 Kunden werden aus den 4 Minuten dann einige Stunden.
Mein ganzer Code ist sicherlich nicht optimal und sauber geschrieben, wichtig sind einzig die Ergebisse der Simulation. Ob das nun 1 oder 30 Sekunden dauert ist egal.
Einzig diese eine For-Schleife überspannt den Bogen etwas, das dauert dann doch zu lange.
Gibt es da eine Möglichkeit, die For-Schleife irgendwie anders zu realisieren, um das Ganze zu beschleunigen? Wie gesagt, ich bin absoluter Anfänger sowohl mit Matlab als grundsätzlich mit der Programmierung.
Die Schleife:
Code:
ap=matrix(i,1);
z=0;
for u = 1:i
if(ap>=matrix(u,2))
z=z+1;
end end
matrix(u,7+bediener)=max(i-z,0);
Die Schleife berechnet, wieviele Kunden in der Warteschlange sind und sitzt in einer weiteren Schleife. i ist die Anzahl der Kunden, für die simuliert wird (die angesprochenen 10.000 oder eben auch 1.000.000).
Wenn du das dann noch für verschiedene i laufen lassen musst, wäre eine weitere Vereinfachung mit cumsum denkbar. Dazu müsstest du allerdings posten, wie die i-Schleife aussieht.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.02.2011, 12:21
Titel:
Hallo,
vielen Dank für die schnelle Antwort.
Die i-Schleife ist auch eine for-Schleife. Innerhalb der i-Schleife befinden sich dann verschiedenen Berechnungen zur Simulation der Wartezeit, Schlangenlänge etc. Die oben gezeigte u-Schleife ist da dann eben auch eine solche Berechnung.
Die i-Schleife läuft 6 mal durch, da ich für 6 versch. Systembelastungen simulieren muss.
Reicht das, um mehr sagen zu können? Sonst stell ich noch Code ein.
wenn es nur 6 Iterationen sind, sollte das keinen weiteren Aufwand wert sein.
Hat mein Vorschlag eine signifikante Verbesserung gebracht?
Je mehr Code, desto eher kann man helfen.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 13.02.2011, 15:48
Titel:
Hallo Harald,
nochmals vielen Dank für die kompetente Hilfe.
Ich teste deinen Vorschlag gerade. Musste meinen Code minimal anpassen. So scheint es jetzt zu laufen:
Code:
ap = matrix(i,1);
z = 0;
z = sum(ap >= matrix(1:i,2));
Eine Simulation für 10.000 Kunden ging gerade schon mal wesentlich fixer, ca 10 Sekunden im Verlgeich zu vorher einigen Minuten. Dein Vorschlag hat also schon mal eine wesentliche Beschleunigung gebracht. Vielen Dank:). Lasse gerade eine Simulation über 100.000 durchlaufen, da mir die Ergebnisse noch nicht ganz geheuer sind (andere Baustelle).
Der Code-Schnipsel soll eigentlich die gerade aktuelle Warteschlangenlänge bei jedem Kunden berechnen und es in eine Spalte schreiben. Am Ende der Simulation wird dann der Mittelwert bestimmt und so die mittlere Warteschlangenlänge bestimmt.
Die Schleife bzw. nun sum-Funktion macht das was sie soll, hab das egrade mal händisch nachgeprüft, die berechnete gerade aktuelle Schlangenlänge wird bei jedem Kunden korrekt ermittel. Bilde ich aus diesen Werten später den Mittelwert, weicht das Ergebnis jedoch vom erwarteten ab.
Es gibt nämlich noch zwei andere Lösungswege für die Berechnung der mittleren Warteschlangenlänge:
1. Reine Berechnung ohne Simulation: Dies sind meine Vergleichsergebnisse, die stimmen 100%ig.
2.Mittels Simulation, allerdings wird dann die mittlere Warteschlangenlänge nicht über die von der sum-Funktion (Code-Schnipsel) bestimmt, sondern mittels einer Formel (Summierte Wartezeiten geteilt durch Gesamtmodellzeit). Gerechnet wird hier also nur mit simulierten Werten. Die Ergbnisse liegen dann sehr nah an den berechneten aus 1. Das passt also.
Die Bestimmung über den Mittelwert bringt jedoch Ergebnisse, die davon abweichen. Wieso weiß ich leider noch nicht. Die sum-Funktion (bzw. meine vorherige for-Schleife) bringt die richtigen Ergebnisse, das passt zu den restlichen Simulationswerten. Die gemittelte Schlangenlänge auf Basis der sum-Funktion weicht dann jedoch ab.
Ich habe die Vermutung, dass ich evtl. über eine höhere Anzahl simulierter Kunden näher an die erwarteten Ergebnisse rankomme. Eine Simulation über 1.000.000 Kunden scheiterte bisher jedoch an der Laufzeit. Das werde ich nun aber mit deinem Vorschlag mal testen.
Ich weiß nicht, wie versiert du mit der Thematik bist, evtl. fällt dir der Grund für die abweichenden Ergebnisse ein? Mir erschließt sich der Grund für die Abweichung noch nicht so ganz.
meine Vermutung ist, dass du irgendwo einen Denkfehler hast.
Ich persönlich komme mit Formeln leichter zurecht als mit langen Erklärungen
Mir scheint jedoch, dass bei der 2. Variante die Gesamtlaufzeit des Modells noch direkt einfließt, bei der jetzigen jedoch nicht.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.