|
|
Bestimmte Anzahl an Werten beibehalten |
|
qoob |

Forum-Newbie
|
 |
Beiträge: 4
|
 |
|
 |
Anmeldedatum: 16.05.11
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2011, 11:00
Titel: Bestimmte Anzahl an Werten beibehalten
|
 |
Hallo Leute ich bins wieder mal
Hätte eine Frage und wollte wissen ob meine Problemlösung so funktionieren würde (bzw. obs eine bessere Methodik gäbe):
Ich habe einen ziemlich großen Vektor (393215x1) und ich möchte davon einen Wertebereich in der Mitte haben also ca. 190000 Werte...das heißt ich würde gerne 100000 Werte hinten und vorne wegkürzen...
Meine Idee wäre:
Er rechnet zieeeeemlich lang...gibts da eine schnellere Variante? Wäre echt nett!
Mfg qoob
|
|
|
|
|
Gast |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 24.05.2011, 12:56
Titel:
|
 |
So sollte es etwas schneller gehen:
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 25.05.2011, 01:08
Titel: Re: Bestimmte Anzahl an Werten beibehalten
|
 |
|
 |
|
Hallo qoob,
Ist Dir klar, warum die Schleife so langsam ist? Am Anfang hast Du einen (393215x1) Vektor im Speicher. In der ersten Iteration wird dann ein (393214x1) Vektor und danach ein (393213x1) Vektor im Speicher allociert und danach jeweils alle alten Werte in den neuen Vektor kopiert. Insgesamt muss Matlab also Speicher für 200.000 Vektoren besorgen. Das macht Matlab zwar möglichst geschickt, indem es immer neues RAM vom Betriebssystem anfordert, aber bei diesen Größenordnungen ist das RAM bald erschöpft. Dann müssen mot großem Aufwand die Speicherblöcke wieder freigegeben werden, die zwar belegt sind, aber nicht mehr benutzt werden. Zur Sicherheit überschreibt Matlab sie mit Nullen.
Das mach insgesamt:
sum(393213 - 200000 : 393213) * 8
>> 6.13e+10
Allocierte Bytes im RAM (ein DOUBLE hat 8 Byte) und doppelt so viele Schreib-Operationen. Nun kann Matlab beim Wehstreichen des hinteren Elements Zeit sparen, da es sich das Allocieren und Kopieren sparen kann. Und ein 64bit Rechner kann ein 8 Byte DOUBLE auch sehr effizient kopieren. Du kommst also auf nur etwa halb so viele tatsächlich ausgeführte Operationen... Dann kommt aber noch der Boudary-Check dazu: "matrix(1, :)" testet immer noch, ob "1" auch wirklich innerhalb der Grenzen der Dimension liegt. Das sind aber nur läppische 200.000 zusätzliche Tests.
Das allociert und kopiert 193213 Bytes. Matlab ist so schlau, dass es nur den ersten und letzten Wert der Index-Vektors einem Boundary-check unterzieht.
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.
|
|