4

我是 Eigen 图书馆的新手。我想计算特征矩阵的 FFT。但是,我这样做的尝试表明不受支持的 Eigen FFT 模块不能与 MatrixXf 一起使用。我想完成类似的事情:

#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 花了我大量的自我说服力,除非不可避免,否则我宁愿不使用不同的库。谢谢。

4

3 回答 3

7

不幸的是,这是不正确的;

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;
}
于 2013-08-30T13:31:47.257 回答
1

我发布了基于 Saba 的答案。

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;
}
于 2015-11-10T17:54:34.633 回答
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) );
于 2013-06-20T12:14:45.500 回答