2015-07-27 3 views
1

У меня есть очень простой вопрос - я просто хочу, чтобы умножить две матрицы с комплексными элементами вместе в GSL в C. Так, например, я хочу, чтобы определить функциюкомплекс Умножение матриц с использованием GSL

gsl_matrix_complex *multiply(gsl_matrix_complex *A, gsl_matrix_complex *B) { 
??? 
} 

I» я видел это, когда записи удваиваются, но я не могу понять соответствующее обобщение. Любая помощь будет оценена!

Еще раз спасибо.

+0

Возможный дубликат [gsl complex matrix \ * complex vector] (http://stackoverflow.com/questions/16572823/gsl-complex-matrix-complex-vector) – maxymoo

ответ

2

Чтобы умножить матрицы на 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); 

и затем опустить шаг выделения и явный возврат. Причиной этого является то, что он позволяет свести к минимуму количество распределений кучи, выполняемых вашим кодом, а также затруднить случайную запись кода, который утечки памяти.

Смежные вопросы