Я вычисляю собственные значения плотной несимметричной матрицы А. Для этой цели я использую xGEHRD и xHSEQR Лакпатные подпрограммы, чтобы сначала вычислить верхнюю гессенбергскую форму А, а затем вычислить только собственные значения полученной матрицы.Должен ли размер массива WORK в процедурах xGEHRD и xHSEQR быть равен при вычислении собственных значений?
Для обеих подпрограмм требуется параметр LWORK, и оба обеспечивают механизм для вычисления его оптимального значения. Я считаю, что этот параметр связан с внутренней блокировкой буферной техники, но я не знаю, как это определяется.
Используя механизм запросов, чтобы получить оптимальное значение LWORK рабочий процесс должен быть как:
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
Я сделал некоторые испытания, получение всегда одни и те же оптимальные значения для размерности массива WORK. Если бы значения были одинаковыми, я мог бы значительно упростить мой код (нет необходимости в realloc и только один вызов для определения значения LWORK, меньше проверки ошибок ...).
Мой вопрос: для той же матрицы и тех же значений ILO и IHI, могу ли я предположить, что значения будут равны обеим процедурам?