Почему умножение моей матрицы с использованием DGEMM не работает с транспонированием? - PullRequest
0 голосов
/ 01 марта 2019

Я написал следующую функцию для умножения матриц с использованием DGEMM.Он принимает три матрицы a, b и c как двойные массивы и вычисляет axb = c.Три целых числа rowA, colsB и colsA_rowsB используются DGEMM для использования правильных размеров.Предполагается, что булево значение 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);

Я не понимаю.Матрица, которая транспонируется, является квадратной, поэтому размеры не должны быть проблемой.Где я не прав?

...