C ++循环中的指数运算符

时间:2015-03-20 07:13:38

标签: c++ matlab

我编写了C ++代码和matlab代码来测试速度。我的C ++代码是:

int nrow = dim[0], ncol = dim[1];
double tmp, ldot;

for (int k = ncol - 1; k >= 0; --k){
    grad[k] = 0;
    for (int j = nrow - 1; j >= 0; --j){
        tmp = exp(eta[j + nrow * k]);
        ldot = (-Z[j + nrow * k] + tmp / (1 + tmp));
        grad[k] += A[j] * ldot;
    }
}

我的matlab代码是:

prob = exp(eta);
prob = prob./(1+prob);
ldot = prob - Z;
grad=sum(repmat(A,1,nGWAS).*ldot);

我运行每个代码100次,C ++花了5秒钟,matlab只花了1.2秒。

任何人都可以帮助我吗?感谢。

1 个答案:

答案 0 :(得分:3)

matlab的人非常清楚如何优化矩阵访问。

您选择逐列访问它。我最初的猜测是矩阵逐行排列在内存中。这会导致代码在整个矩阵ncol次上运行。缓存错过了整个地方。