我想以我在编码方面经验不足的事实来开头这个问题,因此解决这个问题的方法可能比我尝试过的要容易得多。我有一个定义为vector<float> phase;的向量'phas',其中有7987200个元素,并且我想将此向量重新排列为133120个包含60个元素的向量(称为line2定义为vector<long double> line2;)。然后应将每个60个向量依次放置在定义为vector< vector<long double> > RFlines2;RFlines2.resize(7987200);的向量'RFlines2'的向量中。我想用相隔128的'phas'元素填充60个元素向量中的每个向量,例如,60个元素的第一个向量将被phas [0],phas [128],phas [256]等填充。阶段[7680]。然后,将60的第二个向量填充为phas [1],phas [129],phas [257],... phas [7681]等。我当前的代码如下:

    for(int x = 0; x<133120; x++){
        if((x == 128 || x == 7680+128 || x == (7680*a)+128)){
            x = 7680*a;
            a = a + 1;
        }
        int j = x;
        for(int i = 0; i<60;i++){
            line2.pushback(i);
            line2[i] = phas[j];
            j = j + 128;
        }
        cout<<"This is x: "<<x<<endl;
        RFlines2[x] = line2;
        line2.clear();
        }


但是,在outter循环进行128次迭代后(已创建60个128个向量,并使用了来自相位的7680个元素),我需要将x值跳转到7680,以避免将来自已经使用的pha的元素放入到60的下一个向量,因为当x = 128时,下一个60的向量的第一个元素将是phase [128],该相位已被用作60的第一个向量的第二个元素。然后经过另外128次迭代,我将需要x值跳到15,360,依此类推。上面的代码是我的最新尝试,但是当我尝试对RFlines2中每个60的向量执行fftw时,如下所示:

    int c = 0;
   for(int x = 0; x < 133120; x++){
    //cout<<x<<endl;

   fftw_plan p2;

   inter = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * W);
   outter = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * W);

    /* cast elements in line to type fftw_complex */
    for (int i = 0; i <60; i++) {
    //cout<<i<<endl;
    //inter[i][0] = phas[i];
    //inter[x][0] = zlines[x];
    inter[i][0] = RFlines2[x][i];
    inter[i][1] = 0;
  }

    p2 = fftw_plan_dft_1d(60, inter, outter, FFTW_FORWARD, FFTW_ESTIMATE);
    fftw_execute(p2);
    //inter[x][0].clear();
    for(int u = 0; u<60;u++){
        if(u == 0){
        cout<<' '<<outter[0][0]<<' '<<c++<<endl;
        }
    }
    fftw_free(inter);
    fftw_free(outter);
    fftw_destroy_plan((p2));
   }


该程序在显示external [0] [0] 128次后崩溃。任何想法如何解决这一问题?另外,请让我知道我所说的话是否有意义,我将尽力弄清楚。提前致谢!

-麦克风

最佳答案

我不知道为什么您的代码会崩溃,因为在这里看不到整个代码。但我将建议一种分散数据和管理向量的方法。

(但是有一个重要的警告:您不应该使用向量(至少不应该使用向量);您最好使用1D向量并自己管理2D索引。但这是一种性能,并且不会影响正确性。)

这是我建议您填写RFLines2的方式:(我没有尝试过此代码,因此可能无法正常工作。)

// first, build the memory for RFLines2...
vector<vector<long double>> RFLines2 (133120, vector<long double>(60));

// assuming a "phase" vector...
for (unsigned i = 0; i < 7987200; ++i)
{
    unsigned const row = (i / (128 * 60)) * 128 + (i % (128 * 60)) % 128;
    unsigned const col = (i % (128 * 60)) / 128;
    RFLines[row][col] = phase[i];
}


您不需要这种方式的line2中间体。

其余的代码“应该”起作用。 (顺便说一句,我根本不理解for上的内部u循环。您想在那里做什么?)

关于c++ - 在C++中重组 vector ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31908168/

10-09 06:24