比较matlab中两个不匹配的矩阵

时间:2012-09-13 22:44:51

标签: matlab

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

1 个答案:

答案 0 :(得分: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的第1列中每个元素与B的第1列中每个元素的绝对差值:

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的某个元素的容差范围内定义匹配。通过仅保留矩阵中的第一个匹配来拒绝多个匹配(您可以扩展为保持随机的匹配)。

这意味着如果您在某个A中找到B中的匹配项,请忽略此特定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