2017-08-15 1 views
1

Ich habe eine Tabelle in Matlab mit einigen Spalten, die 128-Bit-Hashes darstellen.Schnellste Art zum Vergleichen von Hashes in Matlab

Ich möchte Zeilen, auf eine oder mehrere Zeilen, basierend auf diesen Hashes übereinstimmen.

Derzeit werden die Hashes als hexadezimale Zeichenfolgen dargestellt und mit strcmp() verglichen. Trotzdem dauert es viele Sekunden, um den Tisch zu bearbeiten.

Was ist der schnellste Weg, um zwei Hashes in Matlab zu vergleichen?

Ich habe versucht, sie in kategorische Variablen zu verwandeln, aber das ist viel langsamer. Matlab, soweit ich weiß, hat keinen 128 Bit numerischen Typ. nominal und ordinal Typen sind veraltet.

Gibt es noch andere, die funktionieren könnten?

Der folgende Code ist analog zu dem, was ich tue:

nodetype = { 'type1'; 'type2'; 'type1'; 'type2' }; 
hash = {'d285e87940fb9383ec5e983041f8d7a6'; 'd285e87940fb9383ec5e983041f8d7a6'; 'ec9add3cf0f67f443d5820708adc0485'; '5dbdfa232b5b61c8b1e8c698a64e1cc9' }; 

entries = table(categorical(nodetype),hash,'VariableNames',{'type','hash'}); 

%nodes to match. filter by type or some other way so rows don't match to 
%themselves. 
A = entries(entries.type=='type1',:); 
B = entries(entries.type=='type2',:); 

%pick a node/row with a hash to find all counterparts of 
row_to_match_in_A = A(1,:); 
matching_rows_in_B = B(strcmp(B.hash,row_to_match_in_A.hash),:); 

% do stuff with matching rows... 
disp(matching_rows_in_B); 

Die Hash-Strings sind treue Darstellungen von dem, was ich verwende, aber sie sind nicht unbedingt lesen oder als Zeichenfolgen in der Originalquelle gespeichert. Sie werden nur für diesen Zweck konvertiert, weil es der schnellste Weg ist, den Vergleich zu machen.

+2

Ein [mcve] kann helfen –

+0

Ich denke, die Frage ist ziemlich selbsterklärend. Wie auch immer, ich habe nicht viel zu diesem Problem zu sagen - könnte bestenfalls zwei 64-Bit-Double versuchen? Jemand mit einem besseren Hintergrund in dieser Angelegenheit kann helfen, nehme ich an. – crazyGamer

+0

Es ist nicht selbsterklärend ... das ist ein MATLAB-zentrisches Problem, aber vielleicht haben 99% der MATLAB-Beantworter hier keine Ahnung, wie ein "Hash" aussieht! Sie sagen, Sie haben eine Tabelle, können Sie klarstellen, dass dies tatsächlich der Datentyp 'Tabelle' oder nur ein anderes Wort für Matrix ist (Jargon-Probleme sind hier üblich). Sie sagen, dass Sie gerade "strcmp" verwenden, zeigen Sie uns 2 Hashes, wie Sie sie vergleichen usw. (auch nur diese 3 Zeilen Code!), So haben wir ein konkretes Beispiel für das, was Sie erreichen möchten. Sie sprechen über numerische Typen, wenn Sie gerade den Vergleich von Strings erwähnt haben. Was sind Ihre Hashes? – Wolfie

Antwort

1

Optimierung ist nett, , wenn Sie es benötigen. Probieren Sie es selbst aus und measure the performance Gewinn für relevante Testfälle.

Einige Vorschläge:

  • Sortiert Arrays sind einfacher/schneller
  • Matlab Standardnummern double sind but you can also construct integers zu suchen. Warum nicht 2 uint64 anstelle der 128-Bit-Spalte verwenden? Suche zuerst nach dem oberen 64bit, dann nach dem niedrigeren; oder noch besser: ismember mit der row Option verwenden und setzen Sie Ihre Hashes in Reihen:

    A = uint64([0 0; 
          0 1; 
          1 0; 
          1 1; 
          2 0; 
          2 1]); 
    srch = uint64([1 1; 
           0 1]); 
    [ismatch, loc] = ismember(srch, A, 'rows')  
    
    > loc = 
        4 
        2 
    
  • Blick in die Funktionen vergleichen Sie verwenden (zB edit ismember) und unnötige Operationen Streifen aus (zB sort) und Sicherheitskontrollen, die Sie im Voraus wissen, wird kein Problem darstellen. Like this solution does. Oder wenn Sie eine Suchfunktion mehrere Male aufrufen möchten, sortieren Sie im Voraus und überspringen Sie später das Suchen/Sortieren in der Suchfunktion.

Verwandte Themen