繁体   English   中英

使用gsl的复数矩阵乘法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM