2013-06-19 60 views
3

我是Eigen圖書館的新手。我想計算特徵矩陣的FFT。但是,我的嘗試表明,不支持的特徵FFT模塊不能與MatrixXf一起使用。我想拉下類似的東西:如何在MatrixXf中使用特徵值FFT?

#include <eigen3/unsupported/Eigen/FFT> 
#include<Eigen/Dense> 
#include<iostream> 
using namespace std; 
using namespace Eigen; 
int main(){ 
    MatrixXf A = MatrixXf::Random(3,10); 
    FFT<float> fft; 
    MatrixXf B; 
    fft.fwd(B,A); 
} 

這是可以實現的嗎?歡迎任何其他建議。我花了很大的自信去從matlab遷移到Eigen,除非不可避免,否則我寧願不使用不同的庫。謝謝。

回答

0

這是一個合理的期望。不幸的是,在目前的形式下,FFT並不完全支持。

MatrixXcf B(3,10); // note the change from real to complex 
//fft.fwd(B,A); // It is natural to want to do this, unfortunately it is not yet supported 

// it works to iterate over the columns 
for (int k=0;k<A.cols();++k) 
    B.col(k) = fft.fwd(A.col(k)); 
+0

如果您想計算2D FFT,則您的代碼不正確。爲什麼你迭代列而不是遍歷行?見薩巴的回答。 – wsw

+0

@wsw,OP沒有提到二維FFT –

+0

誰在低估一個被接受的正確答案?說真的,僅僅因爲你不喜歡答案,並不會使它「沒用」。 –

5

不幸的是它是不正確的;

1),你必須重複輸入矩陣的行(實際)

2)然後遍歷輸出矩陣的列(復)

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; 
} 
+0

你的代碼是正確的,我使用MATLAB的fft2()函數進行了測試。 – wsw

+0

我注意到了兩個錯別字 - 臨時向量'tmpOut'的長度有誤。例如,第一個遍歷行的地方應該有'dim_y'的長度,因爲我們一次只處理一個行向量,其長度爲'dim_y'。 – wsw

+0

逆變換將如何工作?首先遍歷列,然後遍歷行? –

0

我張貼我的答案那是基於薩巴的。

std::shared_ptr<Eigen::MatrixXcf> Util::fft2(std::shared_ptr<Eigen::MatrixXf> matIn) 
{ 
    const int nRows = matIn->rows(); 
    const int nCols = matIn->cols(); 

    Eigen::FFT<float> fft; 
    std::shared_ptr<Eigen::MatrixXcf> matOut = std::make_shared<Eigen::MatrixXcf> (nRows, nCols); 

    for (int k = 0; k < nRows; ++k) { 
     Eigen::VectorXcf tmpOut(nCols); 
     fft.fwd(tmpOut, matIn->row(k)); 
     matOut->row(k) = tmpOut; 
    } 

    for (int k = 0; k < matOut->cols(); ++k) { 
     Eigen::VectorXcf tmpOut(nRows); 
     fft.fwd(tmpOut, matOut->col(k)); 
     matOut->col(k) = tmpOut; 
    } 

    return matOut; 
}