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

Addition möglichst ohne Schleife

 

Gül

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2016, 09:22     Titel: Addition möglichst ohne Schleife
  Antworten mit Zitat      
Einen wunderschönen guten Morgen,

ich bin Matlab-Neuling und hätte da eine Frage zur Addition von Schleifenwerten eines Vektor.
Ich habe einen etwas längeren Code mit einer Schleife am Anfang von k=1:n. In dieser Schleife werden verschiedene Werte berechnet u.a. a_f. Für a_f ist folglich ein Vektor mit n Zeilen. Jetzt würde ich es gerne schaffen, dass wenn ich a_f in der ersten Runde berechnet habe, in der zweiten, der neue a_f(2) sich aus der Summe von a_f(1) und a_f(2) berechnet. a_f(3) soll dann die Summe von 1-3 sein. Ich möchte allerdings nicht mit sum() eine komplette Summe bilden, sondern wirklich einfach nur zu der vorherigen Zeile den neuen Wert hinzu addieren und diesen in die nächste Zeiel schreiben. Der Startwert von a_f=0.
Also z.B. wenn a_f(1)=0,5 und a_f(2)=0,2, dass dann für a_f(2)=0,7 im Ergebnisvektor steht.
Ich habe das ganze jetzt versucht wie folgt mit einer zweiten Schleife zu lösen. Ich würde aber gerne eine Lösung finden, die ohne eine zweite Schleife funktioniert, da so mein Code sehr verlangsamt wird. Die erste Schleife würde bestehen bleiben, da sie für andere Rechnungen notwendig ist.

Code:

for k=1:n;
% hier werden verschiedene Größen berechnet
a_f(k)=a*k(k)*v(k)*dt/(60*24);
    for m=2:n;
        a_f(m)=a_f(m-1)+a*k(k)*k(k)*dt/(60*24);
    end
% folgen weitere Berechnungen, die für die Fragestellung aber irrelevant sind
end
 


Ich freu mich über jede Hilfe! Danke!
VG, Gül


Gül

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2016, 10:20     Titel: Re
  Antworten mit Zitat      
Heißt die Antwort
Code:
?
 
Gül

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2016, 12:27     Titel: Re:
  Antworten mit Zitat      
cumsum macht leider nicht das, was ich suche, da dort ja immer alle Zeilen addiert werden. Ich möchte aber wirklich nur, dass in der nächsten Zeile die Summe aus der vorherigen Zeile und dem neu berechneten Wert steht.

Jemand eine Idee?
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 14.04.2016, 13:22     Titel:
  Antworten mit Zitat      
sowas=
Code:
x=1:10
x2=filter([1,1],1,x)

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.04.2016, 13:30     Titel: Re: Addition möglichst ohne Schleife
  Antworten mit Zitat      
Hallo Gül,

Das Programm kann in der gezeigten Form nicht langsam laufen, sondern es stoppt mit einem Fehler. "k(k)" ist nicht möglich. Es ist schwer, einen nicht lauffähigen Code zu beschleunigen.
Heißt es innerhalb der Schleife wirklich "a*k(k)*k(k)*dt/(60*24)" oder soll das 2. "k(k)" ein "v(k)" sein? Falls das stimmt, ist der Körper der Schleife über m gar nicht von m abhängig und es könnte so geschrieben werden:
Code:
for k=1:n
  a_f = cumsum(a * k .* .v * dt/(60*24)) ;

Aber wie gesagt: Das ist geraten.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 14.04.2016, 13:38     Titel: Re:
  Antworten mit Zitat      
Hallo Gül,

cumsum macht schon das, was Du sagst. Denn auch wenn a_f(k) "nur" von a_f(k-1) abhängen soll, wurde a_f(k-1) vorher schon mit a_f(k-2) berechnet.

Aber wie gesagt läuft Dein Code wegen "k(k)" sowieso nicht und so kann man nicht erraten, was genau Du erreichen möchtest. Bitte pose einen lauffähigen Code.

Hast du den Profiler verwendet um heraus zu finden, wo die meiste Zeit benötigt wird. An sich sind Schleifen nämlich gar nicht schlimm. Wenn die Outputs pre-alloziert sind zumindest. Ist das der Fall?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gül

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.04.2016, 17:44     Titel: Re:
  Antworten mit Zitat      
Hallo,
danke für die Antworten.
ja, das war ziemlicher Quatsch, was da stand mit dem k. Hatte die variablen aufgrund der Namenslänge umbenannt und dabei ist wohl etwas schief gegangen.
Also eigentlich war das gemeint:
Code:

for k=1:n;
% hier werden verschiedene Größen berechnet
a_f(k)=a*k(k)*v(k)*dt/(60*24);
    for m=2:n;
        a_f(m)=a_f(m-1)+a*k(m)*k(m)*dt/(60*24);
    end
% folgen weitere Berechnungen, die für die Fragestellung aber irrelevant sind
end
 


Habe das Ganze jetzt so gelöst:
Code:

for k=1:n;
% hier werden verschiedene Größen berechnet
a_f(k)=a*k(k)*v(k)*dt/(60*24);

if k >=2;
a_f(k)=a_f(k-1)+a*k(k)*v(k)*dt/(60*24);
end

% folgen weitere Berechnungen, die für die Fragestellung aber irrelevant sind
end
 


VG!
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 14.04.2016, 21:20     Titel:
  Antworten mit Zitat      
ist das nicht genau das was cumsum macht?

Code:
dt=1
a=2
b=rand(1,10)
v=rand(1,10)
n=10
for k=1:n;
% hier werden verschiedene Größen berechnet
a_f(k)=a*b(k)*v(k)*dt/(60*24);

if k >=2;
a_f(k)=a_f(k-1)+a*b(k)*v(k)*dt/(60*24);
end

% folgen weitere Berechnungen, die für die Fragestellung aber irrelevant sind
end
a_f2=cumsum(a*b.*v*dt/(60*24));  
isequal(a_f,a_f2)

_________________

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