我有兩個矩陣如何找到行與行兩個矩陣之間的對應關係在MATLAB
A=[1 3;4 5;7 8;17 11]
和
B=[4 5;9 10;7 8;4 5;1 3;7 8;11 12].
我想兩個矩陣的不同行之間的對應關係酷似
[I,J] = find(pdist2(A,B)==0);
display([I,J]).
在我的情況下,A和B的長度是巨大的,所以執行pdist2不是有效的內存。 你能幫我嗎?
我有兩個矩陣如何找到行與行兩個矩陣之間的對應關係在MATLAB
A=[1 3;4 5;7 8;17 11]
和
B=[4 5;9 10;7 8;4 5;1 3;7 8;11 12].
我想兩個矩陣的不同行之間的對應關係酷似
[I,J] = find(pdist2(A,B)==0);
display([I,J]).
在我的情況下,A和B的長度是巨大的,所以執行pdist2不是有效的內存。 你能幫我嗎?
最後是什麼我做的是:
[lib,loa] = ismember(B,A,'rows');
loa(loa==0)=[];
I = loa;
J = find(lib);
display([I,J]);
我希望沒有錯誤。最後很容易。非常感謝您的幫助。 :)
您可以使用bsxfun
。它可能會花費更少的時間比pdist2
,但我不知道這是否將是更多的內存效率:
[I, J] = find(squeeze(all(bsxfun(@eq, A.', permute(B.',[1 3 2])))));
可以使用ismember
[tf, index]=ismember(B,A,'rows');
其中等於行中的索引contans indcies A到B和其他人將獲得零 ,如果你想獲得B在使用這些行
index(index==0) = []
rows=A(index,:)
見http://www.mathworks.com/對於m礦石詳情
憑經驗:如果你想(內存)的效率,並且您有需要是不太容易用標準的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))或更好是可能的你的特殊情況。如果你必須在接下來的幾周內在數百萬個矩陣上解決這個問題,我會花一點時間找到最好的算法,或者證明這是不可能的:)
+1,'find','squeeze','all','bsxfun'和'permute'在一行中......我猜你在第一次嘗試時沒有得到那一個= P –
@RobertP。不,但幾乎;-) –