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

Matrix-Multiplikation und Laufzeitvergleich

 

tycro
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.11.2008, 21:36     Titel: Matrix-Multiplikation und Laufzeitvergleich
  Antworten mit Zitat      
Hallo,

ich muss folgende Aufgabe erledigen:

a) Schreiben Sie eine Octave-Function function [Lx] = dreiMatVecMul(L,x),
die die Matrix-Vektor-Multiplikation Lx, x € Rn, ohne unnötige Rechenoperationen (d.h. Multiplikationen mit Null) durchführt. Verwenden Sie dazu keine if-Abfrage, sondern wählen Sie angepaßte Grenzen für die Laufvariablen der Schleifen. Testen Sie ihren Code am Beispiel l(ij) = i + j für i ≥ j und l(ij) = 0 sonst, sowie x = (1, . . . , 1)^T ∈ Rn und n = 10.

Die Matrix L kann man sich unter dem folgenden Link ansehen:
http://img356.imageshack.us/img356/4903/octaveaufgabexj7.jpg


Ich weiß dass es auch ein Octave Unterforum gibt, aber das ist nicht so stark frequentiert wie dieses hier. Und da sich die Sprachen ja recht ähnlich sind, hoffe ich dass ihr mir weiterhelfen könnt Smile

Ich hab auch schon etwas getan und glaube (hoffe) dass es richtig ist:

Erstmal das Script in dem der Vektor und die Matrix definiert werden:

Code:
%Aufgabe 28 a)
x = [1;1;1;1;1;1;1;1;1;1];

%Berechnung der Matrix L (Dreiecksmatrix)
%k= 10 ist die Zeilenzahl
%i= 10 ist die Spaltenzahl

for k=1:10;
  for i=1:10;
if k >= i;
  L(k,i) = [k+i];
  else
    k=0;
    end
  end
end

%Ausgabe der Matrix L

L

%Abgabe an Function File

[Lx] = dreiMatVecMul(L,x)


Und hier das "function-file" in dem die eigentliche Berechnung stattfindet:

Code:
function [Lx] = dreiMatVecMul(L,x)
 
Lx=zeros(10,1);
% (10,1) da L mit x multipliziert eine 10x1 Matrix ergibt

  for k=1:1
    for l=1:10
      Lx(:, k)= Lx(:, k) + L(:, l) * x(l, k);
      end
  end
 


Als Ergebnis kommt der Vektor Lx = (2,7,15,26,40,57,77,100,126,155)^T raus. Den bekomme ich auch, wenn ich statt dem "function-file" einfach L*x rechnen lasse. Sollte also stimmen oder?


Zur zweiten Teilaufgabe hab ich leider noch nicht ganz so viel. Meine Überlegung wäre, dass ich Octave jeweils die verschiedenen Möglichkeiten durchrechnen lasse und jeweils die Zeit nehme. Dann würde ich ein KoSy mit x-Achse = Zeit und y-Achse = n und die Graphen ploten lassen.
Nur stellt sich jetzt die Frage wie? Wink

Zur Multiplikation sind mir 3 verschiedene Varianten eingefallen, zum einen die oben durchgeführte, dann die mit dem Falk-Schema und als letztes würde ich Octave einfach ohne "function-file" rechnen lassen (also L*x).

Damit hab ich dann auch gleich mal angefangen:

Code:

for k=1:1000
L = rand(k,k);
x = rand(k,1);
end
t=cputime;

L*x;

t1=cputime-t

 


Aber weiter bin ich noch nicht gekommen Sad

Über Hilfe würde ich mich sehr freuen Smile

Grüße,
tycro
Private Nachricht senden Benutzer-Profile anzeigen


dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2008, 11:42     Titel:
  Antworten mit Zitat      
Hallo,

1.
Zitat:
Verwenden Sie dazu keine if-Abfrage, sondern wählen Sie angepaßte Grenzen für die Laufvariablen der Schleifen.
Das machst du ja nicht wirklich Smile
Code:
N = 10;
L = zeros(N);
for k=1:N
  for i=1:k
    L(k,i) = k+i;
  end
end


2. Ich würde mal behaupten, dass L*x die schnellste Variante ist, da sie intern schnell umgesetzt ist. Das Falk-Schema sagt mir nichts, die Vorgehensweise du du benutzt ist sicher eine der langsamen (du berücksichtigst du Dreieckstruktur überhaupt nicht).
Code:
Lx = dreiMatVecMul1 (L,x)
N = length(x);
Lx = zeros(N,1);
for k=1:N
  for i=1:k
    Lx(k) = Lx(k) + L(k,i) * x(i);
  end
