ベクトル(サイズnmask + 3の)を作成して0に初期化し、要素の1つに初期値を割り当てます。次に、ベクトルの最初のnmask要素を通過するforループを作成し、ベクトル内の平均26個の他の要素(ベクトルアドレスを含む4D int配列voxtで定義)を各要素に割り当てます。入れ子のforループでC++ベクトルが更新されない
私の問題は、ネストされたループ(最初のcout)内のベクトル(phi)の非ゼロ要素の値をチェックすると、値が正常であり、期待していることです。しかし、ループがすべてのnmask要素(for (int i= 0; i<nmask; i++)
終了)を通過すると、phiの非ゼロ要素を再度チェックし、最後の非ゼロ要素(および要素tvoxを手動で除いてすべて0にリセットされます) 1に設定)。
phiはすべてのループの外側で初期化されているので、値のリセットは行われず、ネストされたループ内の更新された要素はループの終了時に更新されたままになるはずです。何が起こっているか、どのようにこれを修正するための任意のアイデア?コードは以下のとおりです。私は、私が得ているアウトプットの感覚でコメントしようとしました。前もって感謝します。
vector<double> phi(nmask+3, 0); //vector with nmask+3 elements all set to 0 (nmask = 13622)
phi[tvox]= 1; //tvox is predefined address (7666)
for (int n= 0; n<1; n++)
{
vector<double> tempPhi(phi); //copy phi to tempPhi
for (int i= 0; i<nmask; i++)
{
for (int a= -1; a<=1; a++)
{
for (int b= -1; b<=1; b++)
{
for (int c= -1; c<=1; c++)
{
if (!(a==0 && b==0 && c==0))
{
//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;
}
}
}
}
}
}
phi[svox]= 0; //svox = 7681
phi[tvox]= 1;
for (int q= 0; q<nmask; q++)
{
//this gives only 2 nonzero values: phi[tvox] and phi[9642], which was the last nonzero value from 1st cout
if (phi[q]!=0)
cout << q << " " << phi[q] << endl;
}
}
....すごく面白いクリスマスツリーです。 – sehe
muximam cyclomatic complexity。 – slaphappy
それを忘れて、深く入れ子になっていないようにコードを書き換えてください。 –