来自特征MatrixXcd的角度数据

时间:2014-11-14 20:53:23

标签: c++ arrays numbers eigen

我正在使用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();

并获得“更正确”的答案,这是没有意义的。

以前社区中是否有人处理过此问题,您的解决方案是什么?

非常感谢,

罗伯特

2 个答案:

答案 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(...)公式。