我想在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
),但我没有弄清楚如何编写它。你能救我吗?
答案 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);