-1

次元が一致しない 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 の値は比較には関係ありません。ありがとうございました

4

1 に答える 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 に答える