我有两个矩阵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]
请提前帮助并感谢任何愿意花时间的人!
答案 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,:);
关键是使用permute
将B
的第一维移动到第三维。然后bsxfun
计算原始矩阵中所有行对的元素差异。如果all
与A
的{{3}}列的绝对差异小于所需的阈值B
,则应选择t
行。生成的变量m
是any
,用于选择这些行。
pdist2
(统计和机器学习工具箱)m = any(pdist2(A, B, 'chebychev')<=t, 2);
result = A(m,:);
具有chebychev
选项的logical index函数计算行对之间的最大坐标差异(pdist2
或Chebychev distance)。
答案 2 :(得分:0)
应该有效:
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的行。
ind = any(max(abs(B - permute(A,[3 2 1])),[],2)<=2);
out = A(ind(:),:);