2013-11-12 2 views
0

У меня есть 2 набора столбцов в MATLAB, которые необходимо сопоставить. Существует несколько способов сделать это, если картирование не должно быть one-to-one. Мой пример ниже будет проиллюстрировать то, что я пытаюсь сделатьСовпадение 2 набора столбцов на основе ONE-to-ONE в MATLAB

mat1 = [ 100 734567 500 734567 23 
     1011 734568 200 734568 11 
     1011 734568 200 734568 23 
     1011 734568 200 734568 23 
     1011 734568 200 734568 34 
     1111 734569 300 734569 34 ] ; % ignore last column 

mat2 = [ 1011 734568 200 734568 
     1011 734568 200 734568 
     1011 734568 100 734568 
     1111 734569 300 734569 ] ; 

Мне нужно удалить эти строки из MAT1, которые были найдены в MAT2, а также на основе столбцов 1,2,3,4. Результат:

mat1 = [ 100 734567 500 734567 23 
     1011 734568 200 734568 23 
     1011 734568 200 734568 34 ] ; 

Возможным решением было включить row_ids 1,2,3 .. для уникальных строк, как показано ниже, но я не мог реализовать то же самое. Спасибо за вашу помощь! Фактические наборы данных являются большими и поэтому предпочтительным является векторизованное решение!

mat2 = [ 1011 734568 200 734568 1 
     1011 734568 200 734568 2 
     1011 734568 100 734568 1 
     1111 734569 300 734569 1 

ответ

1

Из вашего описания, я думаю, что вы хотите это:

mat1(~ismember(mat1(:,1:size(mat2,2)),mat2,'rows'),:) 

Однако, ваш пример результат меня смущает. Вторая и третья строки вашего результата присутствуют в mat2 (игнорируя последний столбец), поэтому их нужно удалить, правильно?

+0

-> для идентификатора 1011, строка 1,2,3 точно соответствует набору в mat2. Но так как mat2 имел только 2 из этих строк, только 2 из них были удалены из mat1. Пожалуйста, дайте мне знать, если все еще неясно. – Maddy

+0

@Maddy. Понимаю. Это сложнее –