GSL复数矩阵-特征值/特征向量

时间:2018-11-26 10:31:21

标签: c++ numerical-methods gsl

我编写了一个程序,用于计算厄米矩阵的特征值和特征向量。

有人知道如何在GSL中正确完成此操作吗?这是我已经拥有的。

//hermitian matrix
0 1 0 -i
1 0 -i 0
0 i 0 1
i 0 1 0


#include <iostream>
#include <stdio.h>
#include <cmath>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_eigen.h>
using namespace std;
const int N = 4;

int main(){

    gsl_eigen_hermv_workspace *workN = gsl_eigen_hermv_alloc(N);
    gsl_matrix_complex *A = gsl_matrix_complex_alloc(N, N);
    gsl_complex i = gsl_complex_rect(0.0,1.0);
    gsl_complex ii = gsl_complex_rect(0.0,-1.0);
    gsl_vector *eval = gsl_vector_alloc(N);
    gsl_matrix_complex *evec = gsl_matrix_complex_alloc(N, N);


    double mTab[] = { 
    0, 1, 0, 5, 
    1, 0, 5, 0, 
    0, 5, 0, 1,
    5, 0, 1, 0
    };

    gsl_matrix_complex_view tmpM = gsl_matrix_complex_view_array(mTab, N, N);

   gsl_matrix_complex_memcpy(A, &tmpM.matrix);
   gsl_matrix_complex_set(A, 0, 3, ii);
   gsl_matrix_complex_set(A, 1, 2, ii);
   gsl_matrix_complex_set(A, 2, 1, i);
   gsl_matrix_complex_set(A, 3, 0, i);
   gsl_eigen_hermv(A, eval, evec, workN);

   for(int i=0; i < N; i++){
       for(int j=0; j < N; j++){
           gsl_complex z = gsl_matrix_complex_get(A, i, j);
           cout << GSL_REAL(z) << "+ i" << GSL_IMAG(z) << " ";
       }
       cout << "\n";
   }

   cout << "\n";
   for(int i=0; i < N; i++){
       cout << gsl_vector_get(eval, i) << " ";
   }

   return 0;
}   

这就是我输出特征向量的方式

  for(int i=0; i < N; i++){
       for(int j=0; j < N; j++){
           gsl_complex z = gsl_matrix_complex_get(A, i, j);
           cout << GSL_REAL(z) << "+ i" << GSL_IMAG(z) << " ";
       }
       cout << "\n";
   }

最后,这就是我声明有问题的矩阵的方式。

  double mTab[] = { 
    0, 1, 0, 5, 
    1, 0, 5, 0, 
    0, 5, 0, 1,
    5, 0, 1, 0
    };

后来,我添加了复数。

我设法打印出特征向量,但是我不知道如何对特征值进行处理。对此有任何帮助吗?。

1 个答案:

答案 0 :(得分:0)

double mTab中使用gsl_matrix_complex_view_array时出错。假定在一个double值的大型数组中,复数数组表示为实部,后跟虚部。您可以将定义更改为:

double mTab[] = {
0, 0, 1, 0, 0, 0, 5, 0,
1, 0, 0, 0, 5, 0, 0, 0,
0, 0, 5, 0, 0, 0, 1, 0,
5, 0, 0, 0, 1, 0, 0, 0,
};

(这还意味着您不需要使用“虚拟”变量5来稍后再用±i重写它。)然后,用于打印特征值的代码就可以正常工作。

在特征向量打印循环中也有错字:应该是

gsl_complex z = gsl_matrix_complex_get(evec, i, j);

不是

gsl_complex z = gsl_matrix_complex_get(A, i, j);