Hallo Matlab-Forum
Ich steige neu in Matlab ein und brauche am Anfang etwas Hilfe. Dazu hänge ich die Aufgabe an und stelle meinen Anfang vom m.file hier hin. Mir ist nicht ganz klar, was damit gemeint ist, dass ich es einmal per for-Schleife und einmal mit dem Operator + machen soll, da mir nur die for-Schleife sinnvoll erscheint. Anschließend sollen wir noch die benötigte Zeit messen und diese plotten, womit ich bisher kaum Erfahrung habe, aber das bekommen wir sicherlich hin
Code:
% Das ist mein Programm bisher: for j=1:10
n = 2^j;
A = rand(n,n);
B = rand(n,n);
A + B;
end
Ich hoffe, dass ich es richtig verstanden habe, dass es egal ist, welche Werte die Matrizen annehmen (in diesem Fall ja nur zufällige im Intervall [0,1]).
So würde ich zunächst einmal lediglich mit der Matrizenaddition starten und nun bräuchte ich Verbesserungs- sowie Ergänzungsvorschläge.
Vielen Dank!
in deinem Code verwendest du in "A+B" die Matrixaddition, d.h. MATLAB addiert automatisch die entsprechenden Elemente.
Das soll nun verglichen werden mit einer (weiteren) doppelten for-Schleife über alle Elemente - so wie man das in Sprachen wie C üblicherweise schreiben würde.
Sinn der Übung wird sein festzustellen, dass die Matrixaddition deutlich schneller ist als die doppelte for-Schleife. Bei der Programmierung in MATLAB sollte man also darauf achten, zeitintensive for-Schleifen nach Möglichkeit durch Matrixoperationen zu ersetzen.
Das sieht mir schon zu kompliziert aus und wird auch nicht funktionieren, denn es sind A(i,j) sowie B(i,j) ja nicht korrekt.. Also stehe dabei echt etwas auf dem Schlauch
sieht doch schon ganz gut aus. Jetzt brauchst du nur noch statt i und j die korrekten Indizes verwenden: C(g, h) soll ja aus den entsprechenden Elementen von A und B berechnet werden.
Grüße,
Harald
markomore
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 05.11.2015, 11:46
Titel:
Code:
for j=0:2
n = 2^j;
A = rand(n,n)
B = rand(n,n) for g=0:n
for h=0:n
C(g,h) = A(g,h) + B(g,h);
end end end
Ich hatte es jetzt einmal so für den Fall n = 2 probiert. Ich hatte zunächst vergessen, dass j bei 0 starten soll. Bei j=1:2 klappte es noch einigermaßen, bei j=0:2 nun nicht mehr.. Für j=1:2 war die Addition der 2x2-Matrizen nicht richtig ausgeführt, die der 4x4-Matrizen allerdings schon.
C für j=0 und j=1 sind schon 4x4-Matrizen, obwohl ich mir dort ja eine "1x1"- bzw. 2x2-Matrix wünschen würde. Habe auch probiert C an verschiedenen Stellen ausgeben zu lassen, führte aber zu keinem besseren Ergebnis.
bei wiederholtem Ausführen kein Wunder, da du ja vom vorherigen Durchlauf noch eine 4x4-Matrix hast und nur bestimmte Elemente überschreibst.
Entweder also vor dem Ausführen des Codes mit
clear
den Workspace aufräumen oder (besser) die Matrix mit Nullen vorbelegen:
Und insgesamt, um beide Varianten in ein Programm zu packen:
Code:
clearall;
% Teil 1: Addition mit Operator + for j=0:10 tic;
n = 2^j;
A = rand(n,n);
B = rand(n,n);
A + B;
toc;
end
% Teil 2: Addition mit for-Schleife for j=0:10 tic;
n = 2^j;
A = rand(n,n);
B = rand(n,n);
C= zeros(size(A));
for g=1:n
for h=1:n
C(g,h) = A(g,h) + B(g,h);
end end toc;
end
So sollte das mit der Zeitmessung korrekt sein, oder? Nun stellt sich mir noch die Frage, wie ich die gemessenen Zeiten als 2 Graphen in einem Plot darstelle. Definiere ich die gemessenen Zeiten als Vektoren und gebe diese dann aus?
clearall;
time1=zeros(11,1);
time2=zeros(11,1);
% Teil 1: Addition mit Operator + for j=0:10 tic;
n = 2^j;
A = rand(n,n);
B = rand(n,n);
A + B;
time1(j+1,1)= toc;
end
% Teil 2: Addition mit for-Schleife for j=0:10 tic;
n = 2^j;
A = rand(n,n);
B = rand(n,n);
C= zeros(size(A));
for g=1:n
for h=1:n
C(g,h) = A(g,h) + B(g,h);
end end
time2(j+1,1) = toc;
end
So sieht mein Programm bisher nun aus, wobei time1 und time2 die jeweiligen Vektoren darstellen. Kannst du mir sagen, wie ich die beiden als Graph in einem gemeinsamen Plot darstelle? Und wie skaliere ich die Achsen logarithmisch?
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
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.