Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
矩阵中向量的MATLAB快速求法_Matlab_Performance_Search_Matrix - Fatal编程技术网

矩阵中向量的MATLAB快速求法

矩阵中向量的MATLAB快速求法,matlab,performance,search,matrix,Matlab,Performance,Search,Matrix,我有一段代码,它的工作方式如下。 有一个大小为nx2的矩阵。每个元素都是一个介于1和某个最大值之间的整数,例如m 我想搜索这个矩阵中的行,也就是说,给定[v1,v2],输出这个矩阵的索引 现在,我正在使用: k = find(ismember(edges, [v1, v2], 'rows')); 然而,这是我的代码中的瓶颈,因为这是线性时间 我想实现一些hashmap类型的结构,用于快速查找。做这件事的简单方法是什么?既然你知道列的数量,那么这个方法怎么样(假设边是要搜索的矩阵): 请注意,根

我有一段代码,它的工作方式如下。 有一个大小为
nx2
的矩阵。每个元素都是一个介于1和某个最大值之间的整数,例如
m

我想搜索这个矩阵中的行,也就是说,给定
[v1,v2]
,输出这个矩阵的索引

现在,我正在使用:

k = find(ismember(edges, [v1, v2], 'rows'));
然而,这是我的代码中的瓶颈,因为这是线性时间


我想实现一些hashmap类型的结构,用于快速查找。做这件事的简单方法是什么?

既然你知道列的数量,那么这个方法怎么样(假设边是要搜索的矩阵):

请注意,根据您使用索引的确切方式,您最好使用在途中创建的逻辑索引:

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

希望这有帮助。

请尝试以下代码:

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中特定数字的行。

使用可生成邻接矩阵以加快搜索速度:

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

R2016b及以后:

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

find(all(bsxfun(@eq, edges, [v1 v2]), 2))

有一个选项可以使我的代码速度提高30-40倍,它是对整个第一列进行比较,捕获一组索引,然后只在这些索引处检查第二列的值:

ind = find(edges(:, 1) == v1);
k = ind(edges(ind, 2) == v2);
如果仍然需要更快地完成,可以使用预计算每个可能的
[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]));

m
的范围是多少?你看过吗?我假设你希望有很多查询,你想通过做一些预处理来加速,对吗?
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]));