C++ c++;未在嵌套for循环中更新向量

C++ c++;未在嵌套for循环中更新向量,c++,vector,for-loop,nested,C++,Vector,For Loop,Nested,因此,我创建并初始化一个向量(大小为nmask+3)为0,并为其中一个元素指定一个初始值。然后,我创建一个for循环,遍历向量的第一个nmask元素,并为每个元素分配向量中其他26个元素的平均值(由4D int数组voxt定义,其中包含向量地址) 我的问题是,当我在嵌套循环(第一个cout)中检查向量(phi)中非零元素的值时,这些值很好,并且符合我的预期。但是,当循环完成对(int i=0;i的所有nmask元素(for)的遍历后,如果您在更新之前进行一些跟踪并检查phi[i],您将看到您经常

因此,我创建并初始化一个向量(大小为nmask+3)为0,并为其中一个元素指定一个初始值。然后,我创建一个for循环,遍历向量的第一个nmask元素,并为每个元素分配向量中其他26个元素的平均值(由4D int数组voxt定义,其中包含向量地址)


我的问题是,当我在嵌套循环(第一个cout)中检查向量(phi)中非零元素的值时,这些值很好,并且符合我的预期。但是,当循环完成对(int i=0;i的所有nmask元素(
for)的遍历后,如果您在更新之前进行一些跟踪并检查
phi[i]
,您将看到您经常用零覆盖非零元素


注意:我不知道你的代码是做什么的,这是纯粹的福尔摩斯推理。如果在循环之后你只找到2个非零元素,那么唯一的逻辑结果是,在循环中更新一些非零元素之后,你将其更新为零。

如果你做一些跟踪并检查
phi[I]
在更新之前,您会发现经常用零覆盖非零元素


注意:我不知道你的代码是做什么的,这是纯粹的福尔摩斯推理。如果在循环之后你只找到2个非零元素,那么唯一的逻辑结果是,在循环中更新某个非零元素之后,你将其更新为零。

很难说到底发生了什么,但最简单的解释是在p之后hi[i]被设置为非零并显示为cout,它在随后的一次迭代中通过内部循环再次被设置为零。

很难说到底发生了什么,但最简单的解释是在phi[i]之后设置为非零并显示为cout,则在稍后通过内部循环的一次迭代中再次设置为零

phi[i]= tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c]];
使用a、b和c的嵌套for循环以相同的i值运行9次迭代。由于每次都将phi[i]覆盖为新值,因此只保留上一次迭代的值,其中a、和c均为1。如果上一次迭代恰好生成零值,则phi[i]会有很多零。也许你想做一些像phi[i]+=…而不是phi[i]=


使用a、b和c的嵌套for循环以相同的i值运行9次迭代。由于每次都将phi[i]覆盖为新值,因此只保留上一次迭代的值,其中a、和c均为1。如果上一次迭代恰好生成零值,则phi[i]将有很多零。也许你想做一些像phi[i]+=…的事情,而不是像phi[i]=…?

我确实建议用类似

const boost::irange domain(-1,2);
for (int i: boost::irange(0, nmask)) for (int a: domain) for (int b: domain) for (int c: domain)
{
    if (a==0 && b==0 && c==0)
        continue;
    //oneD26 is just (double) 1/26
    phi[i]= tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c]];
    if (phi[i]!=0)
    {
        //this gives expected results: 27 nonzero elements (including tvox)
        cout << n << " " << i << " " << a << b << c << " " << phi[i] << endl;
    }
}
const boost::irange域(-1,2);
for(inti:boost::irange(0,nmask))for(inta:domain)for(intb:domain)for(intc:domain)
{
如果(a==0&&b==0&&c==0)
继续;
//一个26正好(双倍)1/26
phi[i]=tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c];
如果(φ[i]!=0)
{
//这给出了预期结果:27个非零元素(包括tvox)

cout我确实建议用类似于

const boost::irange domain(-1,2);
for (int i: boost::irange(0, nmask)) for (int a: domain) for (int b: domain) for (int c: domain)
{
    if (a==0 && b==0 && c==0)
        continue;
    //oneD26 is just (double) 1/26
    phi[i]= tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c]];
    if (phi[i]!=0)
    {
        //this gives expected results: 27 nonzero elements (including tvox)
        cout << n << " " << i << " " << a << b << c << " " << phi[i] << endl;
    }
}
const boost::irange域(-1,2);
for(inti:boost::irange(0,nmask))for(inta:domain)for(intb:domain)for(intc:domain)
{
如果(a==0&&b==0&&c==0)
继续;
//一个26正好(双倍)1/26
phi[i]=tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c];
如果(φ[i]!=0)
{
//这给出了预期结果:27个非零元素(包括tvox)

cout…哇,这是一个有趣的圣诞树最大圈复杂度。算了吧,只需重写代码,使其嵌套不那么深…哇,这是一个有趣的圣诞树最大圈复杂度。算了吧,只需重写代码,使其嵌套不那么深。