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

Schneller Suchalgo für Cells gesucht

 

ActionAndi
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 02.08.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.07.2015, 09:07     Titel: Schneller Suchalgo für Cells gesucht
  Antworten mit Zitat      
Hallo zusammen,

für die Analyse von Fertigungsdaten muss ich zwei Cell-Arrays miteinander verheiraten Smile

Dabei stehen im Cell Array 'aaa' Namen, ebenfalls aber leider ungeordnet auch im Cell-Arry 'bbb' vorhanden sind. In 'bbb' sind aber die Daten gespeichert, die ich in 'aaa' benoetige. Daher muss 'bbb' durchsucht werden und der Datensatz 'aaa' zugeordnet werden.
Anbei ein Beispiel:
Stellt euch aber vor, dass die Cell-Arrays nicht 10,2 oder 5,2 groß sind, sondern 100000,50. Ich habe zwei Lösungsmöglichkeiten schon gefunden, allerdings sind diese sehr langsam. Zum einen geht's über doppelte Schleife oder einen StrFind auf Cells.
Habt Ihr noch eine Idee, wie das ganze wesentlich beschleunigt werden kann?

Viele Grüße
Andreas


Code:
% Testdaten erzeugen
% Ziel Cell
aaa =cell(10,2);
aaa{1,1} =  'abc';
aaa{2,1} =  'abc';
aaa{3,1} =  'ac';
aaa{4,1} =  'ab';
aaa{5,1} =  'ac';
aaa{6,1} =  'bc';
aaa{7,1} =  'ba';
aaa{8,1} =  'ba';
aaa{9,1} =  'ba';
aaa{10,1} =  'ba';

ccc = aaa; % Kopie für den zweiten Lösungsansatz

% Quelle
bbb = cell(5,2);
bbb{1,1} =  'ba'; bbb{1,2} =  1;
bbb{2,1} =  'aa'; bbb{2,2} =  2;
bbb{3,1} =  'abc'; bbb{3,2} =  3;
bbb{4,1} =  'ac'; bbb{4,2} =  4;
bbb{5,1} =  'bc'; bbb{5,2} =  5;

% Ueber einfache for-Schleifen
for i = 1:10
    for j = 1:5
        if(strcmp(aaa{i,1},bbb{j,1}))
            aaa{i,2} =  bbb{j,2};
            continue
        end
    end
end

% Oder ueber ein Str-Find:
cellfind = @(string)(@(cell_contents)(strcmp(string,cell_contents)));

for j = 1:5
    logical_cells = cellfun(cellfind(bbb{j,1}),aaa(:,1));
    n_found = sum(logical_cells); % Anzahl Eintraege
    ccc(logical_cells,2) = repmat(bbb(j,2),n_found,1);
end

% Vergleich
isequal(aaa,ccc)
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 01.07.2015, 09:25     Titel:
  Antworten mit Zitat      
Hallo,

ismember ist dafür gut geeignet:
Code:
[found, loc] = ismember(aaa(:,1), bbb(:,1));
aaa(found, 3) = bbb(loc(found), 2);


Wenn in aaa viele gleiche Strings auftauchen, dann kann es deutlich effizienter sein, mit categorical zu arbeiten.

Grüße,
Harald
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: 01.07.2015, 09:37     Titel: Re: Schneller Suchalgo für Cells gesucht
  Antworten mit Zitat      
Hallo ActionAndi,

Eine weitere Idee:
Code:
% Ueber einfache for-Schleifen
for i = 1:10
   match = strcmp(a{i}, bbb);
   if any(match)
      aaa{i, 2} = bbb{match, 2};
   end
end

Dafür darf bbb keine mehrfachen Strings enthalten.
Aber der ismember ist besser.

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: 01.07.2015, 13:40     Titel: [erledigt.] Danke!
  Antworten mit Zitat      
Vielen Dank für die schnelle Hilfe.
Code:
hats gebracht. Die Laufzeit hat sich von Stunden auf Sekunden reduziert.
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.