2014-01-06 111 views

回答

0

最後是什麼我做的是:

[lib,loa] = ismember(B,A,'rows'); 

loa(loa==0)=[]; 

I = loa; 

J = find(lib); 

display([I,J]); 

我希望沒有錯誤。最後很容易。非常感謝您的幫助。 :)

1

您可以使用bsxfun。它可能會花費更少的時間比pdist2,但我不知道這是否將是更多的內存效率:

[I, J] = find(squeeze(all(bsxfun(@eq, A.', permute(B.',[1 3 2]))))); 
+1

+1,'find','squeeze','all','bsxfun'和'permute'在一行中......我猜你在第一次嘗試時沒有得到那一個= P –

+0

@RobertP。不,但幾乎;-) –

2

可以使用ismember

[tf, index]=ismember(B,A,'rows'); 

其中等於行中的索引contans indcies A到B和其他人將獲得零 ,如果你想獲得B在使用這些行

index(index==0) = [] 
rows=A(index,:) 

http://www.mathworks.com/對於m礦石詳情

1

憑經驗:如果你想(內存)的效率,並且您有需要是不太容易用標準的MATLAB函數來解決,實現自定義解決方案:

inds = NaN(max(size(A,1),size(B,1)),2); 
kk = 1; 
for ii = 1:size(A,1) 
    for jj = 1:size(B,1) 
     if isequal(A(ii,:), B(jj,:)) 
      inds(kk,:) = [ii,jj]; 
      kk = kk+1; 
     end 
    end 
end 
inds = inds(1:kk-1,:) 

的雙以上循環也是pdist2採取的方法。然而,pdist2計算所有距離,其中大部分你不需要你的目的,只是扔掉。 Luis採取的bsxfun方法也是如此。

這使得使用pdist2或路易斯的解決方案爲您的特定目的相當於通過南極從倫敦飛往巴黎,甚至沒有享受視圖 - 不是很快,而且確實很浪費:)爲您量身打造一個循環具體的用例將會變得最快和最有效的內存。

上面的雙循環具有O(N 2)複雜性。這似乎也是ismember(對Alyafey +1)所使用的方法,它比其他解決方案更快,更有效率,但是,我強烈懷疑O(N·log(N))或更好是可能的你的特殊情況。如果你必須在接下來的幾周內在數百萬個矩陣上解決這個問題,我會花一點時間找到最好的算法,或者證明這是不可能的:)

相關問題