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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top