我有两个矩阵
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不是内存效率高。 你能帮我吗?
答案 0 :(得分:2)
您可以使用ismember
[tf, index]=ismember(B,A,'rows');
其中index包含A到B的相等行的索引,其他索引将为零 如果你想在B中使用那些行
index(index==0) = []
rows=A(index,:)
有关详细信息,请参阅http://www.mathworks.com/
答案 1 :(得分:1)
您可以使用bsxfun
执行此操作。它可能比pdist2
花费的时间更短,但我不确定它是否会更节省内存:
[I, J] = find(squeeze(all(bsxfun(@eq, A.', permute(B.',[1 3 2])))));
答案 2 :(得分: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
计算所有距离,其中大部分是您不需要的,只是扔掉。对于路易斯采取的bsxfun
方法也是如此。
这使得使用pdist2
或Luis'解决方案达到您的特定目的等于通过南极从伦敦飞往巴黎,甚至不享受视野 - 不是很快,而且确实非常浪费:)一个循环根据您的特定用例量身定制,速度最快,内存效率最高。
上面的双循环具有O(N²)复杂度。这似乎也是ismember
使用的方法(+1到Alyafey!)它比其他解决方案更快,内存效率更高,但是,我强烈怀疑O(N·log(N))或您的特定情况可能更好。如果你必须在接下来的几周内在数百万个矩阵上解决这个问题数千次,我会花点时间找到最好的算法,或证明这是不可能的:)
答案 3 :(得分:0)
最后我所做的是:
[lib,loa] = ismember(B,A,'rows');
loa(loa==0)=[];
I = loa;
J = find(lib);
display([I,J]);
我希望没有错误。最后这很容易。非常感谢您的帮助。 :)