Matlab, экономия QR-разложения, контроль точности?
E сть [Q,R] = qr(A,0)
функция в Matlab, которая, согласно документации, возвращает "экономную" версию qr-декомпозиции A. norm(A-Q*R)
возвращает ~1e-12 для моего набора данных. Также Q'*Q
должен теоретически возвращать I. На практике есть маленькие ненулевые элементы выше и ниже диагонали (порядка 1e-6 или около того), а также диагональные элементы, которые немного больше 1 (опять же, на 1e-6 или около того), Кто-нибудь знает способ контролировать точность qr(.,0)
или качество (ортогональность) результирующего Q, либо путем указания эпсилона, либо по количеству итераций? Размер набора данных заставляет qr(A) исчерпать память, поэтому я должен использовать qr(A,0).
1 ответ
Когда я пробую неэкономичные настройки, я получаю сопоставимые результаты для AQ*R. Даже для крошечной матрицы, содержащей маленькие числа, как показано здесь:
A = magic(20);
[Q, R] = qr(A); %Result does not change when using qr(A,0)
norm(A-Q*R)
Таким образом, я не верю, что "экономика" - это проблема, подтвержденная @horchler в комментариях, но вы только что наткнулись на пределы точности вычислений с данными типа "double".
Даже если вы как-то измените точность, вы всегда будете иметь дело с приближением, поэтому, возможно, первое, что нужно рассмотреть, - действительно ли вам нужна большая точность, чем у вас уже есть. Если вам нужна большая точность, всегда может быть способ, но я сомневаюсь, что он будет простым.