【发布时间】:2011-06-18 22:22:27
【问题描述】:
我有以下嵌套的 for 循环程序,它需要永远运行。有没有更好(更有效)的方式来编码?
tic
ndx = 0;
for i1 = 1 : 49 - 5
for i2 = i1 + 1 : 49 - 4
for i3 = i2 + 1 : 49 - 3
for i4 = i3 + 1 : 49 - 2
for i5 = i4 + 1 : 49 - 1
for i6 = i5 + 1 : 49 - 0
ndx = ndx +1;
number(ndx,1) = i1;
number(ndx,2) = i2;
number(ndx,3) = i3;
number(ndx,4) = i4;
number(ndx,5) = i5;
number(ndx,6) = i6;
% display([int2str(number(ndx,1)), ' ', int2str(number(ndx,2)), ...
% ' ', int2str(number(ndx,3)), ' ', int2str(number(ndx,4)),...
% ' ', int2str(number(ndx,5)), ' ', int2str(number(ndx,6)) ])
end
end
end
end
end
end
toc
【问题讨论】:
-
当然有。您可以像这样预分配
numbers:n=49;number=zeros((n-5)*(n-4)*(n-3)*(n-2)*(n-1)*n/(1*2*3*4*5*6),6);(另请参阅this question)。这将使您的评估速度提高几个数量级。要真正有效地实现你想要的,告诉我们你想要什么会更有帮助,而不是让我们猜测并只告诉你为了实现它做了什么。 -
@user804903:天哪!那是你到达那里的一组相当混乱的循环......如果你用文字解释(数学会更好)你正在尝试做什么,它可能会有所帮助。我认为这里没有人有时间涉足循环并遵循逻辑。
-
@arne.b:如果使用无符号整数,您甚至可以将空间需求减少八倍:
number=zeros(13983816,6,'uint8'); -
@yoda:他想要的是
nchoosek(1:n,6)(根据其文档,“仅适用于 N 小于约 15 的情况”)对于 n=49。 (我发现这是为了运行足够小的 n 的代码,而不是阅读它)。 -
@arne.b:一旦预先分配了矩阵,循环似乎相当快。整个事情只花了一秒钟多一点。您应该将其发布为答案。
标签: matlab