如何使用GSL得到Z * Z ^ T,其中Z是列向量?

时间:2015-04-12 05:59:11

标签: vector multiplication gsl

我正在通过GSL函数来计算Z * Z ^ T,其中Z是n * 1列向量,但我找不到任何拟合函数,非常感谢每一个帮助。

1 个答案:

答案 0 :(得分:1)

GSL支持BLAS(基本线性代数子程序), 见[http://www.gnu.org/software/gsl/manual/html_node/GSL-BLAS-Interface.html][1]

根据操作的复杂程度对功能进行分类:

  • 1级:矢量矢量操作
  • 第2级:矩阵向量运算
  • 第3级:矩阵 - 矩阵运算

对于float,double和复数,大多数函数都有不同的版本。您的操作基本上是矢量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;
}