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

Berechnung der Anzahl der Operationen

 

bandchef
Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2011, 17:37     Titel: Berechnung der Anzahl der Operationen
  Antworten mit Zitat      
Hi Leute!

Gleich mal vorweg: ICH ERWARTE KEINE LÖSUNG DER AUFGABE SONDERN NUR EIN PAAR ANTWORTEN/TIPS AUF MEINE FRAGEN!


Ich hab hier folgende Aufgabe

Die beiden Matrizen A und B seien in Matlab mit einer vorgegebenen positiven ganzen Zahl
M folgendermaßen definiert: A = rand(M); B = rand(M);

(a) Berechnen Sie mit Matlab-Anweisungen die Produkte C = A'*B'*B*A und D = (B*A)'*(B*A)
stellen Sie dabei fest, wie viele Gleitpunktoperationen jeweils anfallen, wenn man die
beiden Formeln möglichst effizient auswertet. Geben Sie die Zahl der Gleitpunktoperationen
als Formel in Abhängigkeit von M an. Welche der beiden Matrizen C, D ist aufwändiger
zu berechnen?

(b) Theoretisch müsste C = D herauskommen. Überprüfen Sie mit Matlab-Anweisungen, mit
wie vielen Dezimalstellen die Koeffizienten der Matrizen C und D in etwa übereinstimmen.


Zu b)

Wie ich nun herausgefunden habe ergebn sich diese Anzahl von Flops:

Code:
Flops_C = 6*M^3


Code:
Flops_D = 4*M^3


Der Exponent ist mir klar. Das ist einfach die Zahl der im Code verwendeten Floatingpoint-Operationen, sprich die 3 Multiplikationen. Wie aber komm ich im Fall C auf den Vorfaktor 6 und im Fall D auf den Vorfaktor 4?
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: 27.12.2011, 18:50     Titel: Re: Berechnung der Anzahl der Operationen
  Antworten mit Zitat      
Hallo bandchef,

Die Aufgabe ist nicht wirklich sinnvoll.
Selbstverständlich kann man A'*B' geschickt und ungeschickt implementieren. Bei geschickter Implementierung benötigt A'*B' genauso viele Operationen wie A*B. Deswegen benötigen beide Ausdrücke auch die gleiche Rechenzeit in (modernen) Matlab(-Versionen).
Code:
M = 1000;
A = rand(M);
B = rand(M);
tic;
for i = 1:10
  C = A'*B'*B*A;
end
toc

tic;
for i = 1:10
  D = (B*A)'*(B*A);
end
toc

Falls wirklich 50% mehr Flops benötigt würden, wäre doch ein deutlicher Laufzeitunterschied zu bemerken.

Intern werden in Matlab BLAS-Funktionen aufgerufen. Und dabei kann man bei jeder Matrix-Multiplikation ein Flag übergeben, ob die jeweilige Matrix transponiert werden soll - eine explizite Transponierung findet dabei nicht statt! Deshalb benötigt man für beide Ausdrücke lediglich drei Matrix-Multiplikationen, die die Transposition berücksichtigen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
bandchef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 48
Anmeldedatum: 13.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.12.2011, 20:05     Titel:
  Antworten mit Zitat      
Danke für deine Antwort! Das hat mich schon mal sehr weitergebracht.

Wie aber kommt meine Lösung auf diese Ergebnisse Flops_C = 6*M^3 und Flops_D = 4*M^3?

Wie schon gesagt der Exponent ist mir klar, nicht aber die 6 bzw. die 4 als Vorfaktor!
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: 27.12.2011, 21:24     Titel:
  Antworten mit Zitat      
Hallo bandchef,

Man benötigt Integer-Multiplikationen für eine explizite Transposition und für die Schleifen zur Multiplikation.

Ein Detail habe ich übersehen: Für "(B*A)'*(B*A)" wird man "B*A" nur einmal berechnen und benötigt eine Transposition weniger. Also:
Code:
M = 1000;
A = rand(M);
B = rand(M);
tic;
for i = 1:10
  C = A'*B'*B*A;
end
toc

tic;
for i = 1:10
  T = B*A;
  D = T'*T;
end
toc

Damit hat man 3 Matrix-Multiplikationen im ersten Fall, aber nur 2 im zweiten.

Gruß, Jan
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.