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

Bestimmte Anzahl an Werten beibehalten

 

qoob
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 16.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2011, 11:00     Titel: Bestimmte Anzahl an Werten beibehalten
  Antworten mit Zitat      
Hallo Leute ich bins wieder mal Smile

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:
Code:

for i=1:100000

matrix(1,:)=[];
matrix(end,:)=[];

i=i+1;

end
 


Er rechnet zieeeeemlich lang...gibts da eine schnellere Variante? Wäre echt nett!

Mfg qoob
Private Nachricht senden Benutzer-Profile anzeigen


Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.05.2011, 12:56     Titel:
  Antworten mit Zitat      
So sollte es etwas schneller gehen:
Code:


matrix(1:100000)=[];
matrix(end-99999:end)=[];
 
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 25.05.2011, 01:08     Titel: Re: Bestimmte Anzahl an Werten beibehalten
  Antworten mit Zitat      
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.

Code:
matrix = matrix(100001:end-100000);

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