使用 gsl 的复杂矩阵乘法
Complex Matrix Multiplication using gsl
我有一个非常简单的问题——我只想在 C 语言的 gsl 中将两个具有复杂条目的矩阵相乘。例如,我想定义一个函数
gsl_matrix_complex *multiply( gsl_matrix_complex *A, gsl_matrix_complex *B ) {
???
}
我见过当条目是双倍时完成的,但我想不出适当的概括。如有任何帮助,我们将不胜感激!
再次感谢。
要在 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);
然后省略分配步骤和显式return。这样做的原因是它允许您最大限度地减少代码执行的堆分配次数,并使您更难意外编写泄漏内存的代码。
我有一个非常简单的问题——我只想在 C 语言的 gsl 中将两个具有复杂条目的矩阵相乘。例如,我想定义一个函数
gsl_matrix_complex *multiply( gsl_matrix_complex *A, gsl_matrix_complex *B ) {
???
}
我见过当条目是双倍时完成的,但我想不出适当的概括。如有任何帮助,我们将不胜感激!
再次感谢。
要在 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);
然后省略分配步骤和显式return。这样做的原因是它允许您最大限度地减少代码执行的堆分配次数,并使您更难意外编写泄漏内存的代码。