2

我正在使用大型矩阵(100x100 到 3000x3000)来做一些计算(大量的求和和矩阵向量乘法),我使用 Eigen 库来处理我的向量和矩阵。我的代码是简单的类 C 代码(只有函数,没有类),将被编译为 DLL 以在 Excel 上使用。

我在以下代码中发现了一个瓶颈:

// Q(z) matrix function
Eigen::MatrixXd qzMatrix(const Eigen::MatrixXd& xjk, const float& riskFreeRate, 
                         const float& volatility, const float& rebalancingPeriod)
{
    int j, k, r = xjk.rows(), c = xjk.cols();
    Eigen::MatrixXd matrix(r, c);
    double mu = (riskFreeRate - volatility * volatility / 2) * rebalancingPeriod;
    double s = volatility * rebalancingPeriod;

    for (j = 0; j <= r - 1; ++j)
        for (k = 0; k <= c - 1; ++k)
            matrix(j, k) = (xjk(j, k) > 0) ? 0.5*(1 + erf(((log(xjk(j, k)) - mu) / s) * M_SQRT1_2)) : 0;

    return matrix;
}

还有第二个函数,与这个函数类似,其中 erf 函数采用不同的参数(此处使用 erf 函数计算标准法线 cdf)。这两个函数采用大尺寸(通常约为 1000x1000)的矩阵(在本例中为 xjk),并且循环至少 120 次(1000x1000x2x120 = 2.4 亿次 erf 函数调用)。我已经尝试过使用 GSL 普通 CDF 函数,但它是否比原生 C++ erf 函数慢一些。

在 1000x1000 矩阵上运行该算法 120 次大约需要 45 秒。我正在使用 mingw-w64 4.9.2、CodeBlocks,我有一个 Windows 7 x64、4Go RAM、i5。

有没有办法可以加快这个算法的速度?

4

0 回答 0