Algorithm 如何在matlab中找到两个矩阵之间的行间对应关系

Algorithm 如何在matlab中找到两个矩阵之间的行间对应关系,algorithm,matlab,matrix,Algorithm,Matlab,Matrix,我有两个矩阵 A=[1 3;4 5;7 8;17 11] 及 我想得到两个矩阵的不同行之间的对应关系,就像 [I,J] = find(pdist2(A,B)==0); display([I,J]). 在我的例子中,A和B的长度是巨大的,因此执行pdist2并不能节省内存。 你能帮我吗?你可以用bsxfun来做。它可能比pdist2花费的时间少,但我不确定它是否会更节省内存: [I, J] = find(squeeze(all(bsxfun(@eq, A.', permute(B.',[1

我有两个矩阵

A=[1 3;4 5;7 8;17 11] 

我想得到两个矩阵的不同行之间的对应关系,就像

[I,J] = find(pdist2(A,B)==0);
display([I,J]). 
在我的例子中,A和B的长度是巨大的,因此执行pdist2并不能节省内存。
你能帮我吗?

你可以用
bsxfun
来做。它可能比
pdist2
花费的时间少,但我不确定它是否会更节省内存:

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

您可以使用
bsxfun
执行此操作。它可能比
pdist2
花费的时间少,但我不确定它是否会更节省内存:

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

您可以使用
ismember

[tf, index]=ismember(B,A,'rows');
其中,A到B等行的索引包含度将为零 如果你想让这些行在B中使用

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

有关更多详细信息,请参见您可以使用
ismember

[tf, index]=ismember(B,A,'rows');
其中,A到B等行的索引包含度将为零 如果你想让这些行在B中使用

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

有关更多详细信息,请参见经验法则:如果您想要(内存)效率,并且您有一个标准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))或更好的方法适用于您的特定情况。如果你必须在接下来的几周内在数百万个矩阵上解决这个问题数千次,我会花一点时间来找到最好的算法,或者证明这是不可能的:)

经验法则:如果你想要(内存)效率,并且你有一个标准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))或更好的方法适用于您的特定情况。如果你必须在接下来的几周内在数百万个矩阵上解决这个问题数千次,我会花点时间找到最佳算法,或者证明这是不可能的:)

最后我做的是:

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

loa(loa==0)=[];

I = loa;

J = find(lib);

display([I,J]);

我希望没有bug。最后很容易。非常感谢您的帮助。:)

最后,我所做的是:

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

loa(loa==0)=[];

I = loa;

J = find(lib);

display([I,J]);

我希望没有bug。最后很容易。非常感谢您的帮助。:)

+1、
查找
压缩
全部
bsxfun
排列
在一行中。。。我猜你第一次试的时候没把它弄好=P@RobertP. 没有,但差不多;-)+1、
查找
压缩
全部
bsxfun
排列
在一行中。。。我猜你第一次试的时候没把它弄好=P@RobertP. 没有,但差不多;-)