удалить несоответствующие элементы из матрицы - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь сравнить две матрицы A и B.Если элементы в первых двух столбцах A совпадают с элементами в B, я хочу удалить все несоответствующие строки из A.Третий столбец в B не должен учитываться при сравнении.

A = [1 2 3      B = [1 2 8
     3 4 5           3 4 5]
     6 7 8]

Желаемый результат:

A = [1 2 3
     3 4 5]

До сих пор я нашел только способы удаления повторяющихся записей, что является полной противоположностью того, что я хочу.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Вы можете эффективно использовать ismember для этой задачи:

% Input matrices
A = [1 2 3; 3 4 5; 7 8 9];
B = [1 2 8; 3 4 5];

A1 = A(:,1:2);                   % Extract first two columns for both matrices
B1 = B(:,1:2);
[~,ii] = ismember(A1,B1,'rows'); % Returns which rows in A1 are also in B1
ii = ii(ii>0);                   % Where ii is zero, it's a non-matching row
A(ii,:)                          % Index to keep only matching rows

Все это можно написать более компактно, но я хотел показать пошаговый процесспервый:

[~,ii] = ismember(A(:,1:2),B(:,1:2),'rows');
A(ii(ii>0),:)
0 голосов
/ 18 октября 2018
A = [1 2 3;3 4 5;7 8 9];
B = [1 2 8; 3 4 5];
tmp = min([size(A,1) size(B,1)]); % get size to loop over
k = false(tmp,1); % storage counter
for ii = 1:tmp 
    if all(A(ii,1:2)==B(ii,1:2)) % if the first two columns match
        k(ii)=true; % store
    end
end

C = A(k,:) % extract requested rows
...