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

for Schleife durch Vektoroperation ersetzen

 

Jigga
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2012, 18:49     Titel: for Schleife durch Vektoroperation ersetzen
  Antworten mit Zitat      
Hallo, ich würde gerne wissen ob ich hier komplett ohne for-Schleife arbeiten kann:

Die Funktion soll einfach die Funktionswerte in y schreiben.

y(t,N) = 2 \cdot \sum\limits_{k=1}^N (-1)^{\(k-1\)} \cdot \frac{sin(kt)}{k}

Code:
function[y]=reihe_v1(t,N)

y=zeros(size(t,2),1);
sizet=size(t,2);
yges=0;
x=1;

while sizet~=0
    for k=1:N
        ytemp=2*(-1)^(k-1)*sin(k*t(x))/k;
        yges=yges+ytemp;
    end
    y(x)=yges;
    yges=0;
    x=x+1;
    sizet=sizet-1;
end
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2012, 20:44     Titel:
  Antworten mit Zitat      
Hallo,

probiers mal damit:

Code:
function[y]=reihe_v1(t,N)

k = 1:N;
y = 2*sum( (-1).^(k-1) .* sin(k * t) ./ k );


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigga
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2012, 21:02     Titel:
  Antworten mit Zitat      
Danke für die Antwort.

Leider bekomme ich folgenden Fehler:

Code:
Error using  *
Inner matrix dimensions must agree.


Die Dimensionen von t (z.B. t=-pi:pi) und k (z.B. k=5) stimmen nicht überein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.502
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 15.04.2012, 21:21     Titel:
  Antworten mit Zitat      
Hallo,

ganz ohne Schleife dürfte das dann schwierig werden. Es ginge zwar über meshgrid oder arrayfun, aber ich denke nicht, dass das viel Geschwindigkeit bringt.
Wenn du über die t iterierst, sollte es gehen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigga
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.04.2012, 21:27     Titel:
  Antworten mit Zitat      
Vielen Dank! Mit meshgrid hat es geklappt!

Code:
function[y]=reihe(t,N)

k=1:N;
 
[K,T]=meshgrid(k,t);
 
S=(-1).^(K-1).*sin(K.*T)./K;
 
SS=sum(S');
 
plot(t,SS);
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: 15.04.2012, 22:15     Titel: Re: for Schleife durch Vektoroperation ersetzen
  Antworten mit Zitat      
Hallo Jigga,

Hier schon mal eine Vereinfachung mit FOR-Schleife:
Code:
function y = reihe_v2(t, N)

k = numel(t);
y = zeros(k, 1);
for i = 1:k
   y(i) = 2 * sum((-1).^(0:N-1) .* sin((1:N) * t(i)) ./ (1:N));
end

Das wiederholte erstellen des Vektors 1:N ist aber zeitraubend, wenn N groß ist, z.B. 1e6. Deshalb ist dies zwar hübscher, aber langsamer als das Orginal. Also:
Code:
function y = reihe_v2(t, N)
k = numel(t);
y = zeros(k, 1);
v = 1:N;
w = (-1).^v ./ v;
for i = 1:k
   y(i) = -2 * sum(w .* sin(v*t(i)));
end

Das ist schneller als das Orginal.

Nun kann man dies noch per BSXFUN schleifenfrei schreiben:
Code:
function y = reihe_v3(t, N)

v = 1:N;
w = (-1).^v ./ v;
y = -2 * sum(bsxfun(@times, w, sin(bsxfun(@times, v, t'))), 2);

Dies ist für große N und t etwa doppelt so schnell wie die Schleife.

Zeitmessung:
Code:
x = rand(1, 1e6);
N = 50;
tic; a = reihe_v1(x, N); toc

% Orginal:       8.141897 seconds
% Schleife 1: 11.906036 seconds.
% Scheilfe 2:  5.015035 seconds
% meshgrid:   4.224114 seconds
% BSXFUN:    2.867265 seconds

Gruß, Jan

PS: In der MESHGRID-Version fehlt ein Faktor 2.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jigga
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2012, 06:07     Titel:
  Antworten mit Zitat      
Vielen Dank für die ausführliche Antwort!

Werd ich mir wohl mal die bsxfun angucken müssen.
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.