La opción de transposición conjugada de ZGEMM no parece funcionar
-
21-12-2019 - |
Pregunta
Estoy tratando de multiplicar un vector complejo a una matriz compleja utilizando la función ZGEMM de la Biblioteca Blas en c.
Este es el código que estoy usando:
void dot(complexArray* mat1, char transa, complexArray* mat2, char transb, complexArray* out)
{
ptrdiff_t m = (ptrdiff_t)mat1->m;
ptrdiff_t n = (ptrdiff_t)mat2->n;
ptrdiff_t k = (ptrdiff_t)mat1->n;
ptrdiff_t lda = (ptrdiff_t)mat1->m;
ptrdiff_t ldb = (ptrdiff_t)mat2->m;
ptrdiff_t ldc = (ptrdiff_t)out->m;
//scalar factors
double alpha[2] = {1,0};
double beta[2] = {0,0};
//BLAS routine for complex matrix multiplication
zgemm(&transa, &transb, &m, &n, &k, alpha, mat1->data, &lda, mat2->data,
&ldb, beta, out->data, &ldc);
}
La estructura de complejo se define de la siguiente manera:
typedef struct
{
double* data;
size_t m;
size_t n;
} complexArray;
Sin embargo, si llamo a la función DOT por
dot(array1, 'C', array2, 'N', resultArray);
Dónde Array1.m== R, Array1.N== 1 y Array2.m== Array2.n== R, recibo algo como
216692908932268360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000 + 4451969616001722900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000i
Dado que usando la misma función con el argumento 'n' también para la transa variable (por supuesto para combinaciones vectoriales / matriz de forma diferente), me preocupa que haya entendido mal el parámetro Transa.¿Algún sugerencia donde se podría localizar el error?
Solución
De acuerdo, creo que he encontrado la respuesta en la documentación de Fortran de la función BLAS (ver, por ejemplo, Documentación DGEMM :
Los parámetros M, N y K (en mi caso M, N y K) no se refieren a las filas y columnas de las matrices originales, sino a las matrices finalmente usadas, es decir, las transacciones o las conjugadas.Por lo tanto, si usa la opción 'T' o 'C' para el argumento Transa o Transb, asegúrese de intercambiar M y N o N y K, respectivamente.