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.
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
Reik
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.02.2012, 12:11
Titel:
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?
Also wenn das die Indizien-Spalten sind?
Sind sie wirklich so nummeriert wie in deinem Beispiel?
Reik
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 16.02.2012, 16:58
Titel:
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*
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: ---
Verfasst am: 17.02.2012, 09:21
Titel:
Ah - Humbug, er ruft die Werte ja dann separat nochmal auf. Ich lasse es mal durchlaufen... bin gespannt.
Ah - Humbug, er ruft die Werte ja dann separat nochmal auf. Ich lasse es mal durchlaufen... bin gespannt.
Richtig erkannt, du findest je über FIND alle Werte, und ersetzt diese, also
ist es besser das nur einmal zumachen und nicht wiederholt
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
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.