【发布时间】:2014-02-26 14:57:59
【问题描述】:
我正在尝试使用 C 中 BLAS 库的 zgemm 函数将复数向量乘以复数矩阵。
这是我正在使用的代码:
void dot(complexArray* mat1, char transa, complexArray* mat2, char transb, complexArray* out)
{
ptrdiff_t m = (ptrdiff_t)mat1->m;
ptrdiff_t n = (ptrdiff_t)mat2->n;
ptrdiff_t k = (ptrdiff_t)mat1->n;
ptrdiff_t lda = (ptrdiff_t)mat1->m;
ptrdiff_t ldb = (ptrdiff_t)mat2->m;
ptrdiff_t ldc = (ptrdiff_t)out->m;
//scalar factors
double alpha[2] = {1,0};
double beta[2] = {0,0};
//BLAS routine for complex matrix multiplication
zgemm(&transa, &transb, &m, &n, &k, alpha, mat1->data, &lda, mat2->data,
&ldb, beta, out->data, &ldc);
}
complexArray 结构体定义如下:
typedef struct
{
double* data;
size_t m;
size_t n;
} complexArray;
但是,如果我调用点函数
dot(array1, 'C', array2, 'N', resultArray);
其中 array1.m == r,array1.n == 1 和 array2.m == array2.n == r,我收到类似的东西
216692908932268360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000 + 4451969616001722900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0000i
由于对变量 transa(当然对于不同形状的向量/矩阵组合)也使用带有参数“N”的相同函数,我担心我误解了 transa 参数。有什么提示可以定位错误吗?
【问题讨论】:
-
并且
out的data已正确分配? -
我会这么说:所有 complexArray 数据都以相同的方式分配:$data = (double*)mxMalloc(2*m*n*sizeof(double));$.在这种情况下,m==n==1;因此,为了存储结果的实部和虚部,分配了一个具有两个字段的双精度数组。
标签: c matrix-multiplication complex-numbers blas