为什么这个简单的循环需要这么多的时间?

32次(最后30天)
穆罕默德·哈桑
穆罕默德·哈桑 上2020年4月2日在23:01
为什么这个简单的循环带我这么多的时间?
N = 2 ^ 13;
IDX =细胞(2 * N-1,1);
对于I = 1:2 * n-1个
温度=零(I,2);
对于J = 1:我
如果J>时Ñ
IDX1 = 0;
其他
IDX1 = j的;
结束
如果I-J + 1>Ñ
IDX2 = 0;
其他
IDX2 = I-J + 1;
结束
温度(J,:)= [IDX1,IDX2];
结束
IDX {I} =温度;
结束

0评论

登入评论。

答案(1)

沃尔特·罗伯逊
沃尔特·罗伯逊 约21小时前
当我是一个特定的值,说男,那么你哆。玛循环迭代总数超过第j。如果我们说,每个循环迭代花费了时间“1”,那么他们的M个需要时间M.当我是一个少,M-1,那么你做的M-1的操作是什么,以及一个仍然较少,M-2,你没有为M-2的操作。操作通过执行i的时间总数= M是1 + 2 + 3 + 4 ... + M,它是M *(M + 1)/ 2。
因此,通过2 ^ 13的操作结束时,你正在做的2 ^ 13 *(2 ^ 13 + 1)/ 2 = 2 ^ 12 *(2 ^ 13 + 1)= 33558528的操作。
......这是要需要一段时间。
在我的系统中,n = 2 ^ 10耗费了约1/4秒,对于什么将是2 ^ 10 *(2 ^ 10 + 1)/ 2 = 524800操作。如果每个循环为恒定的时间,我们可以预测524800分之33558528* 0.25 =约15秒。
过去时间是14.064167秒。
足够近。

2条评论

穆罕默德·哈桑
穆罕默德·哈桑 约10小时前
有没有什么办法,使其更快?而不必求助于PARFOR循环。
沃尔特·罗伯逊
用逻辑测试量化。
或者认识到,可以拆分的代码段:
对于I = 1:n的
对于J = 1:我
j是所以你不需要测试它不是在这种情况下绝对不要较大
结束
结束
对于I = N + 1:2 * n-1个
对于J = 1:n的
j是所以你不需要测试它不是在这种情况下绝对不要较大
结束
对于J = n + 1个:ⅰ
j是总是比在此情况下,n越大,所以你并不需要对其进行测试
结束
结束
或者你可以做
对于I = 1:2 * n-1个
温度=零(I,2);
对于J = 1:我
如果I-J + 1>Ñ
IDX2 = 0;
其他
IDX2 = I-J + 1;
结束
温度(J,:)= [J,IDX2]
结束
温度(N + 1:结束,1)= 0;
IDX {I} =温度;
结束
也就是说,你让J值在你扎普量化的形式,后来分配始终,然后第一个索引 部分 它为0。

登入评论。

登入回答这个问题。

s manbetx 845


发布

R2019b