特征:选择复矩阵

时间:2016-07-12 09:26:20

标签: c++ matlab eigen

我想在Eigen中编写这个matlab代码:

[V_K,D_K] = eig(K);
d_k = diag(D_K);
ind_k = find(d_k > 1e-8);
d_k(ind_k) = d_k(ind_k).^(-1/2);
K_half = V_K*diag(d_k)*V_K';

到目前为止,我编写的代码是(最后一部分基于this示例):

Eigen::EigenSolver<Eigen::MatrixXf> es (K,true);
Eigen::MatrixXcf v = es.eigenvalues();
v = (v.array()).select(1/std::sqrt(v),v);

这显然是错误的(首先,你不能在std::sqrt(v)上申请Eigen::MatrixXcf),但我没有弄清楚如何编写它。你能救我吗?

1 个答案:

答案 0 :(得分:2)

与您关联的示例一样,您需要将.array().real()?)与> 1e-8进行比较,并使用Eigens函数(或unaryExpr)来操纵矩阵的值:

v = (v.array().real() 
//            ^^^
//        can't compare complex numbers

    > 1e-8)
//   ^^^
//  Actually compare the number 
    .select(v.cwiseSqrt().cwiseInverse(), v);
//            ^^^
//         Use Eigens functions or alternatively unaryExpr

// In one line:
v = (v.array().real() > 1e-8).select(v.cwiseSqrt().cwiseInverse(), v);