我有一段代碼,它的工作方式如下。 有一個尺寸爲n x 2
的矩陣。每個元素都是1到最大值之間的整數,例如m
。MATLAB快速查找矩陣中的矢量
我想搜索這個矩陣中的行,也就是給出[v1, v2]
,輸出這個索引。
現在,我使用:
k = find(ismember(edges, [v1, v2], 'rows'));
然而,這是我的代碼中的瓶頸,因爲這是線性時間。
我想實現一些hashmap類型的結構進行快速查找。什麼是一個簡單的方法來做到這一點?
我有一段代碼,它的工作方式如下。 有一個尺寸爲n x 2
的矩陣。每個元素都是1到最大值之間的整數,例如m
。MATLAB快速查找矩陣中的矢量
我想搜索這個矩陣中的行,也就是給出[v1, v2]
,輸出這個索引。
現在,我使用:
k = find(ismember(edges, [v1, v2], 'rows'));
然而,這是我的代碼中的瓶頸,因爲這是線性時間。
我想實現一些hashmap類型的結構進行快速查找。什麼是一個簡單的方法來做到這一點?
既然你知道的列數這個怎麼樣(假設邊緣是要搜索的矩陣):
idx = find(edges(:,1)==v1 & edges(:,2)==v2);
注意,這取決於你究竟是如何使用索引,你可能會更好用在路上創建的邏輯索引:
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的具體的數字的行
使用accumarray可以使鄰接矩陣,以加快搜索速度:
A = accumarray(edges,1,[m m],@any,false)
,您可以使用索引來查找它
if(A(v1,v2))...
如果m
是非常大的,你可以創建一個稀疏矩陣:
A = accumarray(edges,1,[m m],@any,false,true)
或者如果您需要索引它鄰接矩陣可以cereated這樣:
A = accumarray(edges,1:size(edgaes,1),[m m],@any,0,true);
所以
index = A(v1,v2)
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);
如果您仍然需要完成它比快,你可以使用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]));
什麼是'M'的範圍是多少?你看過[containers.Map](https://www.mathworks.com/help/matlab/ref/containers.map-class.html)嗎? – beaker
我假設您希望通過做一些預處理來加快查詢的速度,對嗎? – beaker