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

Knoten im Hirn: Datenzuordnung

 

ActionAndi
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2016, 15:41     Titel: Knoten im Hirn: Datenzuordnung
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgendes Problem bei der Zuordnung von Messdaten. Das Beispiel ist arg gekürzt. In Realität haben die Vektoren ca. 1e6 Einträge.
Ich habe zwei Listen (Charakter-Array): Namen und Kennzahlen. Jedem Namen sollte eine Kennzahl zugeordnet sein. Manchmal tritt aber eine Messfehler auf, bei dem die Kennzahlen nicht richtig mitgeschrieben werden. Nun versuche ich im Nachgang dies wieder auszumerzen.
Beispiel:
Code:

     
Namen =   ['ABC123';...
           'ABC456';...
           'ABC456';...
           'ABC789';...
           'ABC789';...
           'ABC789'];

Kennzahl = ['aaabbb';...
           'aaaccc';...
           '......';...
           'aaaddd';...
           '......';...
           '......'];

 


Der Vektor Namen besteht demnach aus 3 verschiedenen Einträgen:
Code:

[C,ia,ic] = unique(Namen,'rows');
 


Nun soll den Stellen im Vektor Kennzahl an denen '......' steht, die richtige Kennzahl zugeordnet werden.

Ergbnis wäre also

Namen = ['ABC123';...
'ABC456';...
'ABC456';...
'ABC789';...
'ABC789';...
'ABC789'];

Kennzahl = ['aaabbb';...
'aaaccc';...
'aaaccc';...
'aaaddd';...
'aaaddd';...
'aaaddd'];

So richtig habe ich keinen Plan. Natürlich könnte man einiges über for Schleifen regeln, aber dies dauert ja ewig.
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.04.2016, 15:49     Titel:
  Antworten mit Zitat      
Zitat:
Natürlich könnte man einiges über for Schleifen regeln, aber dies dauert ja ewig.
was heist ewig? poste doch mal deine schleifen lösung vielleicht lässt sich diese ja einfach beschleunigen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ActionAndi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.04.2016, 16:06     Titel: Hier der vollständige Code
  Antworten mit Zitat      
Mein aktueller Code sieht so aus.
Wenn nun die Vektoren 1e6 groß sind, vergehen schnell 20-30 Minuten
Code:

Kennzahl = ['aaabbb';...
           'aaaccc';...
           '......';...
           'aaaddd';...
           '......';...
           '......'];
       
Namen =   ['ABC123';...
           'ABC456';...
           'ABC456';...
           'ABC789';...
           'ABC789';...
           'ABC789'];
   

fprintf('Ausgangssituation\n');
for i = 1:N
    fprintf('%s %s\n',Namen(i,:), Kennzahl(i,:));
end


%% Sehr langsame Loesung
fprintf('\n Zuordnung...\n\n');
N = length(Namen);
idx = false(N,1);
idx_NIO = find(Kennzahl(:,1) == '.');
idx(idx_NIO)=1; % alle Fehler im Kennzahl-Vektor sind mit 1 versehen

N_NIO = length(idx_NIO); % Anzahl Fehler

Names_IO   = Namen(~idx,:); % Alle iO-Namen
Kennzahl_IO = Kennzahl(~idx,:);
Names_IO_cell = cellstr(Names_IO); % Umwandlung in eine "cell"


for i = 1:N_NIO
         
    % Nehme den Namen mit Fehleintrag
    Name_lok = Namen(idx_NIO(i),:);
   
    % Suche den Namen im IO-Vektor
     idx_Name = find(strcmp(Names_IO_cell,Name_lok));

     % Verwende den Index um die Kennzahl aus dem IO-Vektor zu zu ordnen
    if(~isempty(idx_Name))
        Kennzahl_lok = Kennzahl_IO(idx_Name(1),:);
    end
   
    Kennzahl(idx_NIO(i),1:6) = Kennzahl_lok;
   
end

fprintf('Ergebnis\n');
for i = 1:N
    fprintf('%s %s\n',Namen(i,:), Kennzahl(i,:));
