0

我有一个 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 && 2 列设置查询A并将它们与 进行比较B,因此输出是在第 1 列和第 2 列中具有相同值的行的索引,其中 Xk,Yk 在B

输出:5,2

4

2 回答 2

2

按照@TJ1 的建议将 B 设为矩阵

B=[6 9; 32 4];

只需使用与行选项相交(和第二个输出)

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

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

结果:

i =

     5
     2
于 2013-02-05T06:19:07.297 回答
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 向量,它是 的第 n 行的前两列AB(m,:)也是一个 1x2 向量,因为 B 只有两列。所以假设我们现在[6 9]从最后一行A[6 9]第一行开始B

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

因此,为了评估两个元素是否相同,我们期望运算符产生的向量之和==等于 2。如果它等于 1,那么只有一个元素是相同的,我们需要它为 2 来表示整个向量相等(2 因为向量只有 2 个元素)。所以sum([6 9] == [6 9])2sum([7 9] == [6 9])只给1

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

于 2013-02-05T06:02:51.197 回答