我使用 DGEMM 编写了以下矩阵乘法函数。它将三个矩阵 a、b 和 c 作为双精度数组并计算 axb=c。DGEMM 使用三个整数 rowsA、colsB 和 colsA_rowsB 来使用正确的尺寸。Thee 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);
我不明白。转置的矩阵是正方形的,因此尺寸应该不是问题。我哪里错了?