列出所有n个整数对的最快解决方案?

时间:2015-02-13 18:26:27

标签: performance matlab matrix combinations combinatorics

我想列出所有可能的整数[1, n]n。我发现自己在寻找最快的选择。这就是我到目前为止所提出的。

由于爆炸性的组合数量,Matlab的nchoosekcombnk方法建议n<15列出所有可能的组合。所以这有多快取决于n。

pair = nchoosek(1:n, 2);

另一个选择是使用嵌套for循环

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];

将这些方法定时循环,每次使用n=1000 10次,我最快到最慢

  1. ind2sub(0.15秒)
  2. for loop(16.3 sec)
  3. nchoosek(16.8秒)
  4. 似乎ind2sub是远射的最快方式。出于好奇,有什么其他选择可能会更快或更快?

1 个答案:

答案 0 :(得分:4)

替换nchoosek(1:N,2)

使用bsxfun -

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

仅限trilfind(不含ind2sub) -

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