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

Arrays mit dynamischen Längen

 

senmeis
Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.04.2014, 16:49     Titel: Arrays mit dynamischen Längen
  Antworten mit Zitat      
Hi,

wie können Arrays erzeugt werden, derre Länge am Anfang noch nicht bekannt ist? Bisher habe ich so gemacht:

Code:

error = zeros(1);
error_num = 1;
for blabla
   if blabla
      error(error_num) = blabla;
      error_num = error_num + 1;
  end  
end
 


Gibt’s Risikos?

Gruss
Senmeis
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: 30.04.2014, 21:35     Titel: Re: Arrays mit dynamischen Längen
  Antworten mit Zitat      
Hallo senmeis,

"error" ist eine wichtige Matlab-Funktion. Eine Variable mit diesem Namen zu verwenden macht es unmöglich, diese Funktion noch aufzurufen. Dieses sog. Shadowing ist deshalb eine schlechte Idee.

Das gezeigte iterative Vergrößern eines Vektors ist kein Problem, so lange es sich um 10 oder 20 Elemente handelt. Wenn man aber ein Programm schreibt, ist es immer sinnvoll es gleich so zu designen, dass es auch mit 1000 oder einer Millionen Elementen gut läuft. Und hier gibt es ein ernstes Problem:
In jeder Iteration wird ein neuer Vektor erzeugt und die alten Werte werden kopiert. Dafür müssen etwa 100 Bytes für den Header reserviert werden und 8 Bytes pro Element. Wenn der Vektor zum Schluß 10'000 Elemente enthält, werden zwischendurch vom Betriebssystem reserviert:
Code:
sum((1:10000) * 8 + 10000 * 100)

Das sind 40005000000 Bytes, also 40 GB die das reserviert, gelöscht und kopiert werden. Und das ist für 10'000 Elemente ja ein ganz schöner Brocken, was das Programm sehr ausbremst.

Deshalb gibt es drei Strategien:
1. Man kennt vorher die Größe.
2. Man kennt eine maximale Größe.
3. Man allokiert den Speicher in Blöcken.

Fall 1 ist ja logisch. Pre-Allocation ist die beste Lösung.
Im zweiten Fall ist es immer noch besser, man reserviert zuerst mal 100'000 Elemente und schneidet hinterher wieder 10'000 davon heraus. Das macht dann 0.8MB an reserviertem Speicher, was im Vergleich zu 40 GB ziemlich harmlos ist.
Im 3. Fall vergrößert man den Vektor in Schritten von z.B. 10'000 Elementen. Dafür läuft ein zweiter Zähler mit, der testet, ob die bisherige Obergrenze schon erreicht ist. Damit hat man zwar immer noch das Problem der iterativen Vergrößerung, aber es ist um den Faktor 10'000 kleiner.

In der Informatik ist das Problem der iterativen Vergrößerung auch bekannt als Geschichte von "Shlemiel the painter".

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
senmeis
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 301
Anmeldedatum: 09.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2014, 16:18     Titel:
  Antworten mit Zitat      
Danke.

Senmeis
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.