【发布时间】:2015-04-12 05:59:10
【问题描述】:
我正在查看 GSL 函数来计算 Z*Z^T,其中 Z 是 n*1 列向量,但我找不到任何拟合函数,非常感谢您的帮助。
【问题讨论】:
标签: vector multiplication gsl
我正在查看 GSL 函数来计算 Z*Z^T,其中 Z 是 n*1 列向量,但我找不到任何拟合函数,非常感谢您的帮助。
【问题讨论】:
标签: vector multiplication gsl
GSL 支持 BLAS(基本线性代数子程序), 见 [http://www.gnu.org/software/gsl/manual/html_node/GSL-BLAS-Interface.html][1].
函数按操作的复杂程度分类:
对于浮点数、双精度数和复数,大多数函数都有不同的版本。您的操作基本上是向量 Z 与自身的外积。 您可以将向量初始化为列向量(此处为双精度数字):
gsl_matrix * Z = gsl_matrix_calloc (n,1);
然后使用BLAS函数gsl_blas_dgemm计算 Z * Z^T。这个函数的第一个参数决定了输入矩阵是否应该在矩阵乘法之前转置:
gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1.0, Z, Z, 0.0, C);
这是一个有效的测试程序(您可能需要将它与 gsl 和 blas 链接):
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
int main(int argc, char ** argv)
{
size_t n = 4;
gsl_matrix * Z = gsl_matrix_calloc (n,1);
gsl_matrix * C = gsl_matrix_calloc (n,n);
gsl_matrix_set(Z,0,0,1);
gsl_matrix_set(Z,1,0,2);
gsl_matrix_set(Z,2,0,0);
gsl_matrix_set(Z,3,0,1);
gsl_blas_dgemm (CblasNoTrans,
CblasTrans, 1.0, Z, Z, 0.0, C);
int i,j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf ("%g\t", gsl_matrix_get (C, i, j));
}
printf("\n");
}
gsl_matrix_free(Z);
gsl_matrix_free(C);
return 0;
}
【讨论】: