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

Messwerte an doppelten Messpunkten mitteln

 

Hecki
Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2013, 15:24     Titel: Messwerte an doppelten Messpunkten mitteln
  Antworten mit Zitat      
Hallo zusammen!

Ich suche nach einer einfachen Möglichkeit eine Matrix von doppelten bzw. mehrfach aufgenommenen Messpunkten zu bereinigen und diese zu mitteln.

Beispiel:
M =
1 0 0 1.5678
1 2 3 5.2235
1 0 0 2.3400
1 2 5 6.7890

doppelt sind Zeilen 1 und 3

Ergebnis soll sein:
M_neu=
1 0 0 1.9539
1 2 3 5.2235
1 2 5 6.7890

Mittels unique kann ich ja leider nur komplett doppelte Zeilen löschen.
Meine Funktion sieht derzeit so aus: Alle Zeilen werden nacheinander durchlaufen und darauf überprüft ob nachfolgende Zeilen gleiche x,y,z enthalten. Falls dies der Fall ist werden alle diese Zeilen zunächst in der ersten aufgetretenen Zeile addiert und mit NaN überschrieben. Mittels eines counters wird zum Schluss die erste Zeile durch die Anzahl an doppelten Zeilen dividiert.
Code:
for i=1:size(Messung,1)
     counter=1;
     for j=i+1:size(Messung,1)
         if sortiert(j,1:3)==Messung(i,1:3)
              sortiert(i,4:size(Messung,2))=sortiert(i,4:size(Messung,2))+Messung(j,4:size(Messung,2));
              Messung(j,:)=NaN;
              counter=counter+1;
         end
     end
     Messung(i,4:size(Messung,2))=Messung(i,4:size(Messung,2))/counter;
 end
 
 Messung_neu=Messung(~isnan(Messung(:,1))==1,:);


Das Prozedere läuft tadellos, allerdings dauert mir die Schleife bei ca. 200.000 Messwerten einfach zu lange.

Beste Grüße und Danke im Voraus!
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 15.01.2013, 17:21     Titel:
  Antworten mit Zitat      
Hallo,

Wenn ich das richtig verstehe, läufst du für jede Zeile durch alle folgenden Zeilen, um auf Gleichheit zu prüfen.

Du könntest die Werte erst mit
Code:

sortieren und dann nur bis zur nächsten ungleichen Zeile suchen.
So durchläufst du nicht jedes mal 200000-i Messungen, sondern n+1 gleiche Messungen.

Vermutlich kommt aber im Laufe des Tages noch ein Matlab-Großmeister vorbei & schüttelt eine bessere Lösung aus dem Ärmel Wink

Grüße
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Hecki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2013, 17:33     Titel:
  Antworten mit Zitat      
Ja, hast du richtig verstanden. Der Ansatz ist schonmal ne gute Idee, danke! Sollte einiges an Zeit einsparen.
Zitat:
Vermutlich kommt aber im Laufe des Tages noch ein Matlab-Großmeister vorbei & schüttelt eine bessere Lösung aus dem Ärmel

Ich bin gespannt! Very Happy
Private Nachricht senden Benutzer-Profile anzeigen
 
Hecki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.01.2013, 21:52     Titel:
  Antworten mit Zitat      
Besten Dank nochmal Seban!
Habe gerade mal ein bißchen an meiner Schleife gefeilt und deinen Vorschlag eingefügt. Die jetzt noch benötigte Zeit ist nicht der Rede wert.
Vielleicht gibt es noch eine formal "schönere" Lösung, aber ich bin mit dem Ergebnis zufrieden
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.01.2013, 12:49     Titel:
  Antworten mit Zitat      
Hallo

es geht auch mit unique:

Code:
M =[               ...
   1 0 0 1.5678;   ...
   1 2 3 5.2235;   ...
   1 0 0 2.3400;   ...
   1 2 5 6.7890;   ...
   ];


[U,b,pos] = unique(M(:,1:3),'rows');
unpos     = unique(pos)';
[anz]     = histc(pos,unpos);

M2        = zeros(unpos(end), size(M,2));
for k = unpos
  M2(k,:) = [U(k,:) sum(M(pos==k,end)/anz(k)) ];
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Hecki
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 12
Anmeldedatum: 14.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.01.2013, 14:13     Titel:
  Antworten mit Zitat      
Der Ansatz ist tatsächlich sogar noch schöner als meine zwei bis drei Schleifen.
Leider macht der folgende Teil Zicken:
Code:
sum(M(pos==k,end)/anz(k))

Meine Matrix ist nicht grundsätzlich 4 Spalten breit (gerne auch mal 10), sodass ich end als Positionsangabe nicht verwenden kann. Bei Verwendung von z.B. 4:10 statt end summiert mir sum für anz=1 natürlich alles auf und unterscheidet nicht zwischen den Spalten. Wenn ich, um dies zu umgehen, dafür eine zweite Schleife einbaue (siehe unten), die mir die Fälle von anz=1 rausfiltert, brauche ich tatsächlich länger als mit der Methode von Seban.
Code:

[U,b,pos] = unique(M(:,1:3),'rows');
unpos     = unique(pos)';
[anz]     = histc(pos,unpos);

M2 = zeros(unpos(end), size(M,2));
for k=unpos
    if anz(k)==1
        x=M(pos==k,4:size(M,2));
    else
        x=sum(M(pos==k,4:size(M,2)))/anz(k);
    end
    M2(k,:) = [U(k,:) x];
end
 

Aber herzlichen Dank für den Vorschlag. So hab ich wieder was neues gelernt. Smile
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.