Я в даний час намагаюся дешево обчислити оцінку хорошого рангу для матриці . Тому я обчислюю стовпчик, що розгортається QR, використовуючи
[Q,R,E]=qr(A)
в Матлабі. Я оцінюю ранг використовуючи
tol = size(A,n)*eps*norm(A,'fro');
r = sum(abs(diag(R))>tol)
Це добре працює, і сюжет над усіма діагональними записами R виглядає так:
Якщо весь алгоритм переносять на C / Fortran, я замінюю [Q, R, E] = qr (A) за допомогою DGEQP3 від LAPACK, який також обчислює стовпчик, що обертає QR-розкладання. Але якщо я використовую ту саму оцінку для ранжу, я здебільшого щось не так. Один і той же сюжет для виробляється з DGEQP3
Вхідна матриця точно однакова для обох експериментів.
Зараз у мене запитання, на яку функцію LAPACK покладається стовпчик, що обертає QR-розкладання від Matlab?
Дякую за будь-яку допомогу, Грисю
Редагувати: DGEQPF дає той самий неправильний результат.
Edit2:
- Вхідна матриця щільна і будується якE + s i g n ( E , F )
- доступний тут: http://www-e.uni-magdeburg.de/makoehle/A.mtx.gz (формат MatrixMarket)
- Неправильно : http://www-e.uni-magdeburg.de/makoehle/R_wrong.mtx.gz
- Я використовував LAPACK 3.4.0 з OpenBlas / GotoBLAS (64 біт)
- Matlab 7, 2007b, 2010b Linux 32bit
Edit3: - За допомогою GDB я з'ясував, що Matlab 2010b викликає DGEQP3: # 3 0xaa46ce2f в dgeqp3_ () з /usr/ubuntu10.04/matlabr2010b/bin/glnx86/../../bin/glnx86/../. ./bin/glnx86/mllapack.so Чому я отримую неправильний результат, використовуючи LAPACK (3.4.0, включаючи виправлення, зазначені в Робочій записці 176)?