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

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 15.05.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.07.2015, 21:27
Titel: Muss man einen Array mit fester Größe anlegen?
|
 |
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:
Danke und Grüße
Motu
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 25.07.2015, 22:57
Titel:
|
 |
Hallo,
man muss es nicht machen, es ist aber eine gute Programmierpraxis. Es sieht hier sinnvoller aus, mit
vorzubelegen.
Die letzte Zeile
ist unnötig.
Grüße,
Harald
|
|
|
Motu |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 14
|
 |
|
 |
Anmeldedatum: 15.05.15
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 25.07.2015, 23:50
Titel:
|
 |
Danke für die Antwort. Kann eine solche Vordefinition sich irgendwie negativ auf die Laufzeit auswirken?
|
|
|
Epfi |

Forum-Meister
|
 |
Beiträge: 1.134
|
 |
|
 |
Anmeldedatum: 08.01.09
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 26.07.2015, 00:07
Titel:
|
 |
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.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 26.07.2015, 00:30
Titel: Re: Muss man einen Array mit fester Größe anlegen?
|
 |
|
 |
|
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.
Die Pre-Allocation macht den Code 30 mal schneller. Je größer n ist, desto stärker wird der Effekt.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
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
| 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.
|
|