2013-02-24 2 views
1

У меня есть два очень длинных 2D-списка, называемых «first_data *» и «second_data», и я бы хотел найти равные элементы и поместить их в список «final_data». У меня есть MWE здесь:размещение общих элементов в 2D-массивах

first_data = [1 2; 3 4]'; 
second_data = [1 2; 9 4]'; 


final = []; 
for i=1:length(first_data(:, 1)) 
    for j=1:length(second_data(:, 1)) 
     if(first_data(i, 2) == second_data(j, 2)) 
      final = [final first_data(i, 1)]; 
     end 
    end 
end 

Это дает мне 2, по желанию. Это работает, но это очень интенсивно вычислительно для очень больших наборов данных. Есть ли более эффективный способ написать вышеприведенный код?

+0

Вы уверены, что пример кода работает? Вы объявляете 'final_data' и указываете его как' final' в блоке 'if'. Пример ввода данных для двух массивов также будет полезен, если решение из моего ответа не будет работать правильно для вас. – harpun

+0

@harpun Я уточнил свой вопрос и добавил небольшой пример, который работает – BillyJean

+0

В массивах есть три общих элемента. Не должен ли быть ответ [1, 2, 4] вместо [2]? – harpun

ответ

1

ismember позволит вам делать то, что вы хотите.

%# identify the rows in first_data's second column 
%# that occur in second_data's second column 
goodIdx = ismember(first_data(:,2),second_data(:,2)); 

%# return the corresponding values of first_data's first column 
final = first_data(goodIdx,1); 
+0

goodIdx имеет форму [0 0 ... 1 ... 0], но если я вручную вызову final = first_data ([0 1], 1), то я получаю сообщение об ошибке. Почему это? – BillyJean

+1

@ niles_1710373: 'goodIdx' - логический вектор. 'final_data (логический ([0 1]))' будет работать. – Jonas

0

использование:

[c, ia, ib] = intersect(first_data(:, 2), second_data(:, 2)); 
final = second_data(ib,1); 

Примечание: Я не проверял это, но он должен работать (по крайней мере, до строк/столбцов) mixups

1

Попробуйте этот код:

first_data = [1 2; 3 4]'; 
second_data = [1 2; 9 4]'; 
diff_data=first_data-second_data; 
Ind=find(diff_data==0); 
final=first_data(Ind); 
0

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

«first_data» описывается (i,j,data_1) - что указывает на то, что значение данные_1 находится в строке I, столбец J

«second_data», описанной (i,j,data_2)

И вы хотите, чтобы найти такие кортежи, которые равны?

Convert «first_data», и «second_data» для множеств с использованием Bloom Filter

Выполните пересечения множеств с помощью Bloom фильтра представления «first_data» и «second_data» и получить по существу постоянного времени, что пересечение с использованием побитовая И двух представлений.

Смежные вопросы