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

Summieren bis Vorzeichenwechsel

 

F KT
Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.10.2011, 13:17     Titel: Summieren bis Vorzeichenwechsel
  Antworten mit Zitat      
Hallo Forum,

ich möchte Gradientenwerte aufsummieren und zwar nur solange bis sich das Vorzeichen ändert. die anzahl der summationen soll in einer variable gespeichert werden und anschließend mit der summe in einem Vektor gespeichert werden. ich hab habe es für positive Vorzeichen schon geschafft, nur weiß ich nun nicht weiter wie ich das für negative Vorzeichen hinbekommen. bisher ist es so das jeder vorkommende negative wert geplottet wird.

Code:

gr=diff(vec_w);
l=length(gr);
cnt=0;
dp=0;
dp_pos=zeros(l,2);
dp_neg=zeros(l,2);
k=0;

for i=1:l
   
    if gr(i)>=0
        cnt=cnt+1;
        dp=dp+gr(i);
    else
        k=k+1;
        dp_pos(k,:)=[dp,cnt];
        cnt=0;
        dp=0;
        dp_neg(k,:)=[gr(i),1];
    end
       
end

% Nullzeilen rauslöschen
dp_pos=dp_pos(dp_pos(:,1)>0,:);
dp_neg=dp_neg(dp_neg(:,1)<0,:);

%plotten
figure;
plot(dp_pos(:,1)/14.04e3,dp_pos(:,2),'b.'...
     ,dp_neg(:,1)/14.04e3,dp_neg(:,2),'r.');
 grid on;
 ylim([0 300])
 


wäre super wenn da jemand eine Lösung hätte.
mfg F kt
Private Nachricht senden Benutzer-Profile anzeigen


F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.10.2011, 13:33     Titel:
  Antworten mit Zitat      
als Bsp.:
Code:

test=[68; 69; 71; 70; 69];
gr=diff(test)
 


dann soll rauskommen einmal 3 und einmal -2. ich hoffe ihr wisst was ich meine.
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 09.10.2011, 14:04     Titel:
  Antworten mit Zitat      
Code:
test=[68; 69; 71; 70; 69];
gr=diff(test);
iX = find(gr<0, 1, 'first');
pos = sum(gr(1:iX-1));
neg = sum(gr(iX:end));
Private Nachricht senden Benutzer-Profile anzeigen
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 09.10.2011, 14:22     Titel:
  Antworten mit Zitat      
hi eupho,

dass hilft mir leider nur bedingt weiter, da ich die anzahl der aditionen wissen möchte. wenn ich beispielsweise eine Vektor habe 1 -2 1 1 1 -3 -4 brauch ich als Ergebnis: 1 1 Addition; -2 1 Addition ;3 3 Additionen; -7 2 Additionen
gruß fkt
Private Nachricht senden Benutzer-Profile anzeigen
 
eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 10.10.2011, 07:17     Titel:
  Antworten mit Zitat      
.. also ich hab das nicht verstanden.. vielleicht bringst du nochmal ein verständliches Beispiel.
Private Nachricht senden Benutzer-Profile anzeigen
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 10.10.2011, 07:33     Titel:
  Antworten mit Zitat      
ich mochte die vektorelemente addieren, aber so, das bei einem vorzeichenwechsel des vektorelements die Anzahl der vorangegangenen Additionen sowie die summe der Additionen bei dem Beispielvektor:
[1 -2 1 1 1 -3 -4] hab ich mich bzgl der Additionen falsch ausgedrückt. ich meinte die mit Additionen eigl die Anzahl der aufsummierten Elemente

ich meinte eigl das hier: 1 1 Element; -2 1 element ;3 3 Elemente; -7 2 Elemente.

ich hoff das ist besser verständlich!
gruß fkt
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 10:50     Titel:
  Antworten mit Zitat      
Probier das mal...

Code:

x=[1 -2 1 1 1 -3 -4 5];

