Verfasst am: 07.05.2009, 17:30
Titel: Funktion zur Berechnung eines Lagerinhalts
Hallo liebe Matlabfreunde
Ich habe eine Tabelle in der in Spalte 1 eine Produktnummer (1,2 oder 3), in Spalte 2 eine Lagereingangszeit und in Spalte 3 die Lagerausgangszeit steht. Nun will ich den Verlauf des Lagerinhalts für die einzelnen Produkte als auch für den Gesamtlagerinhalt darstellen.
zuerst hatte ich nur ganz Zahlen als Lagereingangszeiten, daher habe ich eine Doppelschleife geschrieben die für jede zeit alle reihen durchgeht und bei gleicher Zeit in Spalte 2 oder 3 den Bestand der entsprechenden Zeit um 1 erhäht bzw. erniedrigt. Diese funktioniert auch wunderbar, allerdings nur für ganze Zeiten...außerdem ziemlich ineffektiv
Die Matrix B soll die folgende Form haben: Spalte1: Zeit, Spalte2: Gesamtlagerinhalt, Spalte3: Lagerinhalt Produkt1, Spalte4: Lagerinhalt Produkt2, Spalte5: Lagerinhalt Produkt5.
Wie gesagt, diese Funktion funktionert, ihr könnt ggf. direkt weiterlesen
Code:
while t<=totaltime,
r=1; %rowcounter
while r<=m
if A(r,2)== t,
content = content + 1 if A(r,1) == 1,
content1 = content1 + 1;
end if A(r,1) == 2,
content2 = content2 + 1;
end if A(r,1) == 3,
content3 = content3 + 1;
end end if A(r,3)==t,
content = content - 1;
if A(r,1) == 1,
content1 = content1 - 1;
end if A(r,1) == 2,
content2 = content2 - 1;
end if A(r,1) == 3,
content3 = content3 - 1;
end end
r=r+1;
end
t=t+1 %setze t um einen hoch
B(t,1)=t-1; %schreibe erst nach erhöhung von t um 1 da ansonsten zu Beginn Reihe 0 wäre
B(t,2)=content;
B(t,3)=content1;
B(t,4)=content2;
B(t,5)=content3;
Ich brauche eine Funktion, die für jegliche (ungerade) Ein- oder Ausgangszeit gültig ist. Also habe ich mir folgendes gedacht:
Ich nehme die Größe meiner Rohdatenmatrix und durchlaufe alle Reihen (was definitiv effektiver ist als eine Doppelschleife )
In jeder Reihe nehme ich mir meine Werte Eingangszeit und Ausgangzeit. Ersteinmal prüfe ich für meine Zeiten, ob sie bereits in meiner Matrix B existieren. Wenn nicht lege ich Sie an, sortiere die Matrix nach der ersten Spalte und nehme erstmal als Lagerwert, den Lagerinhalt von der vorherigen Zeit. Die Prozedur ist für Eingangs- und Ausgangszeit gleich.
Anschließend geht es weiter, da der Wert ja, wenn er vorher nicht schon existierte nun erstellt wurde.
Nun suche ich mir aus meiner Matrix die Reihen, in denen Einganszeit udn Ausgangszeit sthen und erhöhe von Eingangszeit bis Ausgangszeit alle den Gesamtlagerinhalt und den des spezifischen Produkts (der in Spalte item+2 steht) um einen. Anschließend zeihe ich von dem Lagerwert der Ausgangszeit wieder einen ab, da ich ansonsten bei Eingangszeit=Ausgangszeit trotzdem einen addieren würde.
Bei einigen einfachen Verläufen funktionert das Ganz, bei komplizierteren Aber nicht mehr. Ich vermute fast, dass ich einen Anschauungsfehler habe und keinen Programmierfehler aber eigentlich ist meine Annahme, dass ich alle Werte zwischen Eingangszeit und Ausgangszeit um einen erhöhe doch richtig oder?
Hier mal 2 Graphen: Einmal mit der 1. Funktion, einmal mit der 2. Funktion, gleicher Eingangsdatensatz...scheinbat scheint es mit Funktion für den einfachen verlauf von Produkt1 (Item1) bei beiden zu klappen, sobald es komplizierter wird klappt es aber nicht mehr...
Ich bin für Hilfe sehr dankbar, weiß mal wieder nicht woran es hakt!
warum dünkelst denn du noch mit diesen wahnsinnig komplizierten Code rum???? Ich hab dir doch schon vor nem Monat einen viel besseren Ansatz per PN geschickt. Mit meinem Ansatz tritt dein jetziges Problem auch nicht auf. Warum hast du mir nicht nochmal zurückgeschrieben, wenn du was nicht verstehst?
Für den Fall einer anderen Produktnummer wollte ich eigentlich, dass du dir selbst eine Lösung überlegst hab ich jetzt aber auch in result1 und 2 gemacht. Kannste natürlich auch wieder in B speichern, musste noch vorher drehen.
also erstmal muss ich zugeben, dass ich das schon total vergessen hatte nachdem das am laufen war mit dem Integral Wie man an meiner Programmierweise sieht bin ich nicht wirklich Matlab versiert
Also ich habe deinen Code mal durchgeschaut und verstanden:
erzeuge ich nun einen Vektor von Starttime bis totaltime, wo jeweils eine Zeiteinheit zwischen den Abständen liegt, oder? Wenn ich falsch bin korrigier mich bitte...ich suche ja nun eine Funktion, die die mir jegliche Zeit darstellen kann, mit drölfzig Nachkommastellen (Werte aus irgendeiner Verteilung)...Ich könnte auf 5 Stellen runden und den Vektor dann mit 0,00001 Abständen machen, aber das is ja nicht der eigentliche Sinn...das aktuelle Problem ist ja, dass die Zeiten keine ganzen Zahlen mehr sind sondern beliebige Werte annehmen können...
Der restliche Code ist mir soweit klar indem ich bei der jeweilige Zeit, die ich gerade darstellen will schaue, bei welchen Produkte die Eingangszeit zwar kleiner als die aktuelle ist, die Ausgangszeit aber größer...muss schon sagen, eine clevere Lösung...nur wie mache ich das nun am besten für beliebige Zeiten?
is ja kein Problem, kann ja mal passieren. Die Sache mit dem Code ist, er sollte auch funktionieren, wenn die Zeiten in der Ausgangsmatrix nicht Gerade sind. Du kannst ja zum Beispiel trotzdem gerade Messzeiten nutzen. Ansonsten kannst du die Messzeitgenauigkeit einfach festlegen:
ja gut, das wäre die gepfuschte Lösung...müsste dann halt vorher immer auf eine gewisse Genauigkeit runden. Aber mein Ansatz, wo ich in jede Reihe gehe und mir die Zeit nehme und dann alles dazwischen erhöhe, müsste ja auch gehen und wäre dann genau. Leider funktioniert das nicht so wirklich...aber zur Not werde ich das einfach so machen...danke nochmal!
Würde ich so nicht sagen. Du würdest halt die Genauigkeit vorher festlegen, d.h. unter Umständen übersiehst du einen kurzen Peak wegen mangelnder Genauigkeit. Aber du könntest auch einen Vektor mit allen Zeiten erstellen, diesen dann in meinem Code verwenden, dann hättest du es genau, müsstest dann allerdings bei der Darstellung aufpassen. Ich würde es trotzdem so machen wegen der besseren Laufzeit und der besseren Übersichtlichkeit.
Viele Grüße,
der Oli
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.