次元が一致しない 2 つのマトリックスがあります。A は 16x2 の行列で、B は 17x2 の行列です。まず、たとえば leq 90 である A と B の最初の列の数字を見つけたいと思います。A の最初の列に 8 つの数値があり、B の最初の列に leq 150 である 6 つの数値があるとします。次に、A のいずれかの数値がB (最初の列のみ) の場合、その数値を A に保持したい場合は、A の行全体を削除します。たとえば、A の最初の列の 8 つの数値 = [25, 34, 45, 55, 66, 75, 84, 110] と B = [10, 30, 50, 70, 90, 110] のそれで、結果 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
許容誤差を定義し、A の 1 列目のすべての要素と B の 1 列目のすべての要素の絶対差を比較する 8 x 6 行列を作成します。
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
上記の各 element==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 に少なくとも 1 つの一致があり、それ以外はすべて拒否します。
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 に答える