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

Verarbeitung grosser Matrizen

 

Reik

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2012, 11:44     Titel: Verarbeitung grosser Matrizen
  Antworten mit Zitat      
Hallo liebe Forum-Leser Smile

Ich arbeite erst seit Kurzem mit Matlab und habe deswegen nicht gerade einen eleganten Code - was wahrscheinlich der Hauptgrund für mein Problem ist.

Ich habe zwei recht grosse Matritzen.
pc_raw = <2335837x12 double>
fw_raw = <45710728x5 double>

Jetzt möchte ich für jeden Wert aus Matrix1, Spalte 1 den entsprechenden (gleichen) Wert als Matrix2, Spalte 1 heraussuchen, die Zeile kopieren und in Matrix1 schreiben. An sich funktioniert das Ganze auch ganz wunderbar, aber es dauert ewig. Und nun meine Frage: Wie könnte ich das denn beschleunigen, geht es überhaupt (sicherlich ja)?

Mein Code sieht bis jetzt so aus:

Code:

for k=1:len_pc_raw
        pc_timestep = pc_raw(k,1);
        NaN_test = isnan(pc_raw(k,8));
        if NaN_test == 1
            pc_temp = find(pc_raw(:,1)==pc_timestep);
            fw_temp = find(fw_raw(:,1)==pc_timestep);
            len_pc_temp = length(pc_temp);
            len_fw_temp = length(fw_temp);
            if len_pc_temp <= len_fw_temp
                for j=1:len_pc_temp
                    pc_echo = pc_temp(j);
                    fw_echo = fw_temp(j);
                    % write new matrix
                    pc_raw(pc_echo,8) = fw_raw(fw_echo,1);  
                    pc_raw(pc_echo,9) = fw_raw(fw_echo,2);
                    pc_raw(pc_echo,10) = fw_raw(fw_echo,3);  
                    pc_raw(pc_echo,11) = fw_raw(fw_echo,4);  
                    pc_raw(pc_echo,12) = fw_raw(fw_echo,5);    
                end
            else
                for j=1:len_fw_temp
                    pc_echo = pc_temp(j);
                    fw_echo = fw_temp(j);
                    % write new matrix
                    pc_raw(pc_echo,8) = fw_raw(fw_echo,1);  
                    pc_raw(pc_echo,9) = fw_raw(fw_echo,2);  
                    pc_raw(pc_echo,10) = fw_raw(fw_echo,3);  
                    pc_raw(pc_echo,11) = fw_raw(fw_echo,4);  
                    pc_raw(pc_echo,12) = fw_raw(fw_echo,5);    
                end
            end
        end
    end
 


Für jeden Ratschlag bin ich sehr dankbar. Selbst wenn es nur kleine Verbesserungen sind... alles was mich von meinen jetzigen 2 Wochen Rechenzeit runterbringt ist mir sehr willkommen. Smile

Beste Grüsse,
Reik


Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 16.02.2012, 12:04     Titel:
  Antworten mit Zitat      
Abgesehen davon, dass dass numerische Vergleichen von DOUBLE Zahlen immer etwas riskant ist könnte ich mir vorstellen, dass es sinnvoll ist zuerst zu sortieren. SORT und SORTROWS können ja so verwendet werden, dass die ursprünglichen Indices erhalten bleiben. Aufgrund der Sortierung dürfte es möglich sein den Vergleich auf ein paar neben einander liegenden Werte zu beschränken anstelle alles zu durchsuchen-

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Reik

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2012, 12:11     Titel:
  Antworten mit Zitat      
Die Werte in der Indize-Spalte sind ja schon sortiert. Es sind Zeitwerte. Nur das eben in der einen Spalte deutlich mehr Werte enthalten sind... also so in der Art:

Matrix1:
1 3 5 7 9
Matrix2:
1 2 3 4 5 6 8 9 10

Würde eine Formatänderung zu Integer denn die Abfrage beschleunigen? Oder irgendein block-wise Vorgehen?

Daaanke! Smile

Reik
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.02.2012, 16:27     Titel:
  Antworten mit Zitat      
Also wenn das die Indizien-Spalten sind?
Sind sie wirklich so nummeriert wie in deinem Beispiel?
Private Nachricht senden Benutzer-Profile anzeigen
 
Reik

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.02.2012, 16:58     Titel:
  Antworten mit Zitat      
Es sind Zeitwerte im double - Format, welche aufsteigend sortiert sind. Jeder Wert in pc_raw kommt definitiv mind. 1 x auch in fw_raw vor.

Mal nebeneinander dargestellt:

pc_raw fw_raw

2 2
3 3
3 3
4 3
4 4
6 4
6 5
7 5
8 6
8 7

Mit "ismember" bekomme ich eine Zuweisung der einmal vorkommenden Werte, aber das hilft mir - im obigen Beispiel - bei den Werten 3 und 4 nicht weiter. Hum.

Momentan "schafft" Matlab ca. 100 000 Wertzuweisungen pro Stunde - und das geht sicherlich schneller, nur weiss ich einfach nicht, wie ich die ungeschickte for-Schleife umgehen kann. *seufz*
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.02.2012, 18:50     Titel:
  Antworten mit Zitat      
Hier eine kleine Vereinfachung, habe innere Schleife eliminiert

Code:

pc_raw      = nan(8,12);
fw_raw      = rand(10,5);
pc_raw(:,1) =  [2 3 3 4 4 6 6 7]';
fw_raw(:,1) =  [2 3 3 3 4 4 5 5 6 7]';


len_pc_raw  = size(pc_raw,1);
for k=1:len_pc_raw
   pc_timestep = pc_raw(k,1);
   %    NaN_test    = isnan(pc_raw(k,8));
   if isnan(pc_raw(k,8))
      pc_temp     = find(pc_raw(:,1)==pc_timestep);
      fw_temp     = find(fw_raw(:,1)==pc_timestep);
      len_pc_temp = length(pc_temp);
      len_fw_temp = length(fw_temp);
      min_val     = min(len_pc_temp,len_fw_temp);
      pc_temp     = pc_temp(1:min_val);
      fw_temp     = fw_temp(1:min_val);
      pc_raw(pc_temp,8:end) = fw_raw(fw_temp,:);
   end
end
 


Zuletzt bearbeitet von denny am 16.02.2012, 19:11, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 16.02.2012, 19:10     Titel:
  Antworten mit Zitat      
Hier eine weitere Vereinfachung,
jetzt läuft die Schleife nur einmal für jedes Timestamp


Code:

pc_raw      = nan(8,12);
fw_raw      = rand(10,5);
pc_raw(:,1) =  [2 3 3 4 4 6 6 7]';
fw_raw(:,1) =  [2 3 3 3 4 4 5 5 6 7]';


% len_pc_raw  = size(pc_raw,1);
NaN_test      = isnan(pc_raw(:,8));
pc_timesteps  = unique(pc_raw(NaN_test,1))';
for pc_ts = pc_timesteps

   pc_idx              = find(pc_ts == pc_raw(:,1));  
   fw_idx              = find(pc_ts == fw_raw(:,1));
   len_pc_idx          = length(pc_idx);
   len_fw_idx          = length(fw_idx);
   min_val             = min(len_pc_idx,len_fw_idx);
   pc_idx              = pc_idx(1:min_val);
   fw_idx              = fw_idx(1:min_val);
   pc_raw(pc_idx,8:12) = fw_raw(fw_idx,:);
   
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Reik

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2012, 08:45     Titel:
  Antworten mit Zitat      
Ui, vielen vielen Dank, dass hilft schon mal viel weiter!

Allerdings kann ich den NaN_test nicht aus der Schleife nehmen, da sich die Anzahl der NaNs ja während der Schleife verändern.

Also das Ganze sieht ja vereinfacht so aus (mal in Spalten geschrieben):

pc_raw
Spalte 1 Spalte 8
2 NaN
3 NaN
3 NaN
4 NaN
4 NaN
6 NaN
6 NaN
7 NaN

Dann sucht es für timestep 2 in fw_raw den entsprechenden Wert, findet einen Wert und überschreibt das NaN.

Dann sucht es für timestep 3 in fw_raw den entsprechenden Wert. Findet zwei entsprechende Werte in fw_raw und überschreibt für BEIDE timestep 3 Werte die NaNs

Somit überspringt es den 2. timestep 3 Wert, da ja in Spalte 8 kein NaN mehr vorhanden ist.

Danke Dir! Und deiner Geduld. :)
 
Reik

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.02.2012, 09:21     Titel:
  Antworten mit Zitat      
Ah - Humbug, er ruft die Werte ja dann separat nochmal auf. Ich lasse es mal durchlaufen... bin gespannt. Smile
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 17.02.2012, 10:21     Titel:
  Antworten mit Zitat      
Reik hat Folgendes geschrieben:
Ah - Humbug, er ruft die Werte ja dann separat nochmal auf. Ich lasse es mal durchlaufen... bin gespannt. Smile


Richtig erkannt, du findest je über FIND alle Werte, und ersetzt diese, also
ist es besser das nur einmal zumachen und nicht wiederholt
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.