2016-04-19 14 views
2

Es scheint den folgenden Code korrekt ist:Wie funktioniert FFT auf MatrixXd in Eigen?

#include <Eigen/Core> 
#include <unsupported/Eigen/FFT> 

int main() 
{ 
    Eigen::FFT<float> fft; 
    Eigen::Matrix<float, dim_x, dim_y> in = setMatrix(); 
    Eigen::Matrix<complex<float>, dim_x, dim_y> out; 

    for (int k = 0; k < in.rows(); k++) { 
     Eigen::Matrix<complex<float>, dim_x, 1> tmpOut; 
     fft.fwd(tmpOut, in.row(k)); 
     out.row(k) = tmpOut; 
    } 

    for (int k = 0; k < in.cols(); k++) { 
     Eigen::Matrix<complex<float>, 1, dim_y> tmpOut; 
     fft.fwd(tmpOut, out.col(k)); 
     out.col(k) = tmpOut; 
    } 
} 

Aber dies muss die Größe der Matrix in der Kompilierung angeben, wenn ich die Matrix zu MatrixXd ändern, dieser Fehler hat beim Kompilieren. Ich möchte wissen, wie ich FFT auf MatrixXd tun könnte, also könnte ich die Matrixgröße spezifizieren, wenn es läuft.

Antwort

5

Ändern Sie alle Ihre Variablen in Eigen::Dynamic Größe statt hart codieren sie und es sollte funktionieren. Oder verwenden Sie die integrierten Typen als solche:

#include <Eigen/Core> 
#include <unsupported/Eigen/FFT> 

int main() 
{ 
    size_t dim_x = 28, dim_y = 126; 
    Eigen::FFT<float> fft; 
    Eigen::MatrixXf in = Eigen::MatrixXf::Random(dim_x, dim_y); 
    Eigen::MatrixXcf out; 
    out.setZero(dim_x, dim_y); 

    for (int k = 0; k < in.rows(); k++) { 
     Eigen::VectorXcf tmpOut(dim_x); 
     fft.fwd(tmpOut, in.row(k)); 
     out.row(k) = tmpOut; 
    } 

    for (int k = 0; k < in.cols(); k++) { 
     Eigen::VectorXcf tmpOut(dim_y); 
     fft.fwd(tmpOut, out.col(k)); 
     out.col(k) = tmpOut; 
    } 
    return 0; 
} 
+0

Vielen Dank für Ihre Antwort! – alexxx