end


 
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 08.04.2016, 17:25     Titel:
  Antworten mit Zitat      
das klappt für dein beispiel
Code:
C,ia,ic] = unique(Namen,'rows')
Kennzahl2=Kennzahl(ia,:);
Kennzahl2=Kennzahl2(ic,:)

das klappt aber nur wenn das erste auftauchen in Namen auch mit den korrekten Kennzahlen belegt ist.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
ActionAndi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.04.2016, 14:25     Titel:
  Antworten mit Zitat      
Ja stimmt, so könnte es klappen. Ich muss aber mal sehen, ob immer der erste Eintrag mit einer Kennzahl versehen ist. Werde es Montag oder Dienstag, wenn ich wieder am Schaffen bin, checken.

Andi
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: 09.04.2016, 23:12     Titel: Re: Hier der vollständige Code
  Antworten mit Zitat      
Hallo ActionAndi,


Aufbauend auf Winkdows Vorschlag funktioniert dies auch, wenn die ersten Werte ungültig sind. Dafür werden die Kennzahlen zunächst sortiert, so dass ungültige Werte am Schluss auftauchen:
Code:
K = ['......';...
   'aaaccc';...
   '......';...
   'aaaddd';...
   '......';...
   '......'; ...
   'aaabbb';...
   'aaaccc'];

N =   ['ABC123';...
   'ABC456';...
   'ABC456';...
   'ABC789';...
   'ABC789';...
   'ABC789';...
   'ABC123';...
   'ABC456'];

K(K(:,1) == '.', 1) = char(255);   % Move to bottom
[~, index]       = sort(K(:,1));
sortK            = K(index, :);
sortedN          = N(index, :);
[~, iN, iUN]     = unique(sortedN, 'rows');
KFixed(index, :) = sortK(iN(iUN), :);  % Inverse sorting


Mit ein paar Testdaten:
Code:
v = randi(1000, 1, 1e6);
K = char(sprintfc('k%04d', v));
K(rand(size(K)) > 0.9, :) = '.';
N = char(sprintfc('n%04d', v));

Mein Vorschlag benötigt etwa 4 sec, Winkows 1.4 sec - allerdings nur, wenn garantiert das erste Element des jeweiligen Names eine valide Kennzahl hat.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2016, 20:56     Titel:
  Antworten mit Zitat      
Hi,

vielen Dank. Aber leider werde ich aus dem Beispiel nicht ganz schlau.

Code:

v = randi(1000, 1, 1e6);
K = char(sprintfc('k%04d', v));
K(rand(size(K)) > 0.9, :) = '.';
N = char(sprintfc('n%04d', v));
 

Bei mir sind K und N gleich lang. Hier nicht size(K) = 4999991x5 und size(N) = 1e6x5.

Andreas
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: 11.04.2016, 21:11     Titel:
  Antworten mit Zitat      
HAllo ActionAndi,

Ja, das war ein Tippfehler im Forum, weil ich eigentlich mit Cell Strings gearbeitet habe. Allerdings habe ich die Test-Daten ja nur erstellt, weil ich keine Original-Daten hatte und nicht warten wollte, bis Du welche postest. Du selbst kannst natürlich Deine eigenen Daten zum Testen verwenden. Das wäre sogar sinnvoller.

Der Vollständigkeit halber:
Code:
v = randi(1000, 1, 1e6);
K = char(sprintfc('k%04d', v));
K(rand(size(K,1),1) > 0.9, :) = '.';   % [BUG FIXED]
N = char(sprintfc('n%04d', v));

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.04.2016, 09:39     Titel: [gelöst]
  Antworten mit Zitat      
Hi,

vielen Dank! Da die Generierung meiner Testdaten sehr aufwändig ist, war ich echt froh, dass Du mir gezeigt hast, wie ich einfach die Testdaten erzeugen kann. Also habe ich gleich zwei(!) Sachen gelernt!

Eure Lösung ist ca. 25 Mal schneller als meine... Getestet mit 10000 Einträgen.

Super!!!

Vielen Dank,
Andreas
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.