我只是想问一下是否有人可以告诉我为什么我的eig函数计算时间因相同大小的矩阵而不同的原因?
我在4x4,4x4矩阵上执行了大量的eig(A,B)运算,以获得特征值和特征向量。
发生557 * 4 * 267次。
std::pair<MatrixXcd, VectorXd> eig(const MatrixXcd& A, const MatrixXcd& B)
{
Eigen::GeneralizedSelfAdjointEigenSolver<MatrixXcd> solver(A, B);
MatrixXcd V = solver.eigenvectors();
VectorXd D = solver.eigenvalues();
return std::make_pair(V, D);
}
(...)
for (int t = 0; t < 557; t++)
{
(...)
for(int sig = 0; sig < 4; sig++)
{
for(int f = 0; f < 267; f++)
{
// calculation of Xi and Xfs
mRt = mXfs * mXfs.adjoint();
mRj = mXfi * mXfi.adjoint();
eValVec = eig(mRt, mRj);
(...)
}
(...)
}
}
对于t <= 7,eig在大约3秒内计算4 * 267次迭代。
对于t> 7,它突然变得非常快并且在~0.1秒内计算4 * 267次迭代。
我确定通过评论代码的其他部分并仅保留该功能来确保其eig减慢了我的程序。我总是使用4x4矩阵。
我猜重要的通知可能是t&lt; = 7中的所有值或Rj矩阵等于0.所以它就像:
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
虽然Rx一直都是价值观。在t> 7之后,Rj也获得非零值并且计算变得更快。那么eig函数可能有问题来处理零?我没有改变任何与eig函数相关的东西 - 我插入的4x4矩阵中的数字只会发生变化。仍然计算时间不同。这种滞后从未发生过。
有谁知道如何修复/调试它或使其更稳定?我正在进行实时处理,3秒对我来说太长了。