Matlab,替代嵌套for循环

时间:2012-04-01 01:19:28

标签: matlab for-loop nested

目前我的.m文件看起来像这样

 for a = 1 : 47
  for b = a+1 : 48
   for c = b+1 : 49
    for d = c+1 : 50
     fprintf('%d %d %d %d \n',a,b,c,d);
    end
   end
  end

我正在尝试从1,2,3,... 50生成4个元素的集合 即{1,2,3,4},{1,2,3,5},...... {1,2,3,50},{1,2,4,5},... {47,48 ,49,50}。因此,总共存在C(50,4)组。我想知道是否有比这4个嵌套循环更快的替代方案?一组中的顺序不一定按递增顺序排列。即如果代码生成{4,1,2,3}而不是{1,2,3,4},则可以。

2 个答案:

答案 0 :(得分:1)

有趣的问题!

列举所有可能的组合已得到充分研究,并且有许多解决方案。请参阅示例this SO question。这是一个简单有效的解决方案,使用两个方便的Matlab函数nchoosek和arrayfun合理选择N,k:

% test function for benchmarking
foo = @(a, b, c, d) ( a + b + c + d );

% see detailed timings at https://gist.github.com/2295957
tic;
C = nchoosek([1:50], 4);     % all 230,300 4-tuple combinations
result = arrayfun(@(k) foo(C(k,1),C(k,2),C(k,3),C(k,4)), 1:length(C));
toc;

答案 1 :(得分:0)

看起来代码的目的可以表示为调用SomeFunction所有可能的输入符合以下条件:

  1. A< B< C< d
  2. D <= 50
  3. (暗示,A,B,C,D为整数)
  4. 如果是这种情况,您可以通过消除最外层循环来使这段代码更快。也就是说,将for N = 1:50替换为N = 50。实际上,您多次调用相同的组合。例如,将第一行替换为N = 4:6会返回以下结果(“*”ed行重复):

     A     B     C     D
     N=4
     1     2     3     4
    
     N=5
     1     2     3     4 *
     1     2     3     5
     1     2     4     5
     1     3     4     5
     2     3     4     5
    
     N=6
     1     2     3     4 *
     1     2     3     5 *
     1     2     3     6
     1     2     4     5 *
     1     2     4     6 
     1     2     5     6
     1     3     4     5 *
     1     3     4     6 
     1     3     5     6
     1     4     5     6
     2     3     4     5 *
     2     3     4     6
     2     3     5     6
     2     4     5     6
     3     4     5     6