我有两个尺寸不匹配的矩阵。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 列中的值与比较无关。谢谢
问问题
1243 次
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 回答