end


Code:
Lx = dreiMatVelMul2 (L,x)
Lx = L*x;


Code:
Lx = dreiMatVelMul3 (L,x)
N = length(x);
Lx = zeros(N,1);
for k=1:N
  Lx(k) = sum(L(k,1:k)*x(1:k));
end

Eventuell noch deine Methode auch noch dazu.

EDIT: Vergiss was ich geschrieben habe. Das steht ja nichts von einer Dreiecksstruktur.

Intern
Code:
Lx = dreiMatVelMul1 (L,x)
Lx = L*x;


Ausmultiplizieren
Code:
Lx = dreiMatVelMul2 (L,x)
Lx = zeros(size(x));
for i=1:size(L,1)
  for j=1:size(L,2)
     Lx(i) = Lx(i) + L(i,j) * x(j);
  end
end


Skalarprodukt
Code:
Lx = dreiMatVelMul3 (L,x)
Lx = zeros(size(x));
for i=1:size(L,1)
  Lx(i) = dot(L(i,:),x);
end


Was du da mit der Zeitmessung machst, ist auch glaub ich ungewollt. Die gehört eigentlich in die Schleife mit rein.
Code:
N = 1000;
t1 = nan(N,1);
t2 = nan(N,2);
t3 = nan(N,3);

for k=1:N
  L = rand(k);
  x = rand(k,1);
  % Berechnung 1
  t0 = cputime;
  dreiMatVelMul1(L,x);
  t1(k) = cputime-t0;
  % Berechnung 2
  t0 = cputime;
  dreiMatVelMul2(L,x);
  t2(k) = cputime-t0;
  % Berechnung 3
  t0 = cputime;
  dreiMatVelMul3(L,x);
  t3(k) = cputime-t0;
end

% getrennt
figure
subplot(311)
plot(t1);
subplot(312)
plot(t2);
subplot(313)
plot(t3);
% zusammen
figure
hold on
plot(t1,'r');
plot(t2,'g');
plot(t3,'b');
legend('Methode1','Methode2','Methode3');


Ob du das jetzt mit verbundenen Linien oder Punkten zeichnest, sei dir überlassen.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2008, 17:54     Titel:
  Antworten mit Zitat      
dib0r hat Folgendes geschrieben:
Hallo,

1.
Zitat:
Verwenden Sie dazu keine if-Abfrage, sondern wählen Sie angepaßte Grenzen für die Laufvariablen der Schleifen.
Das machst du ja nicht wirklich Smile



War ein Denkfehler von mir Wink Ist mir heute früh auch aufgefallen Wink

Erstmal vielen Dank für deine Antwort, hat mir sehr geholfen!

Ich habe jetzt für Teilaufgabe 2 folgenden Code:

Code:
N = 100;
t1 = nan(N,1);
t2 = nan(N,2);
t3 = nan(N,3);

for k=1:N
  L = rand(k);
  x = rand(k,1);
  % Berechnung 1
  t0 = cputime;
  Lx = dreiMatVecMul1(L,x);
  t1(k) = cputime-t0;
  % Berechnung 2
  t0 = cputime;
  Lx = dreiMatVecMul2(L,x);
  t2(k) = cputime-t0;
  % Berechnung 3
  t0 = cputime;
  Lx = dreiMatVecMul3(L,x);
  t3(k) = cputime-t0;
end

% Grafische Darstellung
figure
hold on
plot(t1,'r');
plot(t2,'g');
plot(t3,'b');
legend('Methode1','Methode2','Methode3');


Leider schreibt er "Methode 3" aus einem mir nicht nachvollziehbaren Grund nicht in das Diagramm?!

Dann hab ich noch 2 Fragen Wink

1) Was genau ist die Anweisung "t1 = nan(N,1)" ? So ganz versteh ich das noch nicht Sad

2) Wenn ich das Programm ausführe, dann zeigt mir Octave folgendes an (während er rechnet):
http://img47.imageshack.us/img47/6370/fehlertr8.jpg

Ist das eine Fehlermeldung bzw. welche "ungültigen Punkte" überspringt er da?


Aber sonst läuft es rund Wink

Gruß und Danke noch einmal,
tycro
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2008, 19:10     Titel:
  Antworten mit Zitat      
Hi,

erstmals
Code:

t1 = nan(N,1);
t2 = nan(N,2);
t3 = nan(N,3);
bitte ändern in
Code:

t1 = nan(N,1);
t2 = nan(N,1);
t3 = nan(N,1);
War ein Fehler meinerseits Embarassed

