【问题标题】:How can I get Z*Z^T using GSL, where Z is column vector?如何使用 GSL 获得 Z*Z^T,其中 Z 是列向量?
【发布时间】:2015-04-12 05:59:10
【问题描述】:

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

【问题讨论】:

    标签: vector multiplication gsl


    【解决方案1】:

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

    函数按操作的复杂程度分类:

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

    对于浮点数、双精度数和复数,大多数函数都有不同的版本。您的操作基本上是向量 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;
    }
    

    【讨论】:

    • 感谢您的回复,但是这个术语 gsl_matrix * Z = gsl_matrix_calloc (n,1);不起作用,我会得到这个术语的错误。你试过吗?似乎 _gsl_matrix 的维度应该至少为 2。
    • @DavoodHajinezhad 我简要地测试了代码。您是否从 gsl 收到明确的错误消息,或者生成的矩阵是否不正确?
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 2018-01-12
    • 2010-10-23
    • 2013-02-26
    • 2015-04-22
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多