根據之前的文章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);
}
}
}