Code:
erzeugt eine Matrix der Dimension MxN und füllt alle Werte mit NaNs (Not a Number). Ähnlich den Befehlen
Code:
NaNs deshalb, weil ich mit "zeros" ja nicht unterscheiden kann ob es da einen Fehler gab oder ob die Laufzeit wirklich 0 Zeit gedauert hat. Ausserdem werden NaNs nicht geplottet, d.h. Einträge, die aus irgendeinem Grund nicht gesetzt werden, scheinen in Diagrammen nicht auf.

Das mache ich damit Matlab in der Schleife keine Zeit benötigt, um den Zeitvektor zu vergrößern (=Speicher allozieren). Du willst ja deine Berechnungen so schnell wie möglich machen Smile

Ich habe leider kein Octave, aber es scheint dass Octave mit einer Berechnung Schwierigkeiten hat - d.h. die Daten enthalten nur NaNs. Da Octave NaNs nicht plottet, kann natürlich für diesen Eintrag auch keine Legende erstellt werden. Was steht in den drei Vektoren t1, t2 und t3 drin? Falls irgendwo nur NaNs auftauchen, muss da was in der Berechnung von "cputime" schief gelaufen sein.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.11.2008, 19:47     Titel:
  Antworten mit Zitat      
Hi,

danke Wink Nachdem ich die t - Vektoren geändert habe, funktioniert es wunderbar !

Hier mal die zwei Diagramme für N=100

http://img227.imageshack.us/img227/8175/diagramm1ga9.jpg

http://img221.imageshack.us/img221/3034/diagramm2pf1.jpg


Bei Methode 1 würde dies ja heißen, dass Octave immer schneller rechnet oder?


Nochmal ein ganz großes Dankeschön an Dich ! Hast mir wirklich extrem geholfen Wink

Viele Grüße,
tycro
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.11.2008, 12:02     Titel:
  Antworten mit Zitat      
Hallo,

hm.. das kann mit "cputime" zu tun haben. Ich habe das bei mir mal getestet, und von 500 haben 492 den Wert 0.
Zitat:
Although it is possible to measure performance using the cputime function, it is recommended that you use the tic and toc functions for this purpose exclusively. It has been the general rule for CPU-intensive calculations run on Windows machines that the elapsed time using cputime and the elapsed time using tic and toc are close in value, ignoring any first time costs. There are cases however that show a significant difference between these two methods. For example, in the case of a Pentium 4 with hyperthreading running Windows, there can be a significant difference between the values returned by cputime versus tic and toc.


Es wird also empfohlen, statt "cputime" tic und toc zu verwenden.
Code:
t0 = tic;
[...]
t1(i) = toc;


Kommen da erwartungstreuere Werte raus?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.11.2008, 15:11     Titel:
  Antworten mit Zitat      
Hi,


also ich habe das jetzt noch einmal mit tic und toc versucht. Weiß nur nicht genau, ob ich das mit dem tic Befehl so richtig gemacht habe. Methode 1 zeigt immernoch komische Werte.

Beispiel für N=100, jetzt aber mit tic und toc:

Code:

N = 100;
t1 = nan(N,1);
t2 = nan(N,1);
t3 = nan(N,1);

for k=1:N
  L = rand(k);
  x = rand(k,1);
  % Berechnung 1
  tic;
  Lx = dreiMatVecMul1(L,x);
  t1(k)=toc;
 
 % Berechnung 2
  tic;
  Lx = dreiMatVecMul2(L,x);
  t2(k)=toc;
   
  % Berechnung 3
  tic;
  Lx = dreiMatVecMul3(L,x);
  t3(k)=toc;
 
end

%Grafische Darstellung
% Darstellung 1 - in getrennten Diagrammen
figure
subplot(311)
plot(t1,'r');
legend('Methode1');
subplot(312)
plot(t2,'g');
legend('Methode2');
subplot(313)
plot(t3,'b');
legend('Methode3');


% Darstellung 2 - in einem gemeinsamen Diagramm
figure
hold on
plot(t1,'r');
plot(t2,'g');
plot(t3,'b');
legend('Methode1','Methode2','Methode3');
 


Die entsprechenden Grafiken:

http://img88.imageshack.us/img88/1265/bild1dp1.jpg
http://img88.imageshack.us/img88/8688/bild2yt4.jpg


Problem bei der ganzen Sache ist nur, dass wir das mit cputime lösen sollen! Denkst du dass es auch an meinem Rechner liegen kann? Ich benutze dafür meinen Laptop (P4 - 1,8Ghz - 256MB RAM). Alternativ könnte ich es auch mal an meinem Rechner versuchen (P4 - 2,4 GHz - 1,5 GB RAM).

