2015-02-13 1 views
3

Я хочу перечислить все возможные пары целых чисел [1, n] с большим n. Я нахожу, что ищу самый быстрый вариант. Это то, к чему я придумал.Самое быстрое решение для перечисления всех пар n целых чисел?

Методы Matlab's nchoosek и combnk рекомендуют n<15 для перечисления всех возможных комбинаций из-за взрывного количества комбинаций. Итак, как быстро это зависит от n.

pair = nchoosek(1:n, 2); 

Другим вариантом было бы использовать вложенный цикл

kk =1; 
pair = zeros(nchoosek(n, 2), 2); 
for ii = 1:n 
    for jj = ii+1:n 
     pair(kk, :) = [ii, jj]; 
     kk = kk + 1; 
    end 
end 

Это будет относительно медленным.

Я также подумал о использовании функции ind2sub непосредственно

pair_adjacency = tril(ones(n), -1); 
[x, y] = ind2sub(size(pair_adjacency), find(pair_adjacency==1)); 
pair = [x, y]; 

Timing эти методы в цикле, в 10 раз каждый с n=1000, я быстро к самому медленному

  1. ind2sub (0,15 сек)
  2. для петли (16,3 сек)
  3. nchoosek (16,8 сек)

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

ответ

4

Для замены nchoosek(1:N,2)

С bsxfun -

[Y,X] = find(bsxfun(@gt,[1:N]',[1:N])) 
pair = [X, Y]; 

С tril и find только (без ind2sub) -

[y,x] = find(tril(true(N),-1)) 
pair = [X, Y]; 
+0

Самый универсальный 'снова bsxfun'! –

+0

Speedy! Я использую ту же настройку, что и раньше. – Cecilia

+0

wow вы набираете быстрее, чем я думаю, ха-ха очень приятно! –

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