2011-06-30 62 views
0

所以我創建並初始化一個向量(大小爲nmask + 3)爲0,並且我爲其中一個元素分配了一個初始值。然後我創建一個for循環,它遍歷向量的第一個nmask元素,並向每個元素賦予向量中平均26個其他元素(由包含向量地址的4D int數組voxt定義)。C++向量在嵌套for循環中不更新

我的問題是,當我檢查嵌套循環(第一個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; 
     } 

    } 
+2

....哇,這是一個有趣的聖誕樹 – sehe

+1

muximam cyclomatic複雜性。 – slaphappy

+3

忘記它,只需重寫代碼,使其不嵌套如此之深。 –

回答

1

如果你做一些跟蹤和更新只是你會看到,你經常覆蓋一個非零元素與零之前檢查phi[i]

注意:我不知道你的代碼是幹什麼的,這是純粹的福爾摩斯推理..如果在循環之後,你只能找到2個非零元素,那麼唯一合乎邏輯的結果就是在將某些東西更新爲非零後在循環中將其更新爲零。

+0

是啊,謝謝 – Marvin

2

很難說出發生了什麼,但最簡單的解釋是,在phi [i]被設置爲非零並顯示給cout之後,它將在稍後通過內部迭代中的一次迭代中再次設置爲零循環。

+0

是的,我終於明白了。謝謝 – Marvin

1
phi[i]= tempPhi[i]+oneD26*tempPhi[voxt[i][1+a][1+b][1+c]]; 

使用a,b和c運行的嵌套for-loops用於組合9次迭代,其值爲i。由於每次都將phi [i]覆蓋爲一個新值,因此只保留上一次迭代中a和c都爲1的值。如果最後一次迭代恰好產生零值,那麼phi [i]將會有很多的零。也許你打算做一些事情,如phi [i] + = ...而不是phi [i] = ...?

+0

是的,謝謝! – Marvin

0

我不建議用東西來取代循環的肉像

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; 
    } 
} 

當然,爲了簡便起見我假定這兩個boost/range.hpp和C++ 0x中的編譯器。但是,使用微不足道的宏可以達到同樣的效果。這是沒有寫/使用適當的combinations算法(爲什麼不在標準中,無論如何)。

+0

,看起來比我醜陋的代碼好多了,謝謝 – Marvin