【发布时间】:2017-02-13 01:13:39
【问题描述】:
我为矩阵乘法编写了一些 C++ 代码。我使用vector<double> 来保存矩阵条目,并使用一系列3 个嵌套的for 循环来逐项计算乘法。事实证明,这非常慢(对于 900*500 和 500*500 的矩阵乘法,在我的 macbook air 上大约需要 10 秒)。是什么原因?是我使用了错误的矩阵表示还是代码中存在很大缺陷?
for (int c_b=0;c_b<B.n_c;c_b++)
{
vector<double> vtmp(A.n_r);
for (int r_a=0;r_a<A.n_r;r_a++)
{
sum=0;
for (int i=0;i < A.n_c;i++)
{
sum=sum+A.mat[r_a+i*A.n_r]*B.mat[i+c_b*B.n_r];
}
vtmp[r_a]=sum;
}
Cvv[c_b]=vtmp;
}
更新:此问题已通过在 Lapack 中使用子例程得到解决。
【问题讨论】:
-
与其创建
vtmp不如只做Cvv[c_b][r_a] = sum; -
我建议使用许多 BLAS 实现之一。
-
使用分析器查看您的代码在哪里花费了大部分时间与已知的快速实现。
-
您可以从这里查看答案stackoverflow.com/questions/4455645/…
-
我在您的代码中没有看到
vector<vector<double>>,也没有看到A、B或Cvv的声明,也没有看到它们类型的详细信息。我倾向于说您的矩阵表示效率低下,但是当我实际上没有要评估的表示时,那将是推测性的。