1

行列の乗算を含む C コードを書いており、その操作に 3 つのネストされたループを使用しています。では、ネストされたループの 1 つを削除して、そのコードを改善する方法を知っている人はいますか?

for (i = 0; i < SIZE; ++i)
    for (j = 0; j < SIZE; ++j)
        for (k = 0; k < SIZE; ++k)
            c[i][j] += a[i][k] * b[k][j];
4

2 に答える 2

3

密行列の行列乗算は O(n^3) です。これはStrassen のアルゴリズムを O(n^(2.8)) に、またはCoppersmith-Winogarを O(n^(2.37))に使用することで加速できます。

于 2012-11-20T08:38:50.333 に答える
1

Strassen アルゴリズムは、試すべき古典的なアルゴリズムです。

http://en.wikipedia.org/wiki/Strassen_algorithm

3 つのループを記述するよりも複雑であり、行列のサイズが小さい場合、全体的な速度の向上が見られない可能性があります。

私の知る限り、Mathematica と Matlab は小さな行列には 3 つのネストされたループ乗算を使用し、大きな行列には Strassen に切り替えます。

理論的には漸近的により優れたパフォーマンスを発揮するアルゴリズムは他にもありますが、非常に大きな行列の乗算を行っていない限り、それほど役立つとは思いません。

于 2012-11-20T08:41:38.867 に答える