天天看點

strassen方法求任意行列數的矩陣乘法

根據之前的文章strassen方法求矩陣乘法,我們隻需要在使用strassen方法前對矩陣進行處理,對任意行列數的矩陣mxn,在最後一行或最後一列後面添加0,使行數和列數補齊為2的幂。

修改之前的代碼如下:

void MatrixMultipy(int* a, int arow, int acol, int* b, int brow, int bcol, int* c)
{
    int aM = ;
    while (aM < arow)
    {
        aM *= ;
    }
    int aN = ;
    while (aN < acol)
    {
        aN *= ;
    }
    DATATYPE* aa = new DATATYPE[aM*aN];
    memset(aa, , sizeof(DATATYPE)*aM*aN);
    SubMat A(aa, aM, aN);
    for (int i = ; i < arow; i++)
    {
        for (int j = ; j < acol; j++)
        {
                A.SetData(i, j, a[i*acol+j]);
        }
    }

    int bM = ;
    while (bM < brow)
    {
        bM *= ;
    }
    int bN = ;
    while (bN < bcol)
    {
        bN *= ;
    }
    DATATYPE* bb = new DATATYPE[bM*bN];
    memset(bb, , sizeof(DATATYPE)*bM*bN);
    SubMat B(bb, bM, bN);
    for (int i = ; i < brow; i++)
    {
        for (int j = ; j < bcol; j++)
        {
            B.SetData(i, j, b[i*bcol + j]);
        }
    }
    DATATYPE* cc = new DATATYPE[aM*bN];
    memset(cc, , sizeof(DATATYPE)*aM*bN);
    SubMat C(cc, aM, bN);
    MatrixMultiplyAB(A,B,C);
    for (int i = ; i < arow; i++)
    {
        for (int j = ; j < bcol; j++)
        {
            c[i*bcol + j] = C.GetData(i, j);
        }
    }
}