QR-код LAPACK хранит Q в качестве отражателей для домохозяев. Он масштабирует вектор отражения с , поэтому первый элемент результата становится , поэтому его не нужно сохранять. И он хранит отдельный вектор , который содержит необходимые масштабные коэффициенты. Таким образом, матрица отражателя выглядит так:
где не нормируется. В то время как в учебниках матрица отражателей
где нормализуется.
Почему LAPACK масштабирует с вместо его нормализации?
Необходимое хранилище остается тем же (вместо , должно быть сохранено), и после этого применение может быть выполнено быстрее, так как нет необходимости умножать на (умножение на в версии учебника можно оптимизировать, если вместо простой нормализации масштабируется как ).
(Причина моего вопроса в том, что я пишу процедуру QR и SVD, и я хотел бы знать причину этого решения, нужно ли мне следовать этому или нет)
Вам не нужно хранить , вы можете пересчитать его из оставшейся части вектора. (Вы можете пересчитать из других записей также в нормализованной версии, но это явно нестабильное вычисление из-за этих вычитаний.)τ v1
На самом деле, вы можете повторно использовать нижнюю треугольную часть для хранения , так что факторизация вычисляется полностью на месте. Лапак заботится об этих версиях алгоритмов на месте.р v2, . , ,vN
источник
Мое предложение основано на документации для Intel MKL https://software.intel.com/en-us/mkl-developer-reference-c-geqrf . Это выглядит как значения на и выше диагонали выходного хранилища R, поэтому для Q остается только нижний треугольник. Кажется естественным использовать дополнительное хранилище для коэффициентов масштабирования.
источник