查找矩阵中多个值对的所有索引
find all indices of multiple value pairs in a matrix
假设我有一个包含可能值对的矩阵 A 和一个包含所有值对的矩阵 B:
A = [1,1;2,2;3,3];
B = [1,1;3,4;2,2;1,1];
我想创建一个矩阵 C,其中包含 A 允许的所有对(即 C = [1,1;2,2;1,1])。
使用 C = ismember(A,B,'rows') 只会显示第一次出现的 1,1,但我需要两者。
目前我使用 for-loop 来创建 C,它看起来像:
TFtot = false(size(B(:,1,1),1);
for i = 1:size(a(:,1),1)
TF1 = A(i,1) == B(:,1) & A(i,2) = B(:,2);
TFtot = TF1 | TFtot;
end
C = B(TFtot,:);
我想创建一个更快的方法,因为这个循环目前大大减慢了算法。
你很接近。您只需要交换 B
和 A
,然后使用此输出索引到 B
:
L = ismember(B, A, 'rows');
C = B(L,:);
在这种特殊情况下,ismember
的工作原理是它输出一个 logical
向量,该向量的行数与 B
相同,其中第 i B
中的值告诉您我们是否在 A
(logical
1) 的某处找到了第 ith 行,或者我们是否没有找不到此行 (logical
0)。
您想 select 取出 B
中出现在 A
中的那些条目,因此您只需使用 ismember
的输出切入 B
提取受影响的行,并获取所有列。
我们得到 C
:
>> C
C =
1 1
2 2
1 1
这是使用 bsxfun
的替代方法:
C = B(all(any(bsxfun(@eq, B, permute(A, [3 2 1])),3),2),:);
或者您可以使用 pdist2
(统计工具箱):
B(any(~pdist2(A,B),1),:);
使用matrix-multiplication based euclidean distance calculations
-
Bt = B.'; %//'
[m,n] = size(A);
dists = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt];
C = B(any(dists==0,1),:);
假设我有一个包含可能值对的矩阵 A 和一个包含所有值对的矩阵 B:
A = [1,1;2,2;3,3];
B = [1,1;3,4;2,2;1,1];
我想创建一个矩阵 C,其中包含 A 允许的所有对(即 C = [1,1;2,2;1,1])。
使用 C = ismember(A,B,'rows') 只会显示第一次出现的 1,1,但我需要两者。
目前我使用 for-loop 来创建 C,它看起来像:
TFtot = false(size(B(:,1,1),1);
for i = 1:size(a(:,1),1)
TF1 = A(i,1) == B(:,1) & A(i,2) = B(:,2);
TFtot = TF1 | TFtot;
end
C = B(TFtot,:);
我想创建一个更快的方法,因为这个循环目前大大减慢了算法。
你很接近。您只需要交换 B
和 A
,然后使用此输出索引到 B
:
L = ismember(B, A, 'rows');
C = B(L,:);
在这种特殊情况下,ismember
的工作原理是它输出一个 logical
向量,该向量的行数与 B
相同,其中第 i B
中的值告诉您我们是否在 A
(logical
1) 的某处找到了第 ith 行,或者我们是否没有找不到此行 (logical
0)。
您想 select 取出 B
中出现在 A
中的那些条目,因此您只需使用 ismember
的输出切入 B
提取受影响的行,并获取所有列。
我们得到 C
:
>> C
C =
1 1
2 2
1 1
这是使用 bsxfun
的替代方法:
C = B(all(any(bsxfun(@eq, B, permute(A, [3 2 1])),3),2),:);
或者您可以使用 pdist2
(统计工具箱):
B(any(~pdist2(A,B),1),:);
使用matrix-multiplication based euclidean distance calculations
-
Bt = B.'; %//'
[m,n] = size(A);
dists = [A.^2 ones(size(A)) -2*A ]*[ones(size(Bt)) ; Bt.^2 ; Bt];
C = B(any(dists==0,1),:);