ergebnis_sum = x(1);
anzahl_sum = 1;
m = 1;
for i=1:length(x)-1    
    if (sign(x(i)) >= 0) && (sign(x(i+1)) >= 0) % 2 positive Zahlen
        ergebnis_sum(m) = ergebnis_sum(m) + x(i+1);
        anzahl_sum(m) = anzahl_sum(m) + 1;
    elseif ((sign(x(i)) >= 0) && (sign(x(i+1)) < 0)) || ((sign(x(i)) < 0) && (sign(x(i+1)) >= 0))
        m = m + 1;
        anzahl_sum(m) = 1;
        ergebnis_sum(m) = x(i+1);
    else % 2 negative Zahlen
        ergebnis_sum(m) = ergebnis_sum(m) + x(i+1);
        anzahl_sum(m) = anzahl_sum(m) + 1;
    end
end
 


Allerdings verstehe ich nicht, warum die Anzahl der Summierungen auf 1 gesetzt wird, obwohl wie im Fall -2 gar keine erfolgt ist. Sollte das dann nicht Null sein?!
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 10:57     Titel:
  Antworten mit Zitat      
Der eine Fall ist überflüssig und sign kann man sich ja auch sparen Embarassed

Code:

ergebnis_sum = x(1);
anzahl_sum = 1;
m = 1;
for i=1:length(x)-1    
    if ((x(i) >= 0) && (x(i+1) >= 0)) || ((x(i) < 0) && (x(i+1) < 0)) % 2 positive oder negative Zahlen
        ergebnis_sum(m) = ergebnis_sum(m) + x(i+1);
        anzahl_sum(m) = anzahl_sum(m) + 1;
    else
        m = m + 1;
        anzahl_sum(m) = 1;
        ergebnis_sum(m) = x(i+1);    
    end
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 10.10.2011, 11:07     Titel:
  Antworten mit Zitat      
hi DSP,

doch du hast recht das war ein fehler von mir eigl sollte das wie du schon gesagt hast bei -2 0 additionen sein!
aber danke für deinen vorschlag das ist genau das was ich brauch! vielen dank!
mfg f kt
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 10.10.2011, 11:11     Titel:
  Antworten mit Zitat      
Ok...dann musst du ja nur den Wert von anzahl_sum, wo er auf 1 gesetzt wird auf 0 ändern.
Private Nachricht senden Benutzer-Profile anzeigen
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 10.10.2011, 14:34     Titel:
  Antworten mit Zitat      
so ich hab den code jetz noch verkürzt und auf mein problem umgeschrieben... allerdings dauert es sehr sehr lange (der Vektor hat ca. 2 mio Einträge!)

Code:



vec_w=[januar{:,2}];


gr=diff(vec_w);
 
vz=sign(gr);
VZ=int8(vz);
dp=0;
cnt=0;
k=0;
dt=length(gr);
for i=1:1:dt
    if vz(i)== vz(i+1)
        dp=dp+gr(i);
        cnt=cnt+1;
       
    else
        k=k+1;
        dp_end(k,:)=[dp,cnt];
        cnt=0;
        dp=0;
    end
end
figure
plot(dp_end(:,1),dp_end(:,2),'.')

 


weiß jemand wie ich das beschleunigen kann?

mfg f kt
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.10.2011, 14:48     Titel:
  Antworten mit Zitat      
Hi,

dp_end scheint sich dynamisch zu vergrößern.
Preallocieren könnte da helfen.

Könnte irgendwie so gehen:
Code:

% preallocieren
dp_end=nan(length(vec_w),2);
% dein code

% überflüssige Zeilen entfernen
dp_end(isnan(dp_end(:,1)),:)=[];



 
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 10.10.2011, 16:34     Titel:
  Antworten mit Zitat      
da kommt bei mir die Fehlermeldung :
??? Attempted to access vz(1.1752e+06); index out of bounds because
numel(vz)=1175195.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast1

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.10.2011, 06:20     Titel:
  Antworten mit Zitat      
deine vorschleife geht bis dt, vz hat auch dt Elemente, innerhalb wird aber auf das i+1 te Element zugegriffen
 
F KT
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 22
Anmeldedatum: 13.09.11
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 11.10.2011, 07:01     Titel:
  Antworten mit Zitat      
ah stimmt! danke für den Denkanstoß!!
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.