Grüße,
tycro
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 12:06     Titel:
  Antworten mit Zitat      
Hallo,

die Verwendung von tic und toc ist so richtig. Ich habe eigentlich noch nie Laufzeitmessungen verwendet bzw. verglichen und kann deshalbt nur das zitieren, was in der Matlab-Hilfe steht (dass tic-toc besser ist als cputime). Bei mir liefert t1 allerdings eine recht schöne Kurve, sieht sehr exponentiell bzw. quadratisch aus.

Was genau steht denn in t1 drin? Sind da Nullen drin oder NaNs (ist leider aus dem Plot nicht ersichtlich)?

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 12:33     Titel:
  Antworten mit Zitat      
Hi,

also mit der Verwendung von cputime steht in t1 folgendes:

0.040058 und die restlichen sind 0


mit tic und toc:

1.2877e-001
3.7343e-002
1.7190e-004
1.5903e-004
1.5998e-004
1.6594e-004
1.6403e-004
1.5998e-004
1.6689e-004
3.6001e-004


Bekommst du die Kurve mit tic-toc oder mit cputime raus?
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 13:18     Titel:
  Antworten mit Zitat      
Hallo,

ich nehm die Kurven mit tic und toc, weil cputime bei mir sehr viele Werte mit Nullen enthält (da seh ich irgendwie keine Abhängigkeit von der Matrixgröße).
Versuch mal N = 500 zu wählen. Kommen da plausible Werte für die Berechnung raus? Ich kann mir das irgendwie nicht erklären - in Matlab scheint das ganze zu funktionieren.

Wenn du in den Plot reimzoomst, kannst du da zumindest eine "richtige" Tendenz feststellen? Es scheint ja dass Octave bei den ersten 3-4 Berechnungen ziemlich lange benötigt.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 16:10     Titel:
  Antworten mit Zitat      
Ich habe es jetzt mal mit N=500 versucht. Habe aber cputime benutzt, da wir es mit diesem Befehl lösen sollen!


Die Werte für Methode 1 sind sehr komisch und für mich nicht nachvollziehbar!

http://img171.imageshack.us/img171/5598/500bild1fc4.jpg

Die "Berge" wiederholen sich und sin jeweils gleichgroß. Eine Tendenz ist nicht erkennbar!

Ich werde die ganze Sache jetzt nochmal mit tic-toc versuchen. Ergebniss wird aber noch etwas auf sich warten lassen, da die Berechnung doch sehr zeitaufwendig ist!

Gruß,
tycro
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 18:29     Titel:
  Antworten mit Zitat      
Hier die Ergebnisse mit tic und toc:

http://img219.imageshack.us/img219/574/tic5001po7.jpg
http://img377.imageshack.us/img377/7648/tic5002nn8.jpg
Private Nachricht senden Benutzer-Profile anzeigen
 
dib0r
Forum-Guru

Forum-Guru


Beiträge: 413
Anmeldedatum: 09.05.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 19:50     Titel:
  Antworten mit Zitat      
Hallo,

die Tendenz ist mit tic-toc einigermaßen sichtbar (zoom mal horizontal etwas rein und vernachlässige die ersten paar Werte). Allerdings scheint es so dass er für die ersten Werte verhältnismäßig lang braucht. Keine Ahnung warum (unter Matlab bzw. auf meinem Arbeitsrechner sieht das bei mir eigentlich so wie erwartet aus).

Ich kann nur spekulieren warum cputime nicht richtig funktioniert. Es kann sein dass cputime nur 0.01 Sekunden auflösen kann (oder dein Rechner) - warum auch immer. Dass die Frequenz der "Berge" zum Schluss hin zunimmt liegt dann daran, dass die Berechnungen etwas länger dauern und deshalb die Möglichkeit zunimmt, dass während der Berechnung ein Taktwechsel oder so ähnlich stattfindet.

MfG
Private Nachricht senden Benutzer-Profile anzeigen
 
tycro
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 26.11.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.12.2008, 21:26     Titel:
  Antworten mit Zitat      
Ok danke. Ich muss es morgen abgeben, mal schauen wie das dann korrigiert wird. Wenn du willst/Interesse hast, dann kann ich dir die Lösung des Problems gerne zukommen lassen.

Wir hatten das Script heute auch mal auf einem anderem Rechner laufen lassen - selbes Ergebniss. Also entweder hat Octave da ein Problem, oder zwei Rechner auf einmal. Wobei ich auch eher vermute, dass der PC schuld ist.

Trotzdem 1000 Dank, hast mir sehr geholfen Wink

Beste Grüße,
tycro
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 - 2024 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.