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

komplizierteres Multiplizieren von Vektoren

 

Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2011, 19:08     Titel: komplizierteres Multiplizieren von Vektoren
  Antworten mit Zitat      
Hallo Leute,

ich schreibe gerade an einer Funktion der 2 Parameter übergeben werden:

x : Vektor der Länge n
m: Skalar

Nun möchte ich folgende Schleife gerne vektorisieren:

for k=1:m
y = y + (1/m)*cos(x/T0*m) +(-1)^m*sin(x/T0*m);
end

y hat die gleiche Länge wie x. Leider habe ich bisher keine Möglichkeit gefunden, das vektoriell auszudrücken. Vielleicht hat jemand einen guten Hinweis.

Danke Jan88.


denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.04.2011, 19:14     Titel:
  Antworten mit Zitat      
Hallo

was ist mit T0? Vektor? Skalar?
Private Nachricht senden Benutzer-Profile anzeigen
Verschoben: 05.04.2011, 19:14 Uhr von denny
Von Matlab intern nach Programmierung
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2011, 19:16     Titel:
  Antworten mit Zitat      
Hallo,

sorry, T0 ist ein Skalar.


Grüße Jan.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.04.2011, 20:00     Titel:
  Antworten mit Zitat      
Hallo

was ist die Startwert von y?

bin mir noch nicht ganz sicher, vermutlich so:


Code:

y=(1/m)*cos(x/T0*m) +(-1)^m*sin(x/T0*m)
y= y*m;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

bist du denn sicher, dass die Schleife momentan das richtige macht? Die Schleifenvariable k wird nämlich nicht verwendet; du addierst also immer dasselbe auf. Und das ist wohl kaum Sinn der Sache? Ich vermute also, dass manche m durch k zu ersetzen sind. Welche das sind, kann ich allerdings logischerweise nicht sagen, das musst du schon wissen Smile

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 05.04.2011, 20:13     Titel:
  Antworten mit Zitat      
Ich habe mich das gleiche wie Harald gefragt, stimmt deine Schleife überhaupt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2011, 20:36     Titel:
  Antworten mit Zitat      
Ach Mist,

habs beim posten etwas angpasst, das es nicht so riesig wird. Gleich ein Fehler eingeschlichen:

y = 0;
for k=1:m
y = y + (1/k)*cos(x/T0*k) +(-1)^k*sin(x/T0*k);
end

ist natürlich richtig.


Grüße.
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2011, 20:56     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo

was ist die Startwert von y?

bin mir noch nicht ganz sicher, vermutlich so:


Code:

y=(1/m)*cos(x/T0*m) +(-1)^m*sin(x/T0*m)
y= y*m;
 


Leider erhalte ich folgende Fehlermeldung:

??? Error using ==> mldivide
Matrix dimensions must agree.

Error in ==> Fouriertest at 10
y=(1/m)*cos(x/T0*m) +(-1)^m*sin(x/T0*m);
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2011, 15:33     Titel:
  Antworten mit Zitat      
Hey,

irgendwie komme ich nicht weiter.

Ich schreibe mal was passieren soll:

Eine Funktion Test hat 2 Übergabeparameter:

Einen Vektor x und einen Skalar m.

Nun soll die Funktion einen Vektor zurückliefern, der zu jedem x-Wert den y-Wert liefert.

Dabei werden zu jedem x m Berechnungen durchgeführt. Dies führt zu folgender Funktion:

y = a0; % a0 = Gleichanteil (Skalar)
for k=1:m
arg = 2*pi*x/k;
y = y + 1 / (m^2)*cos(angle) + (-1)^m*sin(angle);
end

Da das für große m recht lahm ist wollte ich das ganze durch Vektorisierung ersetzen.

Grüße Jan.
 
Idefix_1024
Forum-Century

Forum-Century


Beiträge: 230
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2011, 16:48     Titel:
  Antworten mit Zitat      
also in einem ersten Schritt kannst Du auch versuch den y-Vektor einmal ordentlich zu initialisieren!

quasi

Code:

x   = [0 1 2 3 4 5];
m   = length(x);
T0  = 3;
y   = zeros(m,1);
for k=1:m
    y(k) = y(k) + (1/m)*cos(x(k)/T0*m) +(-1)^m*sin(x(k)/T0*m);
end;
y
 


das mag etwas überflüssig anmuten, aber bei grpßen Vektoren ist das durchaus SEHR empfehlenswert!

Da in gewisser Weise eine Rekursion in Deiner Berechnungsvorschrift steckt sehe ich da im Moment auf Anhieb keine Berechnungsmöglichkeit ohne eine Schleife...

versuch es mal mit der Initialisierung von y!

Grüße,
Idefix_1024
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.04.2011, 16:54     Titel:
  Antworten mit Zitat      
Hallo Jan

Also jetzt hast du wieder andere Formel gepostet, die wahrscheinlich auch nicht ganz richtig ist

Also dann werden ich mal von letztem Beitrag ausgehend, folgendes vorschlagen

Code:

function y = calc_y(x,m)
a0 = 0;

% Nicht Vektorisierte Version:
y = a0; % a0 = Gleichanteil (Skalar)
for k=1:m
    % ich nehme an, hier war ANGLE gemeint
   angle = 2*pi*x/k;
   y = y + 1 / (m^2)*cos(angle) + (-1)^m*sin(angle);
end
disp(y)

% Vektorisierte Version
m0      = 1:m;
% mit MESHGRID auf gleiche Dimension bringen

[x0,m0] = meshgrid(x,m0);
angle   = 2*pi*x0./m0;
y       = a0 + sum(1 /(m^2).*cos(angle) + (-1)^m.*sin(angle));

disp(y)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2011, 18:26     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Hallo Jan

Also jetzt hast du wieder andere Formel gepostet, die wahrscheinlich auch nicht ganz richtig ist

Also dann werden ich mal von letztem Beitrag ausgehend, folgendes vorschlagen

Code:

function y = calc_y(x,m)
a0 = 0;

% Nicht Vektorisierte Version:
y = a0; % a0 = Gleichanteil (Skalar)
for k=1:m
    % ich nehme an, hier war ANGLE gemeint
   angle = 2*pi*x/k;
   y = y + 1 / (m^2)*cos(angle) + (-1)^m*sin(angle);
end
disp(y)

% Vektorisierte Version
m0      = 1:m;
% mit MESHGRID auf gleiche Dimension bringen

[x0,m0] = meshgrid(x,m0);
angle   = 2*pi*x0./m0;
y       = a0 + sum(1 /(m^2).*cos(angle) + (-1)^m.*sin(angle));

disp(y)
 


In der Zeile

Code:

y  = a0 + sum(1 /(m^2).*cos(angle) + (-1)^m.*sin(angle));
 


hast du m verwendet, aber eigentlich muss er hier alle Werte von 1 bis m durchlaufen, so wie oben in der Schleife. Und ja Sorry, arg sollte angle heißen.

Hier die Originalfunktion:

Code:

y = a0; % a0 = Gleichanteil (Skalar)
for k=1:m
angle = 2*pi*x/k;
y = y + 1 / (k^2)*cos(angle) + (-1)^k*sin(angle);
end
 


Aber wie einer oben schon schrieb, ist die Vektorisierung in diesem Fall wohl nicht möglich.

Grüße.
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 06.04.2011, 18:54     Titel:
  Antworten mit Zitat      
Da hast du mich mit dem letztem Post durcheinander gebracht.

dann so:

Code:

function y = calc_y(x,m)
a0 = 0;

% Nicht Vektorisiert
y = a0; % a0 = Gleichanteil (Skalar)
for k=1:m
angle = 2*pi*x/k;
y = y + 1 / (k^2)*cos(angle) + (-1)^k*sin(angle);
end
disp(y)

% Vektorisierte Version
m0      = 1:m;
[x0,m0] = meshgrid(x,m0);
angle   = 2*pi*x0./m0;
y       = a0 + sum(1 ./(m0.^2).*cos(angle) + (-1).^m0.*sin(angle));

disp(y)
% y = a0;
 
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: 06.04.2011, 18:54     Titel:
  Antworten mit Zitat      
Hallo Jan88,

Ich durchblicke diesen Thread nicht ganz. Ich beginne mal ganz unten:
Code:
y = a0;
for k=1:m
  angle = 2*pi*x/k;
  y = y + 1 / (k^2)*cos(angle) + (-1)^k*sin(angle);
end

Das soll vektorisiert werden, oder?
Code:
k = 1:m;
angle = (2*pi*x) ./ k;
y = a0 + sum(1 ./ (k .^ 2) .* cos(angle) + (-1) .^ k . * sin(angle));
 

Das Potenzieren ist teuer, also sollte dies schneller sein:
Code:
q = ones(1, m);
q(1:2:m) = -1;
y = a0 + sum(cos(angle) ./ (k .* k) + q . * sin(angle));

Hilft das?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan88

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2011, 19:18     Titel:
  Antworten mit Zitat      
Hey,

ich habe mal einen Laufzeittest gemacht:

Die Geschwindigkeitsunterschiede sind deutlich weniger als 10%, so dass eine Vektorisierung hier wohl nix bringt. Wahrscheinlich ist die Berechnung der Sinus/Cosinusterme zu aufwendig, so dass die Schleife da nicht ins Gewicht fällt.


Trotzdem vielen Dank,

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