MATLAB快速查找矩阵中的向量

时间:2017-04-17 05:08:07

标签: matlab performance search matrix

我有一段代码可以按以下方式工作。 有一个大小为n x 2的矩阵。每个元素都是1到最大值之间的整数,比如m

我想在此矩阵中搜索行,即给定[v1, v2],输出此索引。

现在,我正在使用:

k = find(ismember(edges, [v1, v2], 'rows'));

然而,这是我的代码中的瓶颈,因为这是线性时间。

我想实现一些hashmap类型结构以进行快速查找。什么是一种简单的方法呢?

5 个答案:

答案 0 :(得分:1)

因为你知道列数如何(假设edge是要搜索的矩阵):

idx = find(edges(:,1)==v1 & edges(:,2)==v2);

请注意,根据您使用索引的准确程度,最好使用在途中创建的逻辑索引:

idx = edges(:,1)==v1 & edges(:,2)==v2;

希望这有帮助。

答案 1 :(得分:1)

R2016b及以后:

$access_token_response

前值:

find(all(edges == [v1 v2], 2))

答案 2 :(得分:0)

请尝试以下代码:

M = [5 2; 10 1; 3 2; 4 4; 5 0]
N = [4 4]
ind=find(all(repmat(N,size(M,1),1)==M,2));

ind是矩阵包含N中特定数字的行。

答案 3 :(得分:0)

使用accumarray可以创建一个邻接矩阵来加速搜索:

A = accumarray(edges,1,[m m],@any,false)

您可以使用索引进行搜索

if(A(v1,v2))...

如果m非常大,您可以创建稀疏矩阵:

A = accumarray(edges,1,[m m],@any,false,true)

或者,如果你需要它的索引,邻接矩阵可以通过这种方式提出:

A = accumarray(edges,1:size(edgaes,1),[m m],@any,0,true);

所以

index = A(v1,v2)

答案 4 :(得分:0)

一个让我比你的代码快30到40倍的选项是对整个第一列进行比较,捕获一组索引,然后只检查那些索引处第二列的值:

ind = find(edges(:, 1) == v1);
k = ind(edges(ind, 2) == v2);

如果您仍然需要更快地完成此操作,则可以使用containers.Map class预先计算每个可能的[v1 v2]到其出现的行索引列表的映射。需要注意的是,地图的键类型不能是数字的向量,但由于您处理的是整数(理想情况下m不是非常大),您可以将[v1 v2]转换为一个2个字符的ASCII密钥。以下是构建地图的方法:

mapObj = containers.Map('KeyType', 'char', 'ValueType', 'any');
[R, C] = meshgrid(1:m);
keys = [R(:) C(:)];
for keyIndex = 1:(m*m)
  v = keys(keyIndex, :);
  ind = find(edges(:, 1) == v(1));
  mapObj(char(v)) = ind(edges(ind, 2) == v(2));
end

您可以非常快速地从地图中访问值:

k = mapObj(char([v1 v2]));