Matlab加速嵌套循环

Matlab加速嵌套循环,matlab,Matlab,我有下面的嵌套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 = i

我有下面的嵌套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

此答案是上述评论的摘要,建议如下:

<>在Matlab中为循环加快嵌套<代码>,首先要考虑的内容包括: 数组/矩阵是否在循环中增长? 是否可以使用现有的MATLAB函数对整个计算进行矢量化

第一个问题的答案是肯定的,
number
在最里面的循环中一次增长一行。在这种情况下,一旦第一个问题得到解决,第二个问题的答案就变得无关紧要了

如果在最里面的循环中仅使用
ndx
,而不是
number
,运行上述代码,您将发现将获得的总行数是13983816,并且计算速度非常快。为了防止
number
在循环中增长,这需要相当昂贵的内存操作,您可以在代码前面加上:
number=0(13983816,6)
这将创建一个
double
矩阵,该矩阵的大小与您将得到的矩阵大小相同,但只有
0
条目。因为您知道所有条目都是从1到49,所以数据类型不必是
double
uint8
就足够了(对于0到255之间的值;HT:Amro)

因此,代码的第一行应该是:

number=0(13983816,6,'uint8')

那么整个代码的执行只需要几秒钟


注:对于上面的第二个问题,确实有一个现有的MATLAB函数来完成上述代码所做的工作,即找到所有组合,从49个数字中选择6个,不重复,不考虑顺序(德国彩票?),但它是否效率较低,因此仅适用于比49小得多的n:
nchoosek
,对于两个标量输入,计算元素的数量(即
nchoosek(49,6)==13983816
)和向量(此处:
1:49
)一个标量给出了一个包含实际组合的矩阵。

这个答案是上述评论的摘要,如建议的:

<>在Matlab中为循环加快嵌套<代码>,首先要考虑的内容包括: 数组/矩阵是否在循环中增长? 是否可以使用现有的MATLAB函数对整个计算进行矢量化

第一个问题的答案是肯定的,
number
在最里面的循环中一次增长一行。在这种情况下,一旦第一个问题得到解决,第二个问题的答案就变得无关紧要了

如果在最里面的循环中仅使用
ndx
,而不是
number
,运行上述代码,您将发现将获得的总行数是13983816,并且计算速度非常快。为了防止
number
在循环中增长,这需要相当昂贵的内存操作,您可以在代码前面加上:
number=0(13983816,6)
这将创建一个
double
矩阵,该矩阵的大小与您将得到的矩阵大小相同,但只有
0
条目。因为您知道所有条目都是从1到49,所以数据类型不必是
double
uint8
就足够了(对于0到255之间的值;HT:Amro)

因此,代码的第一行应该是:

number=0(13983816,6,'uint8')

那么整个代码的执行只需要几秒钟


注:对于上面的第二个问题,确实有一个现有的MATLAB函数来完成上述代码所做的工作,即找到所有组合,从49个数字中选择6个,不重复,不考虑顺序(德国彩票?),但是它的效率更低,因此只适用于比49小得多的n:
nchoosek
,对于两个标量输入,它计算元素的数量(即
nchoosek(49,6)==13983816
),对于向量(这里:
1:49
),标量给出一个具有实际组合的矩阵。

当然有。您可以像这样预先分配
数字:
n=49;数字=零((n-5)*(n-4)*(n-3)*(n-2)*(n-1)*n/(1*2*3*4*5*6),6)(另请参见)。这将使您的评估速度提高几个数量级。要真正有效地实现你想要的,告诉我们你想要什么会更有帮助,而不是让我们猜测和只告诉你为实现它做了什么。@user804903:噢,天哪!这是一个相当混乱的循环集你那里。。。如果你能用语言(数学会更好)解释你要做的事情,可能会有所帮助。我认为这里的任何人都没有时间去遍历循环并遵循逻辑。@arne.b:如果使用无符号整数,甚至可以将空间需求减少八倍:
number=zero(13983816,6,'uint8')
@yoda:n=49时,他想要的是
nchoosek(1:n,6)
(根据其文档,“仅适用于n小于15的情况)。(我发现运行足够小的n的代码,而不是读取它。)@arne.b:一旦矩阵被预先分配,循环似乎相当快。整个过程只花了一秒钟多一点。你应该把它作为答案贴出来。当然有。您可以像这样预先分配
数字:
n=49;数字=零((n-5)*(n-4)*(n-3)*(n-2)*(n-1)*n/(1*2*3*4*5*6),6)(另请参见)。这将使您的评估速度提高几个数量级。要真正有效地实现你想要的,告诉我们你想要什么会更有帮助,而不是让我们猜测和只告诉你为实现它做了什么。@user804903:噢,天哪!这是一个相当混乱的循环集你那里。。。如果你用文字解释(数学会更好)你想做的事情,那可能会有帮助。我认为这里的任何人都没有时间涉过这些循环并遵循逻辑。@arne.b:你甚至可以减少空间