我有一个包含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
答案 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)