我正在使用EIGEN 3.2 c ++ Matrix库。我有一个问题,需要从Eigen :: MatrixXcd类型的矩阵中提取相位或角度信息。这个问题涉及到我的代码中计算结果的复数矩阵。我有nsamp的nsamp的结果M,其中nsamp是一个大小为256的整数(例如)。
因此,MatrixXcd M(nsamp,nsamp);
现在我想从M中提取相位(或角度信息)。我知道这样做的复杂分析方法是,
MatrixXcd ratio = M.imag()。array()。sin()/ M.real()。array()。cos(); MatrixXd phase = M.real()。array()。atan();
然而,Eigen库中没有atan方法。所以,作为我正在使用的工作
MatrixXcd cosPhase = M.real()。array()。cos()/ M.array()。abs(); MatrixXd phase = M.real()。array()。acos();
数学是可靠的,但我得到的答案不正确。我看过虚构的部分,即
MatrixXd phase = M.imag()。array()。acos();
并获得“更正确”的答案,这是没有意义的。
以前社区中是否有人处理过此问题,您的解决方案是什么?
非常感谢,
罗伯特答案 0 :(得分:2)
好。对于任何人看到这个。我找到了自己问题的答案。要计算相位贡献,我们需要使用2 * atan(imag /(sqrt(real ^ 2 + imag ^ 2)+ real))算法计算相位。
这是使用犰狳库
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
int main(int argc, const char * argv[]) {
// calculate the phase content resulting from a complex field
// matrix of type Eigen::MatrixXcd
double pi = acos(-1);
mat phase(2,2);
phase << pi/2 << pi/2 << endr
pi/2 << pi/2 << endr;
// form the complex field
cx_mat complexField = cx_mat(cos(phase), sin(phase));
// calculate the phase using the tan2 identity
mat REAL = real(complexField);
mat IMAG = imag(complexField);
// calculate the phase using real component of complexField
mat phaseResult = 2*atan(IMAG/(sqrt(REAL%REAL+IMAG%IMAG)+REAL));
cout << phaseResult << "\n" << endl;
return 0;
}
答案 1 :(得分:1)
在提出问题时,该功能很可能不存在,但最简单的解决方案是调用arg()
函数。
Eigen::MatrixXcd mat = ...;
Eigen::MatrixXd phase = mat.array().arg(); // needs .array() since this works per element
如果您需要手动计算,请更好地使用atan2(imag, real)
而不是复杂的2*atan(...)
公式。