2017-08-15 44 views
1

我在Matlab中有一張表,其中一些列代表128位散列。用於matlab中比較哈希的最快類型

我想根據這些散列將行匹配到一行或多行。

目前,哈希表示爲十六進制字符串,並與strcmp()進行比較。但是,處理表格需要很多秒。

在matlab中比較兩個散列的最快方法是什麼?

我試過把它們變成分類變量,但是這太慢了。據我所知,Matlab沒有128位數字類型。 標稱值序號類型已棄用。

有沒有其他人可以工作?

下面的代碼類似於我在做什麼:

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); 

散列字符串是我在用的忠實表示,但他們不一定讀或原始出處字符串存儲。它們只是爲了這個目的而轉換,因爲它是進行比較的最快方式。

+2

A [mcve]可能有幫助 –

+0

我認爲這個問題很明顯。無論如何,我沒有太多的評論這個問題 - 最多可以嘗試兩次64位雙打?有人在這件事上有更好的背景可以幫助我想。 – crazyGamer

+0

這不是一種自我解釋......這是一個以MATLAB爲中心的問題,但可能有99%的MATLAB回答者不知道「哈希」是什麼樣的!你說你有一張桌子,你能澄清一下,這實際上是'table'數據類型還是矩陣的另一個詞(行話問題在這裏很常見)。你說你正在使用'strcmp',向我們展示2個哈希值,你如何比較它們(甚至只是那3行代碼!),所以我們有一個你想達到的具體例子。當你剛纔提到的比較字符串時,你會談論數字類型,那麼你的哈希值又是什麼? – Wolfie

回答

1

優化是不錯的,如果你需要它。嘗試一下自己,並獲得相關測試用例的收益。

幾點建議:

  • 排序陣列更容易/更快地搜索
  • Matlab的默認號碼是doublebut you can also construct integers。爲什麼不使用2 uint64而不是128位列?首先搜索上部64位,然後搜索下部;甚至更好:行使用ismemberrow選項,並把你的哈希:

    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 
    
  • 查找到比較使用的功能(例如edit ismember)並去掉了不必要的操作(如sort)和安全檢查,你提前知道不會造成問題。 Like this solution does。或者,如果您打算多次調用搜索功能,請提前進行排序,稍後在搜索功能中跳過檢查/排序。