C++ C++;本征避免或检测广播功能中的零除

C++ C++;本征避免或检测广播功能中的零除,c++,linear-algebra,eigen,C++,Linear Algebra,Eigen,给定一个实对称矩阵a,我计算矩阵的特征向量 其中,D是对角矩阵,其中条目D(i,i)是a的行i的和。然后按照以下方式进行分析: Eigen::VectorXf D = A.rowwise().sum().array().rsqrt(); Eigen::MatrixXf L = D.asDiagonal()*A*D.asDiagonal(); Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigenSolver(N); eigenSol

给定一个实对称矩阵a,我计算矩阵的特征向量

其中,D是对角矩阵,其中条目D(i,i)是a的行i的和。然后按照以下方式进行分析:

Eigen::VectorXf D = A.rowwise().sum().array().rsqrt();
Eigen::MatrixXf L = D.asDiagonal()*A*D.asDiagonal();
Eigen::SelfAdjointEigenSolver<Eigen::MatrixXf> eigenSolver(N);
eigenSolver.compute(L);
_lambda.noalias() = eigenSolver.eigenvalues().reverse();
_X.noalias() = eigenSolver.eigenvectors().rowwise().reverse();
Eigen::VectorXf D=A.rowwise().sum().array().rsqrt();
本征::矩阵L=D.asDiagonal()*A*D.asDiagonal();
特征:自伴特征解算器特征解算器(N);
特征解算器计算(L);
_lambda.noalias()=特征解算器.特征值().反向();
_X.noalias()=特征解算器。特征向量().rowwise().reverse();
在某些情况下,我会得到所有特征值的
NaN
,这是由于A的某些行为零,并且广播的
rsqrt()
函数返回
NaN
(除零)。在这种情况下,这些条目应该是零(或者任何数字)

有没有办法避免或将这些除法改为零,并且仍然广播
rsqrt

如果
NaN*0
为零,则这不会是一个问题。

在每个对角线元素中添加一小点可以解决此问题:

constexpr float eps = std::numeric_limits<float>::epsilon();
Eigen::VectorXf D = (Apermuted.rowwise().sum().array() + eps).rsqrt();
constexpr float eps=std::numeric_limits::epsilon();
特征::向量xf D=(Apermuted.rowwise().sum().array()+eps.rsqrt();

N.B.,
rsqrt(0)=inf
,但是
inf*0==NaN
OK——这就是为什么我得到了NaN的--thx
epsilon
与矩阵中的条目相比可能相当大。您可以改为尝试
std::numeric\u limits::min()
——但这在您的情况下可能并不重要。是的——因为sqrt(min)不能下溢,这应该更好——thx。