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

Matrizenaddition

 

markomore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 10:33     Titel: Matrizenaddition
  Antworten mit Zitat      
Hallo Matlab-Forum Smile
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 Wink
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!

matlab111.jpg
 Beschreibung:

Download
 Dateiname:  matlab111.jpg
 Dateigröße:  34.83 KB
 Heruntergeladen:  401 mal


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.11.2015, 10:36     Titel:
  Antworten mit Zitat      
Hallo,

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.

Zur Zeitmessung helfen tic und toc .

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 10:47     Titel:
  Antworten mit Zitat      
Okay, damit ist mir der Sinn schonmal klar.
Nur wie verpacke ich das jetzt in eine weitere for-Schleife?
Code:
%
for j=1:10
    n = 2^j;
    A = rand(n,n);
    B = rand(n,n);
for g=1:n
for h=1:n
    C(g,h) = A(i,j) + B(i,j)
end
end
end  


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 Confused
 
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.11.2015, 10:52     Titel:
  Antworten mit Zitat      
Hallo,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
markomore

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 11:46     Titel:
  Antworten mit Zitat      
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.

Edit:
Es muss natürlich
Code:

 for g=1:n
for h=1:n
sein.
 
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.11.2015, 12:13     Titel:
  Antworten mit Zitat      
Hallo,

was heißt "einigermaßen klappen" und "nicht mehr klappen" genau?

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 12:17     Titel:
  Antworten mit Zitat      
Also für j = 0,1,2:

Code:

for j=0:2
    n = 2^j;
    A = rand(n,n)
    B = rand(n,n)
for g=1:n
for h=1:n
    C(g,h) = A(g,h) + B(g,h);
end
end
    C
end
 


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.
 
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.11.2015, 12:20     Titel:
  Antworten mit Zitat      
Hallo,

wenn ich deinen Code ausführe, bekomme ich der Reihe nach
1x1 - Matrizen A, B, C
2x2 - Matrizen A, B, C
4x4 - Matrizen A, B, C

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 12:28     Titel:
  Antworten mit Zitat      
Komisch!
A =

0.6263


B =

0.6967


C =

1.3230 1.2705 1.1920 0.7407
1.1299 0.7859 1.1193 0.9106
1.3977 1.1675 0.5582 1.8949
1.6062 0.3437 1.8820 0.5056


A =

0.1892 0.5364
0.7852 0.2280


B =

0.5688 0.9464
0.3498 0.8381


C =

0.7580 1.4828 1.1920 0.7407
1.1350 1.0660 1.1193 0.9106
1.3977 1.1675 0.5582 1.8949
1.6062 0.3437 1.8820 0.5056


A =

0.3964 0.7184 0.6970 0.3846
0.9674 0.9267 0.0769 0.5863
0.5270 0.1171 0.5377 0.3015
0.7590 0.7534 0.7993 0.3919


B =

0.8143 0.1768 0.4594 0.1286
0.5507 0.5117 0.1912 0.9562
0.8675 0.8412 0.4281 0.7387
0.6700 0.7378 0.5283 0.7005


C =

1.2108 0.8952 1.1564 0.5132
1.5180 1.4384 0.2681 1.5425
1.3945 0.9583 0.9659 1.0402
1.4290 1.4913 1.3276 1.0924

So sah es bei mir beim letzten Ausführen aus...
 
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.11.2015, 12:33     Titel:
  Antworten mit Zitat      
Hallo,

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:

Code:


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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2015, 16:34     Titel:
  Antworten mit Zitat      
Oh ein wunderbarer Anfängerfehler Very Happy Habe es nun so geschrieben und C als Ausgabe rausgenommen, da dies ja nicht gefordert ist.

Code:
for j=0:2
    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
end


Und insgesamt, um beide Varianten in ein Programm zu packen:

Code:

clear all;
% 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?
 
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.11.2015, 17:19     Titel:
  Antworten mit Zitat      
Hallo,

du musst dir von toc die Zeitmessung zurückgeben lassen und das in einem Vektor speichern, siehe die zugehörige Dokumentation oder andere Beiträge, z.B.
http://www.gomatlab.de/achsenskalierung-matlab-t39219.html

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

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2015, 00:08     Titel:
  Antworten mit Zitat      
Code:
clear all;
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?
 
Harald
Forum-Meister

Forum-Meister


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

relevante Befehle:
Code:

Code:


Grüße,
Harald
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.