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

Vector 如何使用GSL获得Z*Z^T,其中Z是列向量?,vector,multiplication,gsl,Vector,Multiplication,Gsl,我正在查找GSL函数来计算Z*Z^T,其中Z是n*1列向量,但我找不到任何拟合函数,非常感谢您的帮助 GSL支持BLAS(基本线性代数子程序), 见[ 功能按操作的复杂性分类: 第1级:向量运算 第2级:矩阵向量运算 第3级:矩阵运算 对于浮点数、双数和复数,大多数函数都有不同的版本。您的操作基本上是向量Z的外积。 可以将向量初始化为列向量(此处为双精度数字): 然后使用BLAS函数gsl_BLAS_dgemm进行计算 Z*Z^T。此函数的第一个参数确定在矩阵乘法之前是否应转置输入矩阵:

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

GSL支持BLAS(基本线性代数子程序), 见[

功能按操作的复杂性分类:

  • 第1级:向量运算
  • 第2级:矩阵向量运算
  • 第3级:矩阵运算
对于浮点数、双数和复数,大多数函数都有不同的版本。您的操作基本上是向量Z的外积。 可以将向量初始化为列向量(此处为双精度数字):

然后使用BLAS函数gsl_BLAS_dgemm进行计算 Z*Z^T。此函数的第一个参数确定在矩阵乘法之前是否应转置输入矩阵:

 gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1.0, Z, Z, 0.0, C);
这是一个有效的测试程序(您可能需要将其与gsl和blas链接起来):

#包括
#包括
int main(int argc,字符**argv)
{
尺寸n=4;
gsl_矩阵*Z=gsl_矩阵(n,1);
gsl_矩阵*C=gsl_矩阵(n,n);
gsl_矩阵_集(Z,0,0,1);
gsl_矩阵_集(Z,1,0,2);
gsl_矩阵_集(Z,2,0,0);
gsl_矩阵_集(Z,3,0,1);
gsl_blas_dgemm(CblasNoTrans,
CblasTrans,1.0,Z,Z,0.0,C);
int i,j;
对于(i=0;i
感谢您的回复,但这个术语gsl_matrix*Z=gsl_matrix\u calloc(n,1);不起作用,我会得到一个关于这个术语的错误。你试过吗?似乎对于_gsl_矩阵,维度应该至少为2。@DavoodHajinezhad我简要地测试了代码。你从gsl得到了明确的错误消息,还是得到的矩阵不正确?
 gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1.0, Z, Z, 0.0, C);
#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;
}