2011-03-28 28 views
0

我知道當您嘗試更改2d矢量對象的大小時存在問題,但我在這裏遇到了一個相當奇怪的問題。代碼片段下面附:C++ 2d向量問題在「for」循環中

for (int iter = 0; iter < J; iter++) { 
       cout << "iter " << iter << endl; 
       rows_n = rows_n/2; 
       cols_n = cols_n/2; 
       cout << "sig2 " << sig2.size() << endl; 

       vector<vector<double> > cA(rows_n, vector<double>(cols_n)); 
       vector<vector<double> > cH(rows_n, vector<double>(cols_n)); 
       vector<vector<double> > cV(rows_n, vector<double>(cols_n)); 
       vector<vector<double> > cD(rows_n, vector<double>(cols_n)); 
       cout << "cA " << cA.size() << endl; 

       ANALYSIS_FB(nm,sig2,cA,cH,cV,cD); 

       sig2.clear(); 
       vector<vector<double> > sig2(rows_n, vector<double>(cols_n,0.0)); 

       sig2 = cA; 

       for(int i =0; i < rows_n; i++){ 
        for (int j =0; j < cols_n; j++){ 
         dwt_output[i][j]=cA[i][j]; 
        } 
       } 
       for(int i =0; i < rows_n; i++){ 
        for (int j = cols_n; j < cols_n * 2; j++){ 
         dwt_output[i][j]=cH[i][j - cols_n]; 
        } 
       } 

       for(int i = rows_n; i < rows_n * 2; i++){ 
        for (int j =0; j < cols_n; j++){ 
         dwt_output[i][j]=cV[i - rows_n][j]; 
        } 
       } 

       for(int i = rows_n; i < rows_n * 2; i++){ 
        for (int j = cols_n; j < cols_n * 2; j++){ 
         dwt_output[i][j]=cD[i- rows_n][j - cols_n]; 
        } 
       } 
       for(int i = 0; i < rows_n; i++){ 
        for (int j = 0; j < cols_n ; j++){ 
         cout << sig2[i][j] << " "; 
        } 
        cout << endl; 
       } 

      cA.clear(); 
      cH.clear(); 
      cV.clear(); 
      cD.clear(); 

      cout << "sig2e " << sig2.size() << endl; 
      } 

正如你可以看到這是一個更大的代碼的一部分,但我的問題是,2D矢量循環的第一次迭代後消失。我還附加了控制檯的輸出。

ITER 0

SIG2 16

CA 8

4.49991 10.4998 16.4997 22.4996 28.4995 34.4993 40.4992 46.4991 8.99983 20.9996 32.9994 44.9991 56.9989 68.9987 80.9984 92.9982 13.4997 31.4994 49.4991 67.4987 85.4984 103.498 121.498 139.497 17.9997 41.9992 65.9987 89.9983 113.998 137.997 161.997 185.996 16.4997 38.4993 60.4988 82.4984 104.498 126.498 148 0.497 170.497 14.9997 34.9993 54.9989 74.9986 94.9982 114.998 134.997 154.997 16.4997 38.4993 60.4988 82.4984 104.498 126.498 148.497 170.497 13.4997 31.4994 49.4991 67.4987 85.4984 103.498 121.498 139.497

sig2e 8(我的注意 - 第一次迭代結束與行數= 8的SIG2號碼)

ITER 1(我的注 - 第二迭代開始)行= 0)

SIG2 0(注意 - 我SIG2的數CA 4

正如您所看到的,sig2在第一次迭代中取值爲cA,在循環結束前達到8 x 8。對於下一次迭代(iter值爲1),2d向量變爲空向量。公平地說,我在第一次迭代中清除矢量,然後將其重新定義爲更小的尺寸,但我仍然發現這種行爲有點奇怪。有沒有解決的辦法?函數ANALYSIS_FB採用sig2的值並返回cA,cH等。將sig2的值設置爲cA(其尺寸爲兩個方向上的原始sig2的一半),依此類推。

編輯:謝謝各位指出,sig2是一個全球性的以及局部變量。我碰壁了,這幫助我解決了這個問題。我最終刪除了所有「清除」函數,並刪除了任何其他局部變量。我只使用sig2作爲全局變量並且程序正在工作。

+0

您需要發佈,我們可以運行完整的代碼。 'sig2'似乎已經被定義在循環之外。 – 2011-03-28 09:20:58

+0

看來你有兩個名爲'sig2'的向量。一個在循環之外,另一個在裏面,似乎你正在清除錯誤的向量。事實上,由於這些是本地載體,因此根本不需要調用「清除」。當我清除* outer *向量時,'sig2.clear()'對我來說看起來非常可疑。很難提供答案沒有得到完整的上下文,因此這個評論。 – Naveen 2011-03-28 09:22:48

回答

3

您有2 varibales命名爲sig2,一個在循環之外,一個在裏面!

從代碼:

///You clear a global sig2 
sig2.clear(); 
///You create a local sig2 ! 
vector<vector<double> > sig2(rows_n, vector<double>(cols_n,0.0)); 
+0

嗯。這可能是我如何解決它?爲了繼續我的迭代,我需要一個2d向量(sig2 ??)來保存cA的值,並使用該值調用函數ANALYSIS_FB。 cA是原始sig2的一半大小。我試着創建一個temp_sig2值,但結果是一樣的。它在第一次迭代後清除。 – raf 2011-03-28 09:27:39

+0

@raf:如果從循環中刪除'sig2.clear()'語句會發生什麼? – Naveen 2011-03-28 09:30:03

+0

當我刪除sig2.clear()時,原始的sig2接管並且程序模糊。 – raf 2011-03-28 09:32:31