我使用大型矩阵(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。
有什么办法可以加快这个算法的速度吗?
None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)