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

Muss man einen Array mit fester Größe anlegen?

 

Motu
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2015, 21:27     Titel: Muss man einen Array mit fester Größe anlegen?
  Antworten mit Zitat      
Hallo Zusammen,

ich habe eine ganz dumme Frage:
Wenn ich möchte, dass meine Funktion in Matlab einen array ausgibt, muss ich in dieser Funktion ein "leeres" Array erzeugen, in den nachher die richtigen Werte eigetragen werden?
Als einfaches Beispiel:
ich habe die Matrix 3x10.
meine Funktion soll zu jedem Spaltenvektor die Norm berechnen. Als Ergebnis möchte ich einen Array mit 10 Werten bekommen.
ich hätte es so gemacht:
Code:
function array = f(Matrix)
n=size(Matrix,2);
array=ones(1,10); %--> MUSS MAN DAS MACHEN ODER NICHT?
for i=1:n
array(i)=norm(Matrix(:,i);
end
array;

Danke und Grüße
Motu
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.07.2015, 22:57     Titel:
  Antworten mit Zitat      
Hallo,

man muss es nicht machen, es ist aber eine gute Programmierpraxis. Es sieht hier sinnvoller aus, mit
Code:

vorzubelegen.

Die letzte Zeile
Code:

ist unnötig.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 15.05.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.07.2015, 23:50     Titel:
  Antworten mit Zitat      
Danke für die Antwort. Kann eine solche Vordefinition sich irgendwie negativ auf die Laufzeit auswirken?
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.07.2015, 00:07     Titel:
  Antworten mit Zitat      
Nein, es ist genau anders herum. Wenn Du ein Array in Matlab größer machst, indem Du hinten einen neuen Eintrag dran hängst, kann es passieren, dass Matlab das ganze Array an eine neue Stelle im Speicher verschieben muss, weil hinter dem letzten Wert kein Platz mehr für einen weiteren Wert ist. Wenn Du den Speicher für alle Daten schon vorher belegst, ist der Platz für den neuen letzten Wert schon vorher reserviert und das umkopieren entfällt. Das kann bei großen Arrays eine ganze Menge Zeit sparen.
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: 26.07.2015, 00:30     Titel: Re: Muss man einen Array mit fester Größe anlegen?
  Antworten mit Zitat      
Hallo Motu,

Das Array vor der Schleife zu erzeugen hat einen sehr großen Vorteil: Der Speicher ist gleich mit einem Mal allociert. Wenn man das nicht macht, wird in der ersten Iteration ein Array mit einem Element erzeugt. In der zweiten Iteration wir ein neues Array erzeugt mit 2 Elementen und die vorherigen Elemente kopiert und der Speicher des alten Arrays wieder freigegeben.
Bei 10 Elementen wird das kaum messbar sein, aber je größer das Array wird, desto deutlicher wird das Problem: Bei 1000 Elementen werden vom Betriebssystem Speicher nicht für 1000, sondern für sum(1:1000) doubles angefordert, also 4'004 kB, und fast genauso viele Bytes kopiert.
Das Problem ist bei Programmierern auch bekannt als "schlemiel the painter".

Nun versucht Matlab's JIT-Acceleration die Effekte durch eine fehlende "Pre-Allocation" so gut es geht zu vermeiden, indem es automatisch den benötigten Speicher alloziert. Das funktioniert aber nur, wenn eindeutig erkannt wird, wie groß das Array denn sein wird.

Code:
n = 1e5;
tic;
for k=1:n
   a(k) = k;
end
toc
% Elapsed time is 0.042232 seconds.

tic;
b = zeros(1, n);
for k=1:n
   b(k) = k;
end
toc

% Elapsed time is 0.001340 seconds.
 

Die Pre-Allocation macht den Code 30 mal schneller. Je größer n ist, desto stärker wird der Effekt.

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.