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

Matrix von drei Dimensionen in zwei umbauen

 

Thomas K
Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.09.2012, 14:50     Titel: Matrix von drei Dimensionen in zwei umbauen
  Antworten mit Zitat      
Hallo,

habe wieder eine Frage zum Thema Code-Beschleunigen. Ich möchte eine dreidimensionale Matrix in eine zweidimensionale Matrix überführen, und dazu noch eine Kopfzeile und zwei Spalten beifügen. Bisher habe ich das mit dem Befehl cat() gelöst. Allerdings dauert das relativ lange (im folgenden Code für die angegebenen Test-Daten ca 5 - 6 Sekunden):

Code:

Daten = ones(250,250,200);
[sizeX sizeY sizeZ] = size(Daten);  

t = 0.05;
time = 0:t:(t*sizeZ);
xFix = (1:1:250);
yFix = (1:1:250);
Sheet = zeros(1,(sizeX+2));            
Sheet(1,3:end) = xFix;                  

for h=1:200
    Frame = zeros((sizeY),(sizeX+2));  
    Frame(:,1) = time(h);              
    Frame(:,2) = yFix;                  
    Frame = flipdim(Frame,1);
    Frame(:,3:end) = Daten(:,:,h);      
    Sheet = cat(1,Sheet,Frame);
end
 

Hat da jamand eine gute Idee? Vielen Dank und schöne Grüße,

Thomas
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: 20.09.2012, 18:49     Titel: Re: Matrix von drei Dimensionen in zwei umbauen
  Antworten mit Zitat      
Hallo Thomas,

Code:

Daten = ones(250,250,200);
[sizeX sizeY sizeZ] = size(Daten);  

t = 0.05;
time = 0:t:(t*sizeZ);
xFix = 1:250;
yFix = 1:250;
Sheet = zeros(1, (sizeX+2));            
Sheet(1, 3:end) = xFix;                  

Frame = zeros(sizeY, sizeX+2);  % Einmal vor der Schleife!
Frame(:, 2) = flipdim(yFix, 1);

for h = 1:200
    Frame(:, 1) = time(h);
    Frame(:, 3:end) = Daten(:,:, h);      
    Sheet = cat(1, Sheet, Frame);
end

Das ist auf meinem Rechner schonmal 4.5 mal schneller. Die Regel ist einfach: Bewege alle wiederholten Berechnungen vor die Schleife.

Noch effizienter wäre es, "Sheet" zunächst vollständig per ZEROS zu initialisieren und die Werte einzufügen.
Code:
n = 250;
Daten = ones(n, n, 200);
[sizeX sizeY sizeZ] = size(Daten);  

t = 0.05;
time = 0:t:(t*sizeZ);
xFix = 1:250;
yFix = 1:250;

Sheet2 = zeros(1 + 200 * sizeY, sizeX+2);
Sheet2(1, 3:end) = xFix;          
yFixF = flipdim(yFix, 1);

i1 = 2;
i2 = 2 + n - 1;
for h = 1:200
    Sheet2(i1:i2, 2)     = yFixF;
    Sheet2(i1:i2, 1)     = time(h);
    Sheet2(i1:i2, 3:end) = Daten(:, :, h);      
    i1 = i2 + 1;
    i2 = i2 + n;
end

Das ist bei meinem alten Testrechner dann 40 mal schneller als das Orginal.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 47
Anmeldedatum: 15.04.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.09.2012, 13:09     Titel:
  Antworten mit Zitat      
Hallo Jan,

vielen Dank. 40 mal schneller ist schon beachtlich, bei noch größeren Datenmengen ist der Unterschied noch deutlicher!

Schöne Grüße, Thomas.
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.