【问题标题】:Get points which are within a given distance in two different matrices获取两个不同矩阵中给定距离内的点
【发布时间】:2017-11-23 10:25:03
【问题描述】:

我有两个矩阵AB,其中行数可以变化。 AB 不一定具有相同的行数。

例如:

A = [ 110    90
      130   140
      230    50
      370   210 ];
B = [ 321    95
      102    35
      303   200 ];

现在矩阵AB 有“对应点”。对应点是两个矩阵的第二列中的值在+/-20 内的行。

例如:

  • A(1,2) = 90B(1,2) = 95,区别在+/-20 之内,所以A(1,:)B(1,:) 是对应点。
  • A(2,2) = 140B(2,2) = 35,区别是 not+/-20 内,所以 A(2,:)B(2,:)对应点。
  • A(3,2) = 50B(2,2) = 35,区别在+/-20 之内,所以A(3,:)B(2,:) 是对应点。

使用这个我想将AB的对应点分别存储在CD中。对于上面的示例,最终矩阵应如下所示:

C = [ 110    90
      230    50
      370   210 ]
D = [ 321    95
      102    35
      303   200 ]

【问题讨论】:

  • 他们在不同的列有什么意义?如果您只是在寻找彼此靠近的一维点,请将它们放入数组中,对其进行排序,然后在检查差异的同时遍历。
  • @Carlos 但是你可以得到两个点,都在AB 内,是彼此的“对应点”。根据问题的定义,这将是错误的。
  • 啊,我现在明白了。我认为现在更清楚了。

标签: matlab matrix


【解决方案1】:

您可以使用pdist2获取所有距离

dists = pdist2( A(:,2), B(:,2) )
>> dists = [  5    55   110
             45   105    60
             45    15   150
            115   175    10 ]

然后获取所有“对应点”的索引,由阈值 20 定义。

% Get combinations within tolerance
idx = dists < 20;
% Get indices  
[iA, iB] = find(idx);

然后你可以创建最终的矩阵

C = A(iA, :);
D = B(iB, :);


编辑:确保每个配对都是唯一的一种方法(即A(1,:) 不能与来自B 的多行配对)是为每行/列获取最小值dists .注意:如果距离完全相同,这仍然会给你重复匹配,你还没有定义应该如何处理。

dists = pdist2( A(:,2), B(:,2) );
% Set values which are greater than the row/column minima to be infinity.
% This means they will never be within the tolerance of 20 (or whatever else)
dists ( bsxfun(@gt, dists, min(dists,[],1)) | bsxfun(@gt, dists, min(dists,[],2)) ) = Inf;
% In MATLAB versions > 2016b, you can use implicit expansion to replace bsxfun
% That would be: dists( dists > min(dists,[],1) | dists > min(dists,[],2) )

% Now continue as before
[iA, iB] = find( dists < 20 );
C = A(iA, :);
D = B(iB, :); 

【讨论】:

  • 好。不知道哪个更好,不过可以把pdist2换成abs(B(:,2).'-A(:,2))
  • @Adiel 注意:当引入隐式扩展时,您不能在 MATLAB pre-R2016b 中这样做。如果您需要兼容性,则必须使用abs(bsxfun( @minus, B(:,2).', A(:,2) ))。那时,我会说pdist2 更简单!您可以使用edit pdist2 并查看第 370 行(在 2015b 中),如果您有兴趣,可以查看如何使用该方法计算距离(基本相同,均方根差)。
  • 你好@Wolfie,当我使用矩阵 A = [354,63; 541,310; 354,63; 354,63]; B = [183,301; 408,302; 541,310];我得到 iA =[2,2,2] 这在我的情况下不是真的,因为我在矩阵中最多有一个对应点。如何避免这种情况?
猜你喜欢
  • 2018-03-31
  • 1970-01-01
  • 2022-11-21
  • 2017-02-20
  • 1970-01-01
  • 2014-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多