-1

我有两个尺寸不匹配的矩阵。A 是 16x2 矩阵,B 是 17x2 矩阵。首先,我想在 A 和 B 的第一列中找到任何数字,例如 leq 90。假设 A 的第一列中有 8 个数字,B 的第一列有 6 个数字,即 leq 150。然后我希望能够将 A 与 B 进行比较,如果 A 中的任何数字在B(仅第一列)然后我想将该数字保留在 A 中,否则删除 A 中的整行。例如,如果 A 中第一列中的 8 个数字 = [25, 34, 45, 55, 66, 75, 84, 110] 和 B = [10, 30, 50, 70, 90, 110] 并且想找到任意两个在 +-5 范围内的数字一次得到结果 C= [34, 45, 66、84、110]。请注意,我需要 45 或 55 但不是两者都需要。C 当然是一个 2x1 矩阵,但第 2 列中的值与比较无关。谢谢

4

1 回答 1

0

让我们假设检查后的 A 和 B 矩阵如下所示(根据您的值)

A = [[25; 34; 45; 55; 66; 75; 84; 110] (1:8)']; % size 8 x 2  
B = [[10; 30; 50; 70; 90; 110] (1:6)']; % size 6 x 2 

定义容差并创建一个 8 x 6 矩阵,将 A 的第一列中的每个元素与 B 的第一列中的每个元素的绝对差值进行比较:

tol = 5;
C = abs(bsxfun(@minus, A(:,1), B(:,1)'))<=tol;

>> C

C =

     0     1     0     0     0     0
     0     1     0     0     0     0
     0     0     1     0     0     0
     0     0     1     0     0     0
     0     0     0     1     0     0
     0     0     0     1     0     0
     0     0     0     0     0     0
     0     0     0     0     0     1

上面的每个元素==1 定义了 B 的某些元素的容差范围内的匹配。通过仅保留矩阵中的第一个匹配来拒绝多个匹配(您可以扩展为保留随机匹配)。

这意味着如果您在 B 中找到某些 A 的匹配项,请忽略此特定 A 的所有其他 B

D = C; % initialize matrix of unique elements
for i = 1:size(C,1)-1 
    D(i+1:end, C(i,:)) = 0; % if more than one match, keep only first
end

 D =

     0     1     0     0     0     0
     0     0     0     0     0     0
     0     0     1     0     0     0
     0     0     0     0     0     0
     0     0     0     1     0     0
     0     0     0     0     0     0
     0     0     0     0     0     0
     0     0     0     0     0     1

最后,使用 any 仅指定 D 中的那些行,即 A 中的元素在 B 中至少有一个匹配项并拒绝所有其他行

A(~any(D, 2), :) = []; % reject points that don't match 

>> A

A =

    25     1
    45     3
    66     5
   110     8
于 2012-09-13T23:41:28.353 回答