在matlab中比较不同大小的矩阵并存储接近

时间:2017-04-26 22:34:34

标签: matlab for-loop matrix

我有两个矩阵A和B.A(:,1)对应于x坐标,A(:,2)对应于y坐标,A(:,3)对应于某个半径。连续的所有三个值都描述相同的圆。现在让我们说......

A =

[1,4,3]

[8,8,7]

[3,6,3]

B =

[1,3,3]

[1,92,3]

[4,57,8]

[5,62,1]

[3,4,6]

[9,8,7]

我需要的是能够循环遍历矩阵A并确定矩阵B中是否有任何与x值相似的“相似”行在x值的范围(-2,2)内A(与y坐标和半径相同)。如果它满足所有这三个条件,它将被添加到一个新的矩阵中,其值在A中。所以例如我需要返回上面的数据。

ans =

[1,4,3]

[8,8,7]

请提前帮助并感谢任何愿意花时间的人!

3 个答案:

答案 0 :(得分:2)

您可以使用ismembertol

result = A(ismembertol(A,B,2,'ByRows',1,'DataScale',1),:)

答案 1 :(得分:1)

手动方法

A = [1,4,3;
     8,8,7;
     3,6,3];
B = [1,3,3;
     1,92,3;
     4,57,8;
     5,62,1;
     3,4,6;
     9,8,7]; % example matrices
t = 2;       % desired threshold
m = any(all(abs(bsxfun(@minus, A, permute(B, [3 2 1])))<=t, 2), 3);
result = A(m,:);

关键是使用permuteB的第一维移动到第三维。然后bsxfun计算原始矩阵中所有行对的元素差异。如果allA的{​​{3}}列的绝对差异小于所需的阈值B,则应选择t行。生成的变量many,用于选择这些行。

使用pdist2(统计和机器学习工具箱)

m = any(pdist2(A, B, 'chebychev')<=t, 2);
result = A(m,:);

具有chebychev选项的logical index函数计算行对之间的最大坐标差异(pdist2Chebychev distance)。

答案 2 :(得分:0)

使用for循环

应该有效:

A = [1,4,3;
     8,8,7;
     3,6,3]
B = [1,3,3;
     1,92,3;
     4,57,8;
     5,62,1;
     3,4,6;
     9,8,7]
index = 1;
for i = 1:size(A,1) 
  C = abs(B - A(i,:));
  if any(max(C,[],2)<=2)
    out(index,:) = A(i,:);
    index = index + 1
  end
end

对于A的每一行,计算B与该行之间的绝对差值,然后检查是否存在最大值小于2的行。

没有for循环

ind = any(max(abs(B - permute(A,[3 2 1])),[],2)<=2);
out = A(ind(:),:);