Verfasst am: 03.08.2019, 13:52
Titel: Plot dauert zu lange
Hallo. Ich habe ein Problem mit dem folgenden Plot:
Code:
tic
A=[00;1010;200];
S=[00];
hold on
plot(S(1),S(2),'rx');
plot(A(1,1),A(1,2),'bo');
plot(A(2,1),A(2,2),'bo');
plot(A(3,1),A(3,2),'bo');
for i=1:5000
a=random('unid',3);
B=A(a,:);
S=(S+B)/2;
plot(S(1),S(2),'k');
end toc
Wie man leicht an der gemessenen Zeit erkennen kann, dauert diese Berechnung mit dem entsprechenden Plot sehr lange. Ich habe auch mal den Versuch gemacht und das plot(...) innerhalb der Schleife auskommentiert. Dann arbeitet er sehr schnell. Wenn ich diesen Teil hinter die Schleife ziehe, dann plottet er aber nur den letzten Punkt, statt allen entstandenen.
Wie kann ich es also realisieren, dass das geforderte Sirpinsky-Dreieck entsteht, aber er trotzdem schneller arbeitet?
PS.: Vielleicht ist die Information wichtig, dass ich mit Octave arbeite. Ich habe dieses Thema aber hier verfasst, da es ja zum einen konkret um eine Grafik geht und zum anderen habe ich (aus Erfahrung) die Hoffnung, dass ich hier schneller eine Antwort bekomme als in der Octave-Kategorie.
Verschoben: 04.08.2019, 15:18 Uhr von Jan S Von Grafiken und Plots nach Octave-Forum
Verfasst am: 04.08.2019, 15:28
Titel: Re: Plot dauert zu lange
Hallo ThoRie,
Bitte poste Fragen zu Octave in der Kategorie "Octave". Die Laufzeit des Codes hängt entscheidend davon ab, mit welcher Software man sie berechnet. Du fragst speziell nach Octave, also bringt es nichts, das für Matlab zu optimieren. Danke!
In Matlab ist die Beschleunigung einfach:
Code:
tic
A = [00;1010;200];
S = zeros(5000, 2);
hold on
plot(S(1),S(2),'rx');
plot(A(1,1),A(1,2),'bo');
plot(A(2,1),A(2,2),'bo');
plot(A(3,1),A(3,2),'bo');
for i = 2:5000% [EDITED, start at 2, not at 1]
a = randi(3); % random('unid',3);
B = A(a,:);
S(i, :) = (S(i-1, :) + B) / 2;
end plot(S(:, 1), S(:, 2), 'k.');
toc
Man zieht also den zeitaufwändigen
plot
Befehl aus der Schleife raus. Schon komme ich auf etwa 0.2 Sekunden - in Matlab, ich habe kein Octave installiert.
Gruß, Jan
Zuletzt bearbeitet von Jan S am 20.08.2019, 13:22, insgesamt einmal bearbeitet
Ich habe es einmal versucht, ich musste ihm lediglich nur noch eine if-Schleife einbauen, da im ersten Fall ja i-1=-1 gelten würde und das geht bei Octave nicht.
Also sieht das lauffähige Beispiel für Octave jetzt wie folgt aus:
Code:
tic
A = [00;1010;200];
S = zeros(5000, 2);
hold on
plot(S(1),S(2),'rx');
plot(A(1,1),A(1,2),'bo');
plot(A(2,1),A(2,2),'bo');
plot(A(3,1),A(3,2),'bo');
for i = 1:5000 if i-1>0
a = randi(3); % random('unid',3);
B = A(a,:);
S(i, :) = (S(i-1, :) + B) / 2;
end end plot(S(:, 1), S(:, 2), 'k.');
toc
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.