Функция LAPACK dgeev не работает при оценке собственных векторов - PullRequest
0 голосов
/ 23 января 2020

У меня есть этот код для вычисления собственных значений и собственных векторов в MEX с библиотекой Лапака:

char *JOBVL="N";
char *JOBVR="V";    

mwSignedIndex LDA, LDVL, LDVR, LWORK, INFO;
LDA = dim;
LDVL = dim;
LDVR = dim;    
LWORK = 4*dim;    

double *Awork, *WR, *WI, *VL, *VR, *WORK;
Awork = (double*)mxCalloc(LDA*dim,sizeof(double));
memcpy(Awork, A, dim*dim*sizeof(double));
WR = (double *)mxCalloc(dim,sizeof(double)); 
WI = (double *)mxCalloc(dim,sizeof(double)); 
VL = (double *)mxCalloc(LDVL*dim,sizeof(double)); 
VR = (double *)mxCalloc(LDVR*dim,sizeof(double)); 
WORK = (double *)mxCalloc(LWORK,sizeof(double)); 

dgeev(JOBVL, JOBVR, &dim, Awork, &LDA, WR, WI, VL, &LDVL, VR, &LDVR, WORK, &LWORK, &INFO);

LWORK = (mwSignedIndex)WORK[0];    
memcpy(Awork, A, dim*dim*sizeof(double));
mxFree(WORK);
WORK = (double *)mxCalloc(LWORK,sizeof(double)); 

dgeev(JOBVL, JOBVR, &dim, Awork, &LDA, WR, WI, VL, &LDVL, VR, &LDVR, WORK, &LWORK, &INFO);
LWORK = (mwSignedIndex)WORK[0];    
memcpy(Awork, A, dim*dim*sizeof(double));
mxFree(WORK);
WORK = (double *)mxCalloc(LWORK,sizeof(double)); 

dgeev(JOBVL, JOBVR, &dim, Awork, &LDA, WR, WI, VL, &LDVL, VR, &LDVR, WORK, &LWORK, &INFO);

mxFree(Awork);
mxFree(WR);
mxFree(WI);    
mxFree(VL);
mxFree(VR);
mxFree(WORK);

memcpy(AvaW, WR, dim*sizeof(double));
memcpy(AveW, VR, dim*dim*sizeof(double));

Где AvaW и AveW - выходные собственные значения и собственные векторы соответственно.

Моя проблема: у меня есть входная матрица A. Когда A = H (H - несимметричная c нормальная матрица размерности NxN), dgeev работает хорошо. Я сравнил с функцией EIG Matlab и функцией F (AvaW, AveW), что я знаю правильный результат. Но когда A = M, где M:

M = [H I;
     Z Z];

I = матрица глаза, Z - это матрица нулей, а M - квадратная матрица размера 2Nx2N. В этом случае dgeev хорошо работает для вычисления собственных значений, но в другом порядке, чем Matlab (AvaW (1: N) = AvaMatlab (N + 1: 2N) и AvaW (N + 1: 2N) = AvaMatlab (1: N)). Вычисление автовекторов с использованием dgeev неверно, не совпадает с автовекторами Matlab, а результат f (AvaW, AveW) неверен.

Кто-нибудь знает, в чем проблема?

Большое спасибо, привет.

PD: Во всех случаях значение INFO равно 0, это означает, что решение является правильным. И я проверяю, что матрицы M и H верны.

1 Ответ

0 голосов
/ 31 января 2020

Проблема заключалась в том, что I-матрица и Z-матрица (слева внизу) располагались в точке M. Назначение было неправильным из-за ошибки в индексах. Это не было проблемой функции dgeev.

Код для создания M, который хорошо работает:

 for(i=0; i<ny; i++){
    for(j=0; j<ny; j++){
        M[2*i*ny+j] = A[i*ny+j];
        M[2*i*ny+ny+j] = Z[i*ny+j];            
        M[2*ny*ny+2*i*ny+j] = Ipos[i*ny+j];             
        M[2*ny*ny+2*i*ny+ny+j] = Z[i*ny+j];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...