目前我的.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},则可以。
答案 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
所有可能的输入符合以下条件:
如果是这种情况,您可以通过消除最外层循环来使这段代码更快。也就是说,将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