如何在Matlab中找到基于某些cols与set(矩阵查询)相等的索引

时间:2013-02-05 04:58:30

标签: matlab

我有一个包含n行和3列的矩阵。我们称之为A=[23 45 6;32 4 78;67 5 34; 54 1 4;6 9 2]

现在我有一组积分:B={ P1=[X1,Y1] P2=[X2,Y2] ... }= { [6 9] [32 4] }

我想在矩阵A上设置一个查询,以便它返回行(i)的索引,其中所有集合B

Pk(1,1) ( or Xk) == A(i,1) && Pk(1,2) ( or Yk) == A(i,2) 

换句话说,根据第1列和第1列设置查询。 2超过A,并将它们与B进行比较,因此输出是第1列和第2列中具有相同值的行的索引,B中的Xk,Yk:

输出:5,2

2 个答案:

答案 0 :(得分:2)

按照@ TJ1

的建议使B成为矩阵
B=[6 9; 32 4];

只需使用intersect with the rows options(和第二个输出)

[~, i, ~] = intersect(A(:, 1:2), B, 'rows')

我已经对A的前两列进行了编入索引,因为您只对这些列感兴趣而且明显相交,希望两个矩阵具有相同的列数。

结果:

i =

     5
     2

答案 1 :(得分:1)

也将B放在矩阵格式中,例如:

B=[6 9; 32 4];

以下是可用于执行此操作的MATLAB代码:

 k=0;
 output=[];
 for n=1:5
   for m=1:2 
     if (sum(A(n,1:2)==B(m,:)) == 2)
       k = k +1;
       output(k) = n;
     end
    end
  end

您的结果位于output


修改

我添加了对行(sum(A(n,1:2)==B(m,:)) == 2)的解释。让我们一块一块地看一下。 A(n, 1:2)为我们提供了一个1x2向量,它是A第n行的前两列。 B(m,:)也是1x2向量,因为B只有两列。因此,我们现在说[6 9]的最后一行A[6 9]的第一行B

在命令行中尝试[6 9] == [6 9]。结果是一个逻辑向量:[1 1]。原因是==将逐元素地比较向量。所以第一个是因为6等于6而第二个告诉我们9s是相等的。如果您尝试[6 9] == [7 9],您将获得[0 1]因为第一个元素现在不同了。

因此,为了评估BOTH元素是否相同,我们期望从==运算符得到的向量之和等于2。如果它等于1然后只有一个元素是相同的,我们需要它是2来表示整个向量是相等的(2因为向量只有2个元素)。因此sum([6 9] == [6 9])提供2,但sum([7 9] == [6 9])仅提供1

因此,测试行相等性的条件是if (sum(A(n,1:2)==B(m,:)) == 2)