[英]Complex Matrix Multiplication using gsl
我有一个非常简单的问题-我只想在C中的gsl中将两个带有复杂条目的矩阵相乘。因此,例如,我想定义一个函数
gsl_matrix_complex *multiply( gsl_matrix_complex *A, gsl_matrix_complex *B ) {
???
}
当条目为双精度时,我已经看到它完成了,但是我无法弄清楚适当的概括。 任何帮助,将不胜感激!
再次感谢。
要在GSL中相乘矩阵,您需要使用略隐晦的BLAS接口 。
假设您要相乘的矩阵没有任何已知的结构(例如,对称或厄米等)。 要使用的适当函数是gsl_blas_zgemm
。 函数名称中看似随机的字母字符串的翻译为:
z = double precision complex
ge = general matrices
mm = matrix-matrix multiplication
(有关所有缩写的列表,请参见此处 )
使用文档中的信息,我们可以将您的函数编写为
#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);
然后省略分配步骤和显式返回。 这样做的原因是它使您可以最大程度地减少代码执行的堆分配数量,并使您更难于意外地编写泄漏内存的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.