为什么使用DGEMM进行矩阵乘法不能与转置一起使用?

时间:2019-03-01 17:14:51

标签: matrix matrix-multiplication lapack blas cblas

我为使用DGEMM的矩阵乘法编写了以下函数。它使用三个矩阵a,b和c作为双数组,并计算axb = c。 DGEMM使用三个整数rowA,colsB和colsA_rowsB来使用正确的尺寸。 boolean trans应该可以选择在计算中使用矩阵b的转置,特别是axb ^ T = c。

void SvdUtility::getMatrixProduct(double a[], double b[], double c[], int rowsA, int colsA_rowsB, int colsB, bool trans)
{
    if (trans)
    {
        cblas_dgemm(CblasColMajor, CblasNoTrans, CblasTrans, rowsA, colsB, colsA_rowsB, 1, a, rowsA, b, colsA_rowsB, 0, c, rowsA);
    }
    else
    {

        cblas_dgemm(CblasColMajor, CblasNoTrans, CblasNoTrans, rowsA, colsB, colsA_rowsB, 1, a, rowsA, b, colsA_rowsB, 0, c, rowsA);
    }
}

现在,当我使用以下代码测试函数时,当我不进行转置(第一个方法调用)时,它可以正常工作,但是当我进行转置(第二个方法调用)时,我得到** On entry to DGEMM parameter number 8 had an illegal value

double six[] {
    2, 3, 5, 7, 11, 13
};

double four[] {
    2, 3, 5, 7
};

double* test = new double[6];

SvdUtility::getMatrixProduct(six, four, test, 3, 2, 2, false);

SvdUtility::getMatrixProduct(six, four, test, 3, 2, 2, true);

我不明白。转置的矩阵是正方形,因此尺寸应该不是问题。我在哪里错了?

0 个答案:

没有答案