行列の乗算にC++コードを書きました。私はvector<double>
を使用して行列のエントリを保存し、一連の3つのネストされたfor
ループを使用して、乗算のエントリーを計算しました。これは超低速であることがわかります(900 * 500と500 * 500の行列乗算の場合、Macbookの空気で約10秒かかります)。理由は何ですか?私はマトリックスの悪い表現を使用したか、コードに大きな欠陥がありますか?C++で行列乗算の高速コードを書く方法は?
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のサブルーチンを使用して解決しました。
代わりにちょうど 'CVV [C_B] [R_A] =合計をやってどのように' vtmp'を作成する ' – SirGuy
私は[BLAS](HTTPS多くのものを使用することをお勧めします.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms)の実装がそこにあります。 –
プロファイラを使用して、コードがどこに費やされているかを既知の高速実装と比較します。 – RPGillespie