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

große matrix zerlegen

 

sbmiles21
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 16.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2012, 10:48     Titel: große matrix zerlegen
  Antworten mit Zitat      
Hallo,

gibt es eine schnelle Möglichkeit eine Matrix mit 2Mio. rows schnell in 2 Matrizen zu zerlegen?
Prob.: Ich muss diese Matrix in excel speichern.

Excel2007 kann jedoch pro sheet nur 1Mio Zeilen verarbeiten.

Wollte nun die 2Mio. Matrix in 2 x 1Mio Matrizen teilen und diese dann seperat in 2 Excel Dateien speichern.

Mein Code sieht so aus:
Code:


 le=length(b.energy2);

    if le>1048576  %Excel 2007 max rows
   
        for y=1:1048575
            y
            b.energy2_safe_1(y,:)=b.energy2(y,:);
        end
        for y2=1048575:le
             y2
             b.energy2_safe_2(y,:)=b.energy2(y,:);
        end

....dann speichern via xlswrite
 


Dauert jedoch zu lange Sad
Hat jemand einen Tip?Vielleicht sowas wo man nicht jede einzelne Zeile via Schleife durchlaufen muss?


Danke

Gruss
Private Nachricht senden Benutzer-Profile anzeigen


Kascho
Forum-Century

Forum-Century


Beiträge: 195
Anmeldedatum: 24.03.10
Wohnort: Jena
Version: R2008b ... :(
     Beitrag Verfasst am: 02.07.2012, 11:08     Titel:
  Antworten mit Zitat      
Hallo sbmiles,

Denke nicht das du die Schleifen brauchst, Versuch mal was in diese Richtung:

Code:

m=[1 2 3 4 5 6 7 8 9 0];
le=length(m);
if le>5
m1=m(1:le/2);
m2=m(le/2+1:le);
end
 


Das funktioniert für eine Gerade Anzahl von Elementen in m. Für eine ungerade Anzahl muss wohl noch etwas an dem index geschraubt werden.

Gruß, Kascho
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: 02.07.2012, 15:25     Titel: Re: große matrix zerlegen
  Antworten mit Zitat      
Hallo sbmiles21,

Dein Code ist ein schönes (und seltenes!) Beispiel für wirklich langsame Schleifen in Matlab. Allerdings ist das Schreiben des aktuellen Wertes mit "y" bzw "y2" bereits eine der Haupt-Zeitverschwender. Zudem fehlt die Pre-allocation. Das bedeutet, dass Matlab zunächst ein [1x1] Array erzeugt, dann in der nächsten Iteration ein [1x2] Array und das erste Element kopiert, dann ein [1x3] Array und die ersten beiden Elemente kopiert etc. Insgesamt wird deshalb von Betriebssystem nicht Speicher für 1048575 Elemente angefordert, sondern für SUM(1:1048575), fast ebensoviele Elemente werden zwischenzeitlich umherkopiert. Klar, dass das lange braucht, oder?

Deine zweite Schleife hat 2 Bugs: 1, Das Element 1048575 wird bereits in der ersten Schleife behandelt, 2. "b.energy2_safe_2(y, :)" beginnt beim element 1048575 und füllt alles davor mit Nullen auf - danach ist das Array wieder zu groß.

Besser:
Code:
le = size(b.energy2, 1);  % Sicherer als LENGTH
if le > 1048576  %Excel 2007 max rows
  b.energy2_safe_1 = zeros(1048575, size(b.energy2, 2));  % Pre-allocate!
  for y=1:1048575
    b.energy2_safe_1(y,:) = b.energy2(y,:);
  end

  final = le - 1048575;
  b.energy2_safe_2 = zeros(final, size(b.energy2, 2));  % Pre-allocate!
  for y2 = 1:final  % Nicht 1047575:le !!!
    b.energy2_safe_2(y, : ) = b.energy2(y + 1048575, :);
  end
end

Das wäre schonmal deutlich schneller. Matlab kann aber, wie Kascho schon angedeutet hat, die Kopie viel schneller "vektorisiert" erzeugen:
Code:

le = size(b.energy2, 1);  % Sicherer als LENGTH
if le > 1048576  %Excel 2007 max rows
  b.energy2_safe_1 = b.energy2(1:1048575, :);
  b.energy2_safe_2 = b.energy2(1048576:end, :);
end

Und das ist dann knackig, oder? Ich mag Matlab für solche kompakten Ausdrücke.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 68
Anmeldedatum: 16.02.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.07.2012, 16:31     Titel:
  Antworten mit Zitat      
geile Sache !

Ich danke euch!
Manman das man nicht selber drauf kommt ;( , aber da fehlt wohl die Erfahrung

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