在 C++ 中重组向量
Reorganizing a vector in c++
我想先回答这个问题,因为我在编码方面非常缺乏经验,所以这个问题的解决方案可能比我一直在尝试的要容易得多。我有一个定义为 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();
}
然而,在外部循环的 128 次迭代之后(创建了 60 个向量的 128 个向量并使用了 phas 中的 7680 个元素),我需要 x 值跳转到 7680 以避免将具有已经被用于 60 的下一个向量,因为当 x = 128 时,60 的下一个向量的第一个元素将是相位 [128],它已经被用作 60 的第一个向量的第二个元素。然后在另一个 128 x 迭代,我需要 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));
}
程序在显示outer[0][0] 128次后崩溃。任何想法如何解决这一问题?另外,如果我所说的任何内容没有意义,请告诉我,我会尽力澄清。提前致谢!
-迈克
我不知道你的代码为什么会崩溃,因为我在这里看不到完整的代码。但我将建议一种分散数据和管理向量的方法。
(但有一个重要的警告:您不应该为此任务使用向量(至少不是向量的向量);您最好使用一维向量并自己管理二维索引。但这是性能事情,并且不影响正确性。)
这就是我建议您填写 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
中间体了。
其余代码“应该”有效。 (顺便说一句,我完全不理解 u
上的内部 for
循环 。你想在那里做什么?)
我想先回答这个问题,因为我在编码方面非常缺乏经验,所以这个问题的解决方案可能比我一直在尝试的要容易得多。我有一个定义为 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();
}
然而,在外部循环的 128 次迭代之后(创建了 60 个向量的 128 个向量并使用了 phas 中的 7680 个元素),我需要 x 值跳转到 7680 以避免将具有已经被用于 60 的下一个向量,因为当 x = 128 时,60 的下一个向量的第一个元素将是相位 [128],它已经被用作 60 的第一个向量的第二个元素。然后在另一个 128 x 迭代,我需要 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));
}
程序在显示outer[0][0] 128次后崩溃。任何想法如何解决这一问题?另外,如果我所说的任何内容没有意义,请告诉我,我会尽力澄清。提前致谢!
-迈克
我不知道你的代码为什么会崩溃,因为我在这里看不到完整的代码。但我将建议一种分散数据和管理向量的方法。
(但有一个重要的警告:您不应该为此任务使用向量(至少不是向量的向量);您最好使用一维向量并自己管理二维索引。但这是性能事情,并且不影响正确性。)
这就是我建议您填写 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
中间体了。
其余代码“应该”有效。 (顺便说一句,我完全不理解 u
上的内部 for
循环 。你想在那里做什么?)