Как сравнить элементы одной строки с каждой другой строкой в ​​той же матрице - PullRequest
4 голосов
/ 17 ноября 2009

У меня есть матрица:

a = [ 1 2 3 4;
      2 4 5 6;
      4 6 8 9]

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

Ответы [ 2 ]

4 голосов
/ 17 ноября 2009

Используя идею @ gnovice о получении всех комбинаций с помощью nchoosek , я предлагаю еще два решения:

  • один использует ismember (как отмечено @ loren )
  • другой использует bsxfun с ручкой функции eq

Единственное отличие состоит в том, что пересекает сортирует и сохраняет только уникальные общие ключи.

a = randi(30, [100 20]);
%# a = sort(a,2);

comparisons = nchoosek(1:size(a,1),2);
N = size(comparisons,1);
keys1 = cell(N,1);
keys2 = cell(N,1);
keys3 = cell(N,1);

tic
for i=1:N
    keys1{i} = intersect(a(comparisons(i,1),:),a(comparisons(i,2),:));
end
toc

tic
for i=1:N
    query = a(comparisons(i,1),:);
    set = a(comparisons(i,2),:);
    keys2{i} = query( ismember(query, set) );             %# unique(...)
end
toc


tic
for i=1:N
    query = a(comparisons(i,1),:);
    set = a(comparisons(i,2),:)';
    keys3{i} = query( any(bsxfun(@eq, query, set),1) );   %'# unique(...)
end
toc

... со следующими временными сравнениями:

Elapsed time is 0.713333 seconds.
Elapsed time is 0.289812 seconds.
Elapsed time is 0.135602 seconds.

Обратите внимание, что даже предварительно отсортировав a и добавив вызов к unique внутри циклов (прокомментированных частей), эти два метода все еще быстрее, чем intersect.

3 голосов
/ 17 ноября 2009

Вот одно решение (которое обобщается на матрицы большего размера, чем образец в вопросе):

comparisons = nchoosek(1:size(a,1),2);
N = size(comparisons,1);
keys = cell(N,1);
for i = 1:N
  keys{i} = intersect(a(comparisons(i,1),:),a(comparisons(i,2),:));
end

Функция NCHOOSEK используется для генерации всех уникальных комбинаций сравнений строк. Для матрицы a в вашем вопросе вы получите comparisons = [1 2; 1 3; 2 3], что означает, что нам нужно сравнить строки 1 и 2, затем 1 и 3 и, наконец, 2 и 3. keys - это массив ячеек , в котором хранятся результаты каждого сравнения. Для каждого сравнения функция INTERSECT используется для поиска общих значений (то есть клавиш). Для матрицы a, приведенной в вопросе, вы получите keys = {[2 4], 4, [4 6]}.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...