C++ 压缩嵌套循环
我正在尝试转换这3个循环:C++ 压缩嵌套循环,c++,c,loops,for-loop,optimization,C++,C,Loops,For Loop,Optimization,我正在尝试转换这3个循环: for (a = 1; a < amax; a++) { for (b = 1; b < bmax; b++) { for (c = 1; c < cmax; c++) { ... } } } (a=1;a
for (a = 1; a < amax; a++) {
for (b = 1; b < bmax; b++) {
for (c = 1; c < cmax; c++) {
...
}
}
}
(a=1;a{
对于(b=1;b
到单个循环
我试过这个:
for (abc = 0; abc < (amax * bmax * cmax); ++abc)
{
a = abc / (bmax * cmax) + 1;
b = (abc % (bmax * cmax)) / cmax + 1;
c = (abc % (bmax * cmax)) % cmax + 1;
...
}
for(abc=0;abc<(amax*bmax*cmax);+abc)
{
a=abc/(bmax*cmax)+1;
b=(abc%(bmax*cmax))/cmax+1;
c=(abc%(bmax*cmax))%cmax+1;
...
}
然而,这并不等同。逻辑错误在哪里?a
循环有amax-1
迭代,而不是amax
迭代。b
和c
循环也一样。因此,单个循环应该有(amax-1)*(bmax-1)*(cmax-1)
迭代
要提取a
,b
和c
值将单循环索引视为一个混合基数(乘以以找到迭代次数的基数),即简单的整数除法和余数运算
在每个结果值上加1。第一个循环的运行次数远远少于第二个循环 想象
int amax = 3;
int bmax = 3;
int cmax = 3;
第一个循环有2,2,2=8次迭代
第二个循环将运行0到(3*3*3=27)
,即27次
此外,在a、b、c校验的计算中也存在一些其他问题。以下/注意abc从1开始,条件是b=(abc%(bmax*cmax))/cmax+1代码>应该是b=(abc%(amax*cmax))/cmax+1代码>同样适用于c:c=(abc%(amax*bmax))%cmax+1代码>Discalaimer:并不是说它们现在是等价的(可能会有更多的错误)。增加一堆划分不是更悲观吗?而且它的启动可读性要差得多。@DanMašek是的,这通常是个坏主意,但是这是一个必要的破解,因为我想使用OpenMP parallel for(而且OpenMP 2.0不支持折叠操作符)。从
使用div()
有什么好处吗<代码>div_t r1=div(abc,(bmax*cmax);div_t r2=div(r1.rem,cmax);
?
int x = 1;
amax-=1;
bmax-=1;
cmax-=1;
int a = 1, b = 1, c = 1;
for (int abc = 1; abc <= (amax * bmax * cmax); ++abc)
{
c = abc % cmax;
c = c != 0 ? c : cmax;
var m = ' a='+a+' b='+b+' c='+c+' ::::'+(x++);
printf("%s\n", m);
a = abc < (bmax*cmax) || abc % ((bmax*cmax)) != 0 ? a : (a + 1) % amax;
a = a != 0 ? a : amax;
b = abc < cmax || abc % (cmax) != 0 ? b : (b + 1) % bmax;
b = b != 0 ? b : bmax;
}