밀도가 높은 비대칭 행렬 A의 고유 값을 계산하고 있습니다. 그 목적을 위해 먼저 xGEHRD 및 xHSEQR Lapack 루틴을 사용하여 먼저 헤센 버그 형식의 A를 계산 한 다음 얻은 행렬의 고유 값을 계산합니다.고유 값 계산시 xGEHRD 및 xHSEQR 루틴의 WORK 배열 크기가 동일해야합니까?
두 루틴 모두 LWORK 매개 변수가 필요하며 두 매개 변수 모두 최적 값을 계산하는 메커니즘을 제공합니다. 이 매개 변수는 버퍼 기술의 내부 차단과 관련이 있다고 생각하지만 어떻게 결정되는지는 알 수 없습니다. 내가 WORK 배열의 차원에 대해 항상 같은 최적의 값을 취득, 일부 테스트를 수행 한
int LWORK = -1;
float* OPT_LWORK = (float*) malloc(sizeof(float));
sgehrd_ (..., OPT_LWORK ,&LWORK, ...) // query optimal value for sgehrd
LWORK = (int) OPT_WORK
float* WORK = (float*) malloc((int) sizeof(float) * LWORK);
sgehrd_ (..., WORK ,&LWORK, ...) // calculate Hessenberg
int LWORK = -1;
shseqr_ (..., OPT_LWORK ,&LWORK, ...) // query optimal value for shseqr
LWORK = (int) OPT_WORK
float* WORK = // possibly realloc with the new LWORK value
shseqr_ (..., WORK ,&LWORK, ...) // finally obtain eigenvalues
: 같은 워크 플로가 있어야한다 LWORK의 최적 값을 얻기 위해 쿼리 메커니즘을 사용
. 값이 같으면 코드를 훨씬 단순하게 만들 수 있습니다 (realloc이 필요없고 LWORK의 값을 결정할 때 하나의 호출만으로 오류 검사가 줄어 듭니다 ...).
내 질문은 동일한 행렬과 ILO와 IHI의 동일한 값에 대해 입니다. 그 값이 두 루틴과 동일하다고 가정 할 수 있습니까? NB
이
NB = MIN(NBMAX, ILAENV(1, 'SGEHRD', ' ', N, ILO, IHI, -1))
NBMAX=64
입니다