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

Funktion zur Berechnung eines Lagerinhalts

 

hsv-fan19
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2009, 17:30     Titel: Funktion zur Berechnung eines Lagerinhalts
  Antworten mit Zitat      
Hallo liebe Matlabfreunde Smile

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 Wink

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;
   
end
 



Aber egal nun zu meinem eigentlichen Problem:

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 Razz)

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.

Das ist der Code dazu


Code:

[m,n]=size(A);
B =zeros(1,5); %m x 5 Matrix with zeros

%Function for graphs
r=1; %rowcounter
while r<=m,
    item=A(r,1);
    intime=A(r,2);
    outtime=A(r,3);
    [row1,col1]=find(B(:,1) ==intime);
    check=isempty(row1); %returs 1 if empty, else returns 0
    if check==1,
        [o,p]=size(B) %o rows, p columns
        B(o+1,1)=intime;    
        sortrows(B);
        [row1,col1]=find(B(:,1) ==intime);
        B(row1,2)=B(row1-1,2);
        B(row1,item+2)=B(row1-1,item+2);
    end
    [row2,col2]=find(B(:,1) ==outtime);
    check=isempty(row2); %returs 1 if empty, else returns 0
    if check==1,
        [o,p]=size(B) %o rows, p columns
        B(o+1,1)=outtime;
        [row2,col2]=find(B(:,1) ==outtime);
        B(row2,2)=B(row2-1,2);
        B(row2,item+2)=B(row2-1,item+2);
    end
    B(row1:row2,2)= B(row1,2)+1;
    B(row1:row2,item+2)=B(row1,item+2)+1
    B(row2,2)= B(row2,2)-1; %must be done if intime==outtime!!!
    B(row2,item+2)=B(row2,item+2)-1
    r=r+1 %Reihen von A
end



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!

funktion2.jpg
 Beschreibung:
Funktion 2

Download
 Dateiname:  funktion2.jpg
 Dateigröße:  60.37 KB
 Heruntergeladen:  461 mal
1-1_1-1__50-65-10-4.jpg
 Beschreibung:
Funktion 1

Download
 Dateiname:  1-1_1-1__50-65-10-4.jpg
 Dateigröße:  77.67 KB
 Heruntergeladen:  503 mal
Private Nachricht senden Benutzer-Profile anzeigen


derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 07.05.2009, 18:52     Titel:
  Antworten mit Zitat      
Hi Hsvfan19,

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?

Hier der Code:

Code:

starttime=1;
totaltime=89;

x=starttime:totaltime;
for k=1:length(x)
    result(k)= sum( A(:,2) < x(k) & A(:,3)>=x(k) ); %Gesamtinhalt
    result1(k)= sum( A(A(:,1)==1,2) < x(k) & A(A(:,1)==1,3) >= x(k) );
    result2(k)= sum( A(A(:,1)==2,2) < x(k) & A(A(:,1)==2,3) >= x(k) );
end
 


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.

Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
hsv-fan19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2009, 04:38     Titel:
  Antworten mit Zitat      
hey olli!

Vielen Dank schonmal...

also erstmal muss ich zugeben, dass ich das schon total vergessen hatte nachdem das am laufen war mit dem Integral Smile Wie man an meiner Programmierweise sieht bin ich nicht wirklich Matlab versiert Razz

Also ich habe deinen Code mal durchgeschaut und verstanden:

Ich stetze eine starttime und eine totaltime. Mit
Code:

x=starttime:totaltime;
 


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?

Danke nochmal und liebe Grüße

Patrick
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 08.05.2009, 11:15     Titel:
  Antworten mit Zitat      
Hi,

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:

Code:

starttime=1;
accuracy=0.1
totaltime=89;

x=starttime:accuracy:totaltime;
 


Viele Grüße,

der Oli
Private Nachricht senden Benutzer-Profile anzeigen
 
hsv-fan19
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 01.04.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.05.2009, 05:00     Titel:
  Antworten mit Zitat      
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!
Private Nachricht senden Benutzer-Profile anzeigen
 
derOli
Forum-Meister

Forum-Meister


Beiträge: 579
Anmeldedatum: 19.03.08
Wohnort: Leipzig
Version: 2010a
     Beitrag Verfasst am: 19.05.2009, 14:53     Titel:
  Antworten mit Zitat      
Hi,

Zitat:
ja gut, das wäre die gepfuschte Lösung...


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
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.