Чтобы умножить матрицы на GSL, вам нужно использовать слегка загадочный BLAS interface.
Предполагая, что матрицы, которые вы собираетесь размножать, не имеют какой-либо известной структуры (например, симметричны или эрмиты и т. Д.). Соответствующей функцией будет gsl_blas_zgemm
. Перевод, казалось бы, случайная последовательность букв в имени функции является:
z = double precision complex
ge = general matrices
mm = matrix-matrix multiplication
(Список всех аббревиатуры см here)
Используя информацию, содержащуюся в документации, мы могли бы написать функцию
#include <gsl/gsl_blas.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_complex_math.h>
gsl_matrix_complex *multiply(gsl_matrix_complex *A, gsl_matrix_complex *B)
{
gsl_matrix_complex *result = gsl_matrix_complex_alloc(A->size1, B->size2);
gsl_blas_zgemm(CblasNoTrans, CblasNoTrans,
GSL_COMPLEX_ONE, A, B,
GSL_COMPLEX_ZERO, result);
return result;
}
Обратите внимание, что вместо того, чтобы выделить матрицы результата в функции умножения было бы вместо того, чтобы быть лучше практика, чтобы пройти в один, который уже был выделен в вызывающей функции, например, с подписью:
void multiply*(gsl_matrix_complex *A, gsl_matrix_complex *B, gsl_matrix_complex *result);
и затем опустить шаг выделения и явный возврат. Причиной этого является то, что он позволяет свести к минимуму количество распределений кучи, выполняемых вашим кодом, а также затруднить случайную запись кода, который утечки памяти.
Возможный дубликат [gsl complex matrix \ * complex vector] (http://stackoverflow.com/questions/16572823/gsl-complex-matrix-complex-vector) – maxymoo