Я пишу код C, в котором мне нужно получить собственные векторы и собственные значения эрмитовой матрицы. Для этого я использую подпрограмму Жеева. Раньше мне нужно было вычислять только собственные значения, и ниже приведены соответствующие фрагменты кода для этого:
1.
extern void zheev_(
unsigned char *JOBZ,
unsigned char * UPLO,
int *N,
complex double *A,
int *LDA,
double *W,
complex double *WORK,
int *LWORK,
double *RWORK,
int *INFO );
Это было определение подпрограммы, которое я использовал для ввода.
2.
void Diagonalize_eval(complex double *H,int dim, double *W)
unsigned char JOBZ, UPLO;
int N, LDA, LWORK, INFO;
JOBZ='N';
UPLO ='U';
N=dim;
LDA=N;
complex double *WORK=NULL;
LWORK=-1;
WORK=(complex double*)malloc(sizeof(complex double)*3);
double *RWORK=(double*)malloc(sizeof(double)*(3*dim-2));
zheev_( &JOBZ, &UPLO, &N, H, &LDA, W, WORK, &LWORK, RWORK, &INFO );
LWORK=(int)(WORK[0]);
free(WORK);
WORK=(complex double*)malloc(sizeof(complex double)*LWORK);
zheev_( &JOBZ, &UPLO, &N, H, &LDA, W, WORK, &LWORK, RWORK, &INFO );
free(WORK); free(RWORK);
Это была функция, которую я использовал для получения собственных значений.
3.
double *E=( double*)malloc(sizeof(double)*V);
Diagonalize_eval(H,V,E);
И, наконец, я получил собственные значения Вот. Здесь H - это эрмитова матрица VxV.
Я знаю, что мне нужно изменить 'N' на 'V' в значении JOBZ, чтобы получить собственные векторы, но как мне изменить функцию Diagonalize_eval (или написать новый отдельный функция), чтобы получить собственные векторы? Дополнительный вопрос: ортонормированы ли собственные векторы, созданные Жеевым?