我想知道是否可以存储来自 FFTW 的一维 FFT 调用的转置矩阵。考虑我的矩阵nrows_1 x w_size
.目前,它以大小w_size
块存储
for (ix = 0 ; ix < nrows_1 ; ix++)
{
plan = fftw_plan_dft_1d(w_size, &source_data[ix*w_size], &transposed_data[ix*w_size],
FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
}
所以我想使用 FFTW 调用转置结果矩阵。
您可以使用 FFTW 的高级复杂 DFT。由于参数howmany
,所有dft都可以一次执行,如果参数ostride
和odist
设置正确,则输出被转置。
以下代码演示了它的工作原理。它由gcc main.c -o main -lfftw3 -lm
编译:
#include <fftw3.h>
#include <stdio.h>
int main(int argc, char* argv[]){
int n=9;
int m=4;
fftw_complex *datasource=fftw_malloc(sizeof(fftw_complex)*m*n);
fftw_complex *dataoutput=fftw_malloc(sizeof(fftw_complex)*m*n);
int i,j;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
datasource[i*m+j][0]=(i+j)%4+j*j+i*i*i;
datasource[i*m+j][1]=0;
}
}
printf("input :n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%g ",datasource[i*m+j][0]);
}
printf("n");
}
fftw_plan plan;
for(i=0;i<n;i++){
plan = fftw_plan_dft_1d(m, &datasource[i*m], &dataoutput[i*m],
FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
}
printf("expected output, real part, not transposed :n");
for(i=0;i<n;i++){
for(j=0;j<m;j++){
printf("%g ",dataoutput[i*m+j][0]);
}
printf("n");
}
plan=fftw_plan_many_dft(1, &m, n,
datasource, NULL, 1, m,
dataoutput, NULL,n, 1,
FFTW_FORWARD, FFTW_ESTIMATE);
fftw_execute(plan);
fftw_destroy_plan(plan);
printf("output, real part, already transposed :n");
for(j=0;j<m;j++){
for(i=0;i<n;i++){
printf("%g ",dataoutput[j*n+i][0]);
}
printf("n");
}
fftw_free(datasource);
fftw_free(dataoutput);
return 0;
}
我想我的回答来得太晚了,没有用...