Я новичок в библиотеке Eigen. Я хотел бы вычислить БПФ из собственных матриц. Однако мои попытки сделать это указывают на то, что неподдерживаемый модуль 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);
}
Это достижимо? Любые другие предложения приветствуются. Мне потребовалось много уверенности в себе, чтобы перейти на Eigen из matlab, и я предпочел бы не использовать другую библиотеку, если это не неизбежно. Благодарю.
Это разумное ожидание. К сожалению, в его нынешнем виде 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) );
К сожалению это не правильно;
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;
}
Я публикую свой ответ, основанный на ответах Сабы.
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;
}