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

Nur positive Werte einer bestimmten Zeile addieren

 

Ibero
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 28.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2015, 13:44     Titel: Nur positive Werte einer bestimmten Zeile addieren
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.01.2015, 14:00     Titel:
  Antworten mit Zitat      
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.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Ibero
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 28.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2015, 14:52     Titel:
  Antworten mit Zitat      
Hallo Winkow,

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


Beste Grüße
Ibero
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 21.01.2015, 15:14     Titel:
  Antworten mit Zitat      
Hallo,

Eine Möglichkeit:
Code:
i = 2;
P = (randi(10, 4, 10)) - 5
tmp_P = P(i,: );
log_P = tmp_P >= 0;
P(i,:) = tmp_P .* log_P

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 Wink

Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Ibero
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 28.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2015, 16:17     Titel:
  Antworten mit Zitat      
Hallo Seban!

Hier mal mit Beispieldaten:

[code]P=[100 200 300 150 168 285 300 100 500 100 128 0 0 0 0 0 0 0 0 0];
P=repmat(P,50,1);
Leistung=sum(P,2);
re=[2000; 5000; 3000; 2500; 2000; 1000; 2000; 2400; 2500;4000];
re=repmat(re,5,1);
Liste=P./5;
Liste=Liste(1,: );


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.

Beste Grüße
Ibero
Private Nachricht senden Benutzer-Profile anzeigen
 
Ibero
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 28.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.01.2015, 17:16     Titel:
  Antworten mit Zitat      
Ich habe jetzt eine akzeptable Lösung gefunden.

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