查找属于另一个矩阵的行

时间:2015-10-29 10:11:23

标签: matlab sorting

我还没有能够找到关于我要求的现有来源,虽然我认为其他人之前已经遇到过这个问题,所以如果是这样的话,请随意标记为重复,并且我会删除这个问题。

我有两个矩阵:

A一个Mx5矩阵,其中4个第一列是整数,第5列填充了双精度。

B一个Nx4矩阵,其4列与A中的前4列相同,但顺序不同,但某些行不属于A (我们总是M<N)。

我想做的是:

  1. 获取B中{4}}中第4行符合A
  2. 行的行的索引(相对于较大的矩阵B
  3. 使用Nx1的第5列中的值填充A向量,其中索引处有匹配的行和零。
  4. 我在这里有一些工作代码,但它很慢,因为N将至少有2百万行(大约7s,这个过程将会重复过大)。另外,为了做我想做的事情,我现在必须根据前4列对两个矩阵中的行进行排序,从而花费更多时间。

    工作代码:

    N=size(B,1);
    A=sortrows(A,1:4);
    [B,ind]=sortrows(B);
    [~,index]=sort(ind)
    FinValues=zeros(N,1);
    FinValues(ismember(B,A(:,1:4),'rows'))=A(:,5);
    FinValues=FinValues(index);
    

    玩具示例:

    A= [134 3 16998 2 2.0234e-2;...
        134 2 15557 1 3.0234e-3];
    
    B=[17778 1 16559 4;...
       134 2 15557 1;...
       134 3 16998 2;...
       15554 2 16998 3];
    

    期望的输出:

    FinValues=
    
    0
    3.0234e-3  
    2.0234e-2
    0
    

    我希望这很清楚,先谢谢!

1 个答案:

答案 0 :(得分:2)

这应该更快,因为它完全消除了对任何排序的需要。我们可以使用ismember的第二个输出参数来查找行立即的索引,然后使用这些参数直接索引F,并用A填充它。< / p>

>> [~, idx] = ismember(A(:, 1:4), B, 'rows');
>> F = zeros(N, 1);
>> F(idx) = A(:, 5)
F =
         0
    0.0030
    0.0202
         0