Verfasst am: 20.01.2015, 13:44
Titel: Nur positive Werte einer bestimmten Zeile addieren
Hallo Zusammen!
Ich habe folgendes Problem. Solange r<Leistung (in jeder Zeile nacheinander) solange soll von jedem Element in der Spalte 1 subtrahiert werden bis alle Werte die Werte aus Matrix_Liste unterschreiten.
Klappt soweit auch. Ich will jedoch nur die positiven Werte summieren (Siehe im Code)
r[8000x1double], Leistung[8000x1double]
Code:
P=BE; % [8000x190double]
Leistung=sum(BE,2);
for i=1:1:size(r,1) while r(i,1)<Leistung(i,1)
P(i,: )=P(i,: )-ones(1,size(P,2));
Leistung(i)=sum(P(P(i,: )>0));
% ??? dauert ewig so, sum(P(i,: )(P(i,: )>0))geht auch nicht. if P(i,: )<=Matrix_Liste(9,: ) break end end end
Habt ihr eine Lösung wie man in jeder Zeile nur die positiven Werte addiert?
Leistung(i)=sum(P(P>0)) dauert ewig, genauso
wenn ich erst P(P<0)=0 mache, da so ja jedes mal die ganze Matrix betrachtet wird und nicht nur die einzelne Zeile.
Beste Grüße
Ibero
edit winkow: code umgebung berichtigt
da der code so nicht lauffähig ist kann ich das nicht nachfollzihen. ich bezweifle das der zeitfresser die summation ist. das sollte relativ fix gehen. einzige was ich mir vorstellen kann ist das deine while schleife sehr lange läuft weil das Abbruch Kriterium nicht erfüllt wird. kannst ja mal mit dem debugger reingehen und gucken.
_________________
ich bin mir relativ sicher dass es nicht an der while-Schleife liegt bzw. das Abbruchkriterium immer erreicht wird.
Ich denke, das Problem liegt in Zeile 4. Da hier jedes mal für die komplette Matrix die werte<0 auf 0 gesetzt werden. Es würde jedoch reichen, dass nur für die jeweilige Zeile(i) zu machen.
Wie in Zeile 4 :
P(i,: )(P(i,: )<0)=0
kann man es aber nicht schreiben.
Und so:
P(P<0)=0
dauert es viel zu lange.
Wie kann ich denn nur in der betrachteten Zeile i alle werte kleiner 0 auf 0 setzen?
Ich denke, das würde die Berechnung beschleunigen.
Code:
for i=1:1:size(r,1) while r(i,1)<Leistung(i,1)
P(i,: )=P(i,: )-ones(1,size(P,2));
P(i,: )(P(i,: )<0)=0; !!!!!!!????
Leistung(i)=sum(P(i,: ));
if P(i,: )<=Matrix_Liste_ohne_KWK(9,: ) break end end end
Macht es nicht vielleicht Sinn, den <-Vergleich vor der Schleife auf die gesamte Matrix durchzuführen und dann in der Schleife mit den entsprechenden Zeilen zu arbeiten? Vielleicht kann man auch die gesamte Aufgabe vektorisieren, habe ich mir jetzt nicht so genau angeschaut, da das Beispiel nicht ausführbar ist.
Wenn du Beispieldaten postest, kann man dir übrigens leichter helfen
for i=1:1:size(re,1)
while re(i,1)<Leistung(i,1)
P(i,: )=P(i,: )-ones(1,size(P,2));
P(P<0)=0;
Leistung(i)=sum(P(i,: ));
if P(i,: )<=Liste(1,: )
break
end
end
end[/code]
Funktioniert so auch wunderbar. Meine Matrix ist jedoch deutlich größer [35000x190].
Deswegen dauert es ewig. Nach einer Stunde war ich bei Zeile 3000 ungefähr.
Wenn ich P(P<0)=0 weglasse, dauert es auch nur ein paar Sekunden, jedoch ist dann meine Summe falsch, da ich ja die negativen Werte mit reinrechne.
Ich brauch also die Summe aller positiven Werte. Geht das auch anders (schneller) als mit meinem Code.
Mit Hilfe einer 2. for-schleife betrachte ich jetzt jedes Element einzeln anstatt vorher zeilenweise.
Habe ich zwar nicht erwartet, aber so geht es deutlich schneller.
Danke trotzdem für eure Hilfe!
Viele Grüße
Ibero
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.