C ++ Eigen lib - eig(A,B)函数计算时间

时间:2015-07-13 08:17:44

标签: c++ eigen

我只是想问一下是否有人可以告诉我为什么我的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秒对我来说太长了。

0 个答案:

没有答案