我在Matlab中有一个表,其中一些列代表128位哈希值。
我想根据这些哈希值将行匹配到一行或多行。
目前,哈希值表示为十六进制字符串,并与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);
哈希字符串是我正在使用的忠实表示,但它们不一定在原始源中作为字符串读取或存储。它们只是为此目的而转换,因为它是进行比较的最快方法。
答案 0 :(得分:1)
优化很好,如果你需要它。自己尝试一下,measure the performance获得相关测试用例。
一些建议:
Matlab的默认数字为double
,but you can also construct integers。为什么不使用2 uint64
而不是128位列?首先搜索上部64位,然后搜索下部;甚至更好:将ismember
与row
选项一起使用,并将哈希值放入行中:
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。或者,如果您打算多次调用搜索功能,请提前排序并稍后跳过搜索功能中的检查/排序。