Matrix 为什么使用DGEMM的矩阵乘法不适用于转置?

Matrix 为什么使用DGEMM的矩阵乘法不适用于转置?,matrix,matrix-multiplication,lapack,blas,cblas,Matrix,Matrix Multiplication,Lapack,Blas,Cblas,我已经使用DGEMM编写了以下矩阵乘法函数。它将三个矩阵a、b和c作为双数组,并计算axb=c。DGEMM使用三个整数rowsA、colsB和colsA_rowsB来使用正确的尺寸。布尔trans应该提供在计算中使用矩阵b的转置的选项,特别是axb^T=c void SvdUtility::getMatrixProduct(double a[], double b[], double c[], int rowsA, int colsA_rowsB, int colsB, bool trans)

我已经使用DGEMM编写了以下矩阵乘法函数。它将三个矩阵a、b和c作为双数组,并计算axb=c。DGEMM使用三个整数rowsA、colsB和colsA_rowsB来使用正确的尺寸。布尔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);
    }
}
现在,当我用下面的代码测试我的函数时,当我不转置(第一个方法调用)时,它可以正常工作,但当我转置(第二个方法调用)时,我在进入DGEMM参数8时得到了一个非法值

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);

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

出于好奇,因为我没有立即看到错误,如果您以相反的顺序运行这两个产品,即先运行6*4^t,然后再运行6*4,会发生什么。无论如何,这里是我的C++代码,它是运行的,是经过战斗测试的,并且所有的预测器都是复杂的和真实的:也许你能找到错误。<代码>参数8 当然是代码> ROSASA 。所以当你转置B时,你的错误看起来是很奇怪的。您链接的是哪种实现?出于好奇,我没有立即看到错误,如果您以相反的顺序运行这两个产品,即先运行6*4^t,然后运行6*4,会发生什么情况。无论如何,这里是我的C++代码,它是运行的,是经过战斗测试的,并且所有的预测器都是复杂的和真实的:也许你能找到错误。<代码>参数8 当然是代码> ROSASA 。所以当你转置B时,你的错误看起来是很奇怪的。您将链接到哪个实现?