У меня есть этот код для вычисления собственных значений и собственных векторов в 